컴퓨터 비전

히스토그램 (Histogram)

Jooyoung Lee 2022. 12. 28. 07:30

▶ OpenCV Python 관련 글은 황선규 박사님의 강의내용을 정리하였음.

Histogram

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

$$ h(g) = N_g $$

 


Normalized histogram

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

\( p(g) = \frac{N_g}{w\times h} \)         \(\displaystyle \sum _{g=0} ^{L-1} {p(g) = 1}\)


히스토그램 구하기

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

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

src = cv2.imread('lenna.bmp', cv2.IMREAD_GRAYSCALE)

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([p], [0], None, [256], [0, 256])
    plt.plot(hist, color=c)

plt.show()

출력 결과 값

 

OpenCV 그리기 함수로 그레이스케일 영상 히스토그램 구하기

def getGrayHistImage(hist):
	imgHist = np.full((100, 256), 255, dtype=np.uint8)
    
	histMax = np.max(hist)
	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)

출력 결과 값