OpenCV로 색상 히스토그램 평탄화 (cv2.equalizeHist())
이미지 처리에서 히스토그램 평탄화(histogram equalization)는 명암 대비를 향상하는 중요한 기법입니다. OpenCV에서는 cv2.equalizeHist() 함수를 이용하여 간단하게 히스토그램 평탄화를 적용할 수 있습니다. 이번 포스팅에서는 히스토그램 평탄화의 개념을 설명하고, OpenCV를 활용한 실습 코드를 함께 살펴보겠습니다.
1. 히스토그램 평탄화란?
히스토그램 평탄화는 이미지의 히스토그램을 고르게 분포시키는 기법으로, 어두운 영역과 밝은 영역을 균형 있게 조정하여 명암 대비를 향상합니다. 이 방법은 특히 저조도 환경에서 촬영된 이미지의 가시성을 높이는 데 유용합니다.
히스토그램 평탄화를 적용하면 이미지의 픽셀 값이 넓은 범위에 걸쳐 균등하게 분포하도록 조정됩니다. 이를 통해 어두운 부분이 밝아지고, 밝은 부분이 더욱 선명해지는 효과를 얻을 수 있습니다.
2. OpenCV에서 cv2.equalizeHist() 사용법
cv2.equalizeHist() 함수는 입력으로 그레이스케일(grayscale) 이미지를 받고, 히스토그램 평탄화가 적용된 이미지를 반환합니다.
함수 문법
cv2.equalizeHist(src)
src: 입력 이미지 (그레이스케일)- 반환값: 히스토그램 평탄화가 적용된 이미지
3. 예제 코드
아래 예제에서는 OpenCV를 사용하여 원본 이미지와 히스토그램 평탄화가 적용된 이미지를 비교해 보겠습니다.
예제 코드
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 이미지 불러오기 (그레이스케일 변환)
image = cv2.imread('input.jpg', cv2.IMREAD_GRAYSCALE)
# 히스토그램 평탄화 적용
equalized = cv2.equalizeHist(image)
# 원본 및 변환된 이미지 출력
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.title('Original Image')
plt.imshow(image, cmap='gray')
plt.axis('off')
plt.subplot(1,2,2)
plt.title('Equalized Image')
plt.imshow(equalized, cmap='gray')
plt.axis('off')
plt.show()
위 코드를 실행하면 원본 이미지와 히스토그램 평탄화된 이미지가 나란히 출력됩니다.
4. 히스토그램 비교
히스토그램을 시각화하여 변화를 확인할 수도 있습니다. 다음 코드를 실행하면 원본 이미지와 평탄화된 이미지의 히스토그램을 비교할 수 있습니다.
# 히스토그램 계산
hist_orig = cv2.calcHist([image], [0], None, [256], [0,256])
hist_eq = cv2.calcHist([equalized], [0], None, [256], [0,256])
# 히스토그램 출력
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.title('Histogram of Original Image')
plt.plot(hist_orig, color='black')
plt.xlim([0,256])
plt.subplot(1,2,2)
plt.title('Histogram of Equalized Image')
plt.plot(hist_eq, color='black')
plt.xlim([0,256])
plt.show()
이 코드를 실행하면 원본 이미지의 히스토그램과 평탄화된 이미지의 히스토그램이 어떻게 변화하는지 비교할 수 있습니다.
5. 컬러 이미지에 히스토그램 평탄화 적용하기
cv2.equalizeHist() 함수는 단일 채널(그레이스케일) 이미지에만 사용할 수 있습니다. 컬러 이미지(RGB 또는 BGR)에는 개별 채널별로 평탄화를 적용해야 합니다. 이를 위해 cv2.split()과 cv2.merge()를 활용할 수 있습니다.
# 컬러 이미지 로드
image_color = cv2.imread('input.jpg')
# BGR 채널 분리
b, g, r = cv2.split(image_color)
# 각 채널에 히스토그램 평탄화 적용
b_eq = cv2.equalizeHist(b)
g_eq = cv2.equalizeHist(g)
r_eq = cv2.equalizeHist(r)
# 채널 병합
equalized_color = cv2.merge((b_eq, g_eq, r_eq))
# 원본 및 변환된 이미지 출력
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.title('Original Color Image')
plt.imshow(cv2.cvtColor(image_color, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.subplot(1,2,2)
plt.title('Equalized Color Image')
plt.imshow(cv2.cvtColor(equalized_color, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()
이 방법은 단순한 방법이지만, 채널 간 균형이 맞지 않을 수 있습니다. 더욱 정교한 방법으로 YCrCb 색 공간에서 Y 채널만 평탄화하는 방법이 일반적으로 권장됩니다.
# YCrCb 색 공간 변환
image_ycrcb = cv2.cvtColor(image_color, cv2.COLOR_BGR2YCrCb)
# Y 채널만 평탄화
y, cr, cb = cv2.split(image_ycrcb)
y_eq = cv2.equalizeHist(y)
# 채널 병합 및 BGR 복귀
equalized_ycrcb = cv2.merge((y_eq, cr, cb))
equalized_final = cv2.cvtColor(equalized_ycrcb, cv2.COLOR_YCrCb2BGR)
# 결과 출력
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.title('Original Image')
plt.imshow(cv2.cvtColor(image_color, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.subplot(1,2,2)
plt.title('Histogram Equalized Image')
plt.imshow(cv2.cvtColor(equalized_final, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()
6. 결론
히스토그램 평탄화는 이미지의 명암 대비를 향상하는 유용한 기술로, 저조도 환경에서 촬영된 이미지의 가시성을 높이는 데 효과적입니다. OpenCV에서는 cv2.equalizeHist() 함수를 활용하여 간단하게 히스토그램 평탄화를 적용할 수 있으며, 그레이스케일 및 컬러 이미지에 각각 다른 방식으로 적용해야 합니다.
이번 포스팅에서는 기본적인 개념부터 OpenCV를 활용한 구현까지 다양한 방법을 다루었습니다. 히스토그램 평탄화를 활용하여 이미지 품질을 향상해 보시길 바랍니다.
'Python > OpenCV' 카테고리의 다른 글
| Django에서 WebSocket과 채팅 기능 구현 (Django Channels) (0) | 2025.11.10 |
|---|---|
| OpenCV 윤곽선 검출 (cv2.findContours()) (0) | 2025.11.09 |
| OpenCV 이미지 히스토그램 분석 (cv2.calcHist()) (0) | 2025.11.07 |
| OpenCV 이미지 위에 텍스트 추가하기 (cv2.putText()) (0) | 2025.11.06 |
| Python OpenCV - 이미지 위에 선, 원, 사각형 그리기 (0) | 2025.11.05 |