본문 바로가기

OpenCV-Python

OpenCV Python 히스토그램 분석

히스토그램 : 영상의 픽셀값 분포를 그래프의 형태로 표현한 것

 

cv2.calcHist(images, channel, mask, histSize, ranges [, hist [, accumulate]]) [] : 생략 가능

 

images : 입력 영상 - 리스트 형식[]
channels : 히스토그램 구할 채널을 나타내는 리스트 [0], [0,1], [0,1,2] 

GRAYSCALE 영상에선 [0]
BGR 영상에선 [0] : B, [1] : G, [2] : R 이 되겠네요

mask : 마스크 영상, 입력 영상 전체에 히스토그램 구하려면 None
histSize : 히스토그램 각 차원의 크기를 나타내는 리스트 

64로 하면 0~3, 4~7 이런 식으로 4개씩 묶여 64개
128로 하면 0~1, 2~3 이런 식으로 2개씩 묶여 128개로 표현됩니다.

ranges : 히스토그램 각 차원의 최솟값, 최댓값으로 구성된 리스트 

hist : 계산된 히스토그램(numpy.ndarray)
accumulate : 기존의 hist 히스토그램에 누적하려면 True, 새로 만들려면 False

import cv2
import matplotlib.pyplot as plt

src = cv2.imread('imgs/dog.jpg', cv2.IMREAD_GRAYSCALE)

hist = cv2.calcHist([src], [0], None, [
                    256], [0, 256])

cv2.imshow('src', src)
cv2.waitKey(1)

plt.plot(hist)
plt.show()

cv2.destroyAllWindows()
사진이 여러개일 때 리스트 형식으로 묶어주세요 

img = [src1, src2]

for i in img:
    hist = cv2.calcHist([i], [0], None, [
        256], [0, 256])
    plt.plot(hist)


import cv2
import matplotlib.pyplot as plt

src1 = cv2.imread('imgs/dog.jpg')

color = ['b', 'g', 'r']

channel = cv2.split(src1)

for (i, j) in zip(channel, color):
    hist = cv2.calcHist([i], [0], None, [
        256], [0, 256])
    plt.plot(hist, color=j)

cv2.imshow('src1', src1)
cv2.waitKey(1)

plt.show()
cv2.destroyAllWindows()

컬러 영상에선 cv2.split을 통해서 채널을 분할하여 각 채널을 표현했습니다.

cv2.split 함수는 채널을 분리하는 함수로 b, g, r 채널을 리스트 형식으로 분리합니다.

※ 혹시나 No module named 'matplotlib' 오류가 나타난다면 pip install matplotlib으로 설치해주세요