본문 바로가기
OpenCV

OpenCV 영상처리 - 히스토그램 분석(cv2.calcHist)

by Kwonys 2024. 3. 18.
728x90
반응형

히스토그램

  • 영상의 픽셀 값 분포를 그래프의 형태로 표현한 것
  • 예를 들어, 그레이스케일 영상에서 각 그레이스케일 값에 해당하는 픽셀의 개수를 구하고, 이를 막대 그래프의 형태로 표현

정규화된 히스토그램(Normalized histogram)

  • 각 픽셀의 개수를 영상 전체 픽셀 개수로 나누어준 것
  • 해당 그레이스케일 값을 갖는 픽셀이 나타날 확률

영상과 히스토그램의 관계

파란 동그라미  : 검정 /  주황 동그라미 : 밝은 회색

 

히스토그램을 보고 그림의 대략적인 밝기를 알 수 있다.

히스토그램 구하기

cv2.calcHist(images, channels, mask, histSize, ranges, hist=None, accumulate=None) -> dst
  • images : 입력 영상 리스트
  • channels : 히스토그램을 구할 채널을 나타내는 리스트
  • mask : 마스크 영상. 입력 영상 전체에서 히스토그램을 구하려면 None을 지정.
  • histSize : 히스토그램 각 차원의 크기(빈(bin)의 개수)를 나타내는 리스트
  • ranges : 히스토그램 각 차원의 최솟값과 최댓값으로 구성된 리스트
  • hist : 계산된 히스토그램(numpy.ndarray)
  • accumulate : 기존의 hist 히스토그램에 누적하려면 True, 새로 만들려면 False

그레이스케일 영상의 히스토그램 구하기

src = cv2.imread('lenna.bmp', cv2.IMREAD_GRAYSCALE)
# cv2.calcHist(images, channels, mask, histSize, ranges, hist=None, accumulate=None) -> dst
hist = cv2.calcHist([src], [0], None, [256], [0, 256])
plt.plot(hist)
plt.show()

컬러 영상의 히스토그램 구하기

src = cv2.imread('lenna.bmp')
colors = ['b', 'g', 'r']
bgr_planes = cv2.split(src)

for (p, c) in zip(bgr_planes, colors):
	hist = cv2.calcHist([src], [0], None, [256], [0, 256])
    plt.plot(hist, color=c)

plt.show()

* zip 함수 이해가 잘 되지 않으면 글 아래 간단한 예시가 있음.

OpenCV 그리기 함수로 그레이스케일 영상의 히스토그램 나타내기

def getGrayHistImage(hist):
    imgHist = np.full((100, 256), 255, dtype=np.uint8)
    
    histMax = np.max(list)
    for x in range(256):
        pt1 = (x, 100)
        pt2 = (x, 100 - int(hist[x, 0] * 100 / histMax))
        cv2.line(imgHist, pt1, pt2, 0)
    
    return imgHist

src = cv2.imread('lenna.bmp', cv2.IMREAD_GRAYSCALE)
hist = cv2.calcHist([src], [0], None, [256], [0, 256])
histImg = getGrayHistImage(hist)

 

* zip 함수 이해를 돕기 위한 간단한 예시

>>> numbers = [1, 2, 3]
>>> letters = ["A", "B", "C"]
>>> for pair in zip(numbers, letters):
...     print(pair)
...
(1, 'A')
(2, 'B')
(3, 'C')
728x90
반응형