본문 바로가기
Image Processing (Python)

Histogram Equalization (히스토그램 균일화)

by HanByol Jang 2021. 12. 6.
728x90

함수 설명

이미지의 픽셀값 분포가 특정값에 몰여있다면 그 부분에 대해 눈으로 구별하기 어렵고 이를 contrast가 낮다고 표현합니다. 반면에 픽셀값 분포가 촘촘히 몰려있지 않고 골고루 분포해 있다면 구별하기 쉬워지고 이를 contarst가 높다고 합니다.

 

Histogram equalization 함수는 몰려있는 히스토그램을 균일하게 퍼트림으로써 이미지의 contrast를 개선하는 방법입니다.

Histogram Equalization (from widipedia)


코드 설명

python OpenCV 라이브러리를 사용하였습니다.

 

cv2.equalizeHist(src)

1) src : 바꾸고 싶은 source 이미지

* Grayscale인 1channel 이미지만 가능합니다.


예제

Histogram을 균일하게 만들어주는 예제입니다.

Color 이미지의 경우 YCrCb로 변환후 밝기에 해당하는 Y에 함수 적용후 다시 RGB 이미지로 변환시켜줍니다.

import cv2
import matplotlib.pyplot as plt
from skimage import io


# main function
def histogram_equal(image):
    # Color image
    if len(image.shape) == 3:
        ycrcb_array = cv2.cvtColor(image, cv2.COLOR_RGB2YCrCb)
        y, cr, cb = cv2.split(ycrcb_array)
        merge_array = cv2.merge([cv2.equalizeHist(y), cr, cb])
        output = cv2.cvtColor(merge_array, cv2.COLOR_YCrCb2RGB)
    # Gray image
    else:
        output = cv2.equalizeHist(image)
    return output

# Image Load
image = io.imread('dark.jpg')
output1 = histogram_equal(image)

# gray image
gray_img = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
output2 = histogram_equal(gray_img)

# view
plt.subplot(2,2,1)
plt.title('Color Original')
plt.axis('off')
plt.imshow(image)

plt.subplot(2,2,2)
plt.title('Color After')
plt.axis('off')
plt.imshow(output1)

plt.subplot(2,2,3)
plt.title('Gray Original')
plt.axis('off')
plt.imshow(gray_img, cmap='gray')

plt.subplot(2,2,4)
plt.title('Gray After')
plt.axis('off')
plt.imshow(output2, cmap='gray')
plt.show()

# histogram
plt.subplot(2,1,1)
plt.title('Gray Histogram')
plt.hist(gray_img.ravel(), bins=16)
plt.subplot(2,1,2)
plt.title('After Histogram')
plt.hist(output2.ravel(), bins=16)
plt.subplots_adjust(hspace=0.5)
plt.show()

이미지의 어두웠던 영역이 histogram equalization 후 구분이 가능한 것을 볼 수 있습니다.

 

Gray 이미지의 히스토그램을 보면 어두운쪽에 pixel이 많이 몰려있는 것을 볼 수 있습니다. Histogram equalization 함수 적용 후 히스토그램이 골고루 퍼져있는 것을 볼 수 있습니다.

728x90

'Image Processing (Python)' 카테고리의 다른 글

Contrast Limited Adaptive Histogram Equalization (CLAHE)  (0) 2021.12.14
Edge Detection (윤곽선 검출)  (0) 2021.12.01
Rotate (회전)  (0) 2021.11.24
Denoising (non-local)  (0) 2021.11.23
Color Space Change (색공간 변경)  (0) 2021.11.22

댓글