Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 영상의 히스토그램 분석하기 - cv2.calcHist

AI 꿈나무 2020. 9. 28. 15:02
반응형

황선규 박사님의 OpenCV 강의를 공부하면서 정리하였습니다.

 


영상의 히스토그램 분석하기

 히스토그램(Histogram)은 영상의 픽셀 값 분포를 그래프의 형태로 표현한 것입니다.

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

 

 정규화된 히스토그램(Normalized histogram)은 각 픽셀의 개수를 영상 전체 픽셀 개수로 나누어 준 것입니다.

 해당 그레이스케일 값을 갖는 픽셀이 나타날 확률을 의미합니다.

 

1. 영상과 히스토그램의 관계

 밝은 영상이면 히스토그램이 전체적으로 오른쪽으로 치우쳐져 있습니다.

 어두운 영상이면 히스토그램이 왼쪽으로 치우쳐져 있습니다.

 명암비가 확실한 영상이면 히스토그램이 전체적으로 분포해 있습니다.

 

 영상의 히스토그램을 보고 영상의 특징을 알 수 있습니다.

 

2. OpenCV로 히스토그램 구하기 - cv2.calcHist

 OpenCV에서 제공하는 cv2.calcHist() 함수로 히스토그램을 구할 수 있습니다.

 

[함수 설명]

cv2.calcHist(images, channels, maskm histSize, ranges, hist=None, accumulate=None) -> hist

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

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

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

if src is None:
    print('Image load failed!')
    sys.exit()
    
# 그레이스케일 [0], BG [0,1], BGR [0,1,2]
hist = cv2.calcHist([src], [0], None, [256], [0,256]) # 꼭 리스트 형태로 입력

cv2.imshow('src', src)
cv2.waitKey(1)  # 1로 설정한 이유는 다음 matplot 명령어를 실행시키기 위함. 창은 사라지지 않음

plt.plot(hist)
plt.show()

 흑백 영상의 히스토그램을 확인할 수 있습니다.

 

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

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

if src is None:
    print('Image load failed!')
    sys.exit()

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)

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

plt.show()

 컬러 영상의 히스토그램을 확인할 수 있습니다.

 히스토그램을 보았을 때 빨강색 픽셀의 값이 높다는 것을 확인할 수 있습니다.

 

반응형