[python] 이미지 히스토그램 평활화하기

이미지 히스토그램 평활화는 이미지를 대조를 높이고 세부적인 정보를 강조하여 더 선명하고 균일한 이미지로 바꾸는 과정입니다. 이 기술은 컴퓨터 비전, 디지털 이미지 처리 및 컴퓨터 그래픽스 분야에서 널리 사용됩니다.

히스토그램 평활화 알고리즘

히스토그램 평활화는 다음과 같은 단계로 구성됩니다:

  1. 입력 이미지의 히스토그램을 계산합니다.
  2. 히스토그램의 누적 분포 함수(CDF, Cumulative Distribution Function)를 계산합니다.
  3. CDF를 정규화하여 모든 픽셀 값 범위에 대한 변환이 가능한 함수로 만듭니다.
  4. 입력 이미지의 각 픽셀 값을 CDF 함수에 따라 변환합니다.
  5. 변환된 이미지를 출력합니다.

Python으로 히스토그램 평활화 구현하기

Python의 OpenCV 라이브러리를 사용하여 히스토그램 평활화를 구현할 수 있습니다. 다음은 이미지 히스토그램 평활화를 수행하는 간단한 코드 예시입니다:

import cv2

def histogram_equalization(image):
    # 히스토그램 평활화를 위해 BGR 이미지를 YUV 색상 공간으로 변환합니다.
    yuv_image = cv2.cvtColor(image, cv2.COLOR_BGR2YUV)

    # Y 채널에서 히스토그램을 계산합니다.
    hist, bins = np.histogram(yuv_image[:,:,0].flatten(), bins=256, range=[0,256])

    # 누적 분포 함수(CDF)를 계산합니다.
    cdf = hist.cumsum()
    cdf_normalized = cdf * hist.max() / cdf.max()  # 정규화

    # CDF 함수를 이용하여 Y 채널의 각 픽셀 값을 변환합니다.
    yuv_image[:,:,0] = np.interp(yuv_image[:,:,0], bins[:-1], cdf_normalized).astype(np.uint8)

    # YUV 이미지를 다시 BGR 색상 공간으로 변환합니다.
    equalized_image = cv2.cvtColor(yuv_image, cv2.COLOR_YUV2BGR)

    return equalized_image

# 이미지 파일을 읽어옵니다.
image = cv2.imread("input.jpg")

# 히스토그램 평활화를 적용합니다.
equalized_image = histogram_equalization(image)

# 결과 이미지를 저장합니다.
cv2.imwrite("output.jpg", equalized_image)

위의 코드에서 histogram_equalization 함수는 이미지를 입력으로 받아 히스토그램 평활화를 적용한 후 변환된 이미지를 반환합니다. 입력 이미지는 BGR 색상 공간에서 YUV 색상 공간으로 변환되고, 평활화된 후 다시 BGR 색상 공간으로 변환됩니다.

결과 확인하기

위의 코드를 실행하고 입력 이미지와 평활화된 이미지를 비교하여 결과를 확인할 수 있습니다. 평활화된 이미지는 선명하고 대조가 높아져 더욱 선명하게 표현될 것입니다.

마무리

이미지 히스토그램 평활화는 Python을 사용하여 간단하게 구현할 수 있습니다. 이 기술을 활용하면 이미지를 더욱 선명하고 균일하게 표현할 수 있으므로 컴퓨터 비전 및 이미지 처리 분야에서 유용하게 활용될 수 있습니다.

참고 자료