Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 OpenCV로 배우는 히스토그램 평준화(Histogram Equalization)


히스토그램 평준화(Histogram Equalization)는 이미지의 히스토그램을 활용하여 명암 대비(contrast)를 조절하는 대표적인 이미지 처리 기법입니다.

이 기법은 일반적으로 많은 이미지에서 전체적인(global) 명암 대비를 높여 주는 효과가 있습니다. 특히 이미지의 유효 데이터가 좁은 명암 값 범위에 몰려 있을 때 유용하며, 평준화 과정을 통해 픽셀 강도(intensity) 값들이 히스토그램 전반에 더 고르게 재분배됩니다. 그 결과, 원래는 대비가 낮았던 국소 영역들도 훨씬 선명한 대비를 갖게 됩니다.

OpenCV는 이 작업을 위한 전용 함수인 cv2.equalizeHist()를 제공합니다. 입력값은 그레이스케일 이미지 하나뿐이며, 출력으로는 히스토그램이 평준화된 이미지를 반환합니다.

적합한 사용 사례와 한계

이 기법은 이미지의 히스토그램이 특정 영역에 집중되어 있을 때 가장 좋은 결과를 보여줍니다. 반면, 밝은 픽셀과 어두운 픽셀이 동시에 존재하는 등 강도 변화가 크고 히스토그램이 넓은 범위에 걸쳐 있는 이미지에는 적합하지 않으며, 오히려 노이즈가 증폭되거나 부자연스러운 결과가 나올 수 있습니다.

참고: CLAHE를 활용한 개선

이러한 한계를 보완하려면 이미지를 작은 타일(tile) 단위로 나누어 각각 평준화를 적용하는 CLAHE(Contrast Limited Adaptive Histogram Equalization)를 사용할 수 있습니다. OpenCV에서는 cv2.createCLAHE() 함수로 손쉽게 구현할 수 있으며, 과도한 대비 증가를 제한하여 더 자연스러운 결과를 얻을 수 있습니다.

입력 이미지

파이썬 OpenCV로 배우는 히스토그램 평준화(Histogram Equalization)

예제 코드

import cv2
# import Numpy
import numpy as np
# reading an image using imreadmethod
my_img = cv2.imread('C:/Users/TP/Pictures/west bengal/bishnupur/pp.jpg', 0)
equ = cv2.equalizeHist(my_img)
# stacking both the images side-by-side orientation
res = np.hstack((my_img, equ))
# showing image input vs output
cv2.imshow('image', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

코드 설명

cv2.imread()의 두 번째 인자를 0으로 지정하면 이미지가 그레이스케일로 불러와집니다. 이후 cv2.equalizeHist()로 평준화를 수행하고, NumPy의 np.hstack()을 사용해 원본 이미지와 결과 이미지를 좌우로 나란히 붙여 한 번에 비교할 수 있습니다.

출력 결과

파이썬 OpenCV로 배우는 히스토그램 평준화(Histogram Equalization)