Python으로 이미지에서 색상 히스토그램(Color Histogram) 분석 및 시각화

이미지의 색상 분포를 이해하는 것은 컴퓨터 비전과 이미지 처리에서 매우 중요한 과정입니다.
이미지의 전체적인 색감, 명암 대비, 조명 상태를 정량적으로 파악하기 위해 색상 히스토그램(Color Histogram) 이 자주 활용됩니다.
이번 글에서는 Python과 OpenCV, Matplotlib을 활용해 이미지의 색상 히스토그램을 분석하고 시각화하는 방법을 단계별로 살펴보겠습니다.
색상 히스토그램이란?
색상 히스토그램은 이미지 내의 픽셀 색상 분포를 그래프로 표현한 것입니다.
즉, 이미지의 각 색상 값이 얼마나 자주 등장하는지를 빈도(Frequency) 형태로 나타내며,
밝기나 채도, 특정 색상 계열의 강도를 분석하는 데 활용됩니다.
예를 들어, 풍경 사진이라면 녹색과 파란색 픽셀이 많고, 인물 사진이라면 붉은색 계열의 비율이 높게 나타납니다.
이러한 정보는 이미지 검색, 스타일 분석, 영상 분류, 품질 검사 등 다양한 분야에서 사용됩니다.
Python과 OpenCV로 색상 히스토그램 계산하기
OpenCV는 이미지의 히스토그램을 계산하는 함수 cv2.calcHist()를 제공합니다.
이를 이용하면 RGB 채널 각각의 분포를 분석할 수 있습니다.
import cv2
import matplotlib.pyplot as plt
# 1. 이미지 불러오기
image = cv2.imread('sample.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 2. 히스토그램 계산
colors = ('r', 'g', 'b')
plt.figure(figsize=(10,5))
for i, color in enumerate(colors):
hist = cv2.calcHist([image], [i], None, [256], [0, 256])
plt.plot(hist, color=color)
plt.title('Color Histogram')
plt.xlabel('Pixel Intensity')
plt.ylabel('Frequency')
plt.show()
위 코드를 실행하면 각 색상 채널(R, G, B)의 픽셀 분포가 그래프로 시각화됩니다.
이 그래프를 통해 특정 색상의 강도나 분포 차이를 쉽게 확인할 수 있습니다.
히스토그램의 해석과 활용
히스토그램은 이미지의 색상 특성을 수치적으로 분석할 수 있는 매우 강력한 도구입니다.
아래는 히스토그램을 해석하고 활용할 수 있는 대표적인 방법들입니다.
- 밝기와 대비 분석
- 히스토그램이 왼쪽(0 근처)에 치우쳐 있으면 어두운 이미지,
오른쪽(255 근처)에 치우쳐 있으면 밝은 이미지임을 의미합니다. - 히스토그램이 전체적으로 넓게 분포되어 있다면 명암 대비가 높은 이미지입니다.
- 히스토그램이 왼쪽(0 근처)에 치우쳐 있으면 어두운 이미지,
- 색상 균형 평가
- R, G, B 채널의 분포를 비교하면 색상 불균형을 확인할 수 있습니다.
예를 들어, 파란색 히스토그램이 높게 나타나면 푸른빛이 강한 이미지라는 뜻입니다.
- R, G, B 채널의 분포를 비교하면 색상 불균형을 확인할 수 있습니다.
- 이미지 보정 및 후처리
- 히스토그램 정보를 활용하여 감마 보정, 대비 향상(Contrast Stretching),
균등화(Equalization) 등을 수행할 수 있습니다.
- 히스토그램 정보를 활용하여 감마 보정, 대비 향상(Contrast Stretching),
히스토그램 균등화 (Histogram Equalization)
어두운 이미지나 색상 대비가 낮은 사진의 품질을 개선하기 위해 히스토그램 균등화 기법을 사용할 수 있습니다.
이는 픽셀 강도의 분포를 균등하게 만들어 이미지의 명암 대비를 향상시키는 방법입니다.
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
equalized = cv2.equalizeHist(gray)
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.title('Original Grayscale')
plt.imshow(gray, cmap='gray')
plt.subplot(1,2,2)
plt.title('Equalized Image')
plt.imshow(equalized, cmap='gray')
plt.show()
히스토그램 균등화는 특히 의료 영상, CCTV, 위성 영상 분석 등 명암이 중요한 영역에서 자주 사용됩니다.
색상 히스토그램의 응용 분야
색상 히스토그램은 단순한 색상 분석을 넘어 다양한 응용으로 확장됩니다.
- 이미지 검색 시스템 (CBIR: Content-Based Image Retrieval)
- 색상 분포를 벡터 형태로 저장하고, 유사한 히스토그램을 가진 이미지를 검색하는 시스템에 사용됩니다.
- 객체 인식(Object Recognition)
- 특정 물체가 고유한 색상 분포를 가질 때, 히스토그램 기반으로 인식 및 분류가 가능합니다.
- 영상 품질 평가(Video Quality Assessment)
- 영상 프레임의 히스토그램 변화량을 통해 밝기 변동, 노출 과다/과소 문제를 자동 탐지합니다.
- 감정 분석(Emotion Analysis)
- 이미지의 색조나 채도 분포를 분석해 감정적 톤(따뜻함, 차가움, 활기 등)을 평가합니다.
- 산업 검사(Industrial Vision)
- 제품의 색상 균일성, 오염 여부, 품질 이상을 감지하는 데 사용됩니다.
히스토그램 비교를 통한 이미지 유사도 분석
두 이미지 간의 유사도를 측정할 때 히스토그램 비교는 간단하면서도 효과적인 방법입니다.
OpenCV의 cv2.compareHist() 함수를 사용하면 두 이미지의 색상 분포 유사도를 계산할 수 있습니다.
hist1 = cv2.calcHist([image1], [0], None, [256], [0,256])
hist2 = cv2.calcHist([image2], [0], None, [256], [0,256])
similarity = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)
print("Similarity:", similarity)
HISTCMP_CORREL 외에도 Chi-Square, Bhattacharyya 등 다양한 비교 방식이 제공됩니다.
이 기능은 콘텐츠 기반 이미지 검색이나 중복 이미지 탐지 시스템에서 유용하게 활용됩니다.
결론
색상 히스토그램은 이미지의 색상 정보를 정량화하고 시각화하는 기본이자 핵심 도구입니다.
Python과 OpenCV를 사용하면 히스토그램 계산, 균등화, 비교 등 다양한 분석을 간단한 코드로 구현할 수 있습니다.
이 기법은 이미지 품질 분석뿐 아니라, 객체 인식, 영상 검색, 자동 보정 시스템 등에서도 필수적인 역할을 수행합니다.
앞으로는 색상 히스토그램을 딥러닝 입력 특징(feature)으로 활용하거나,
HSV, LAB 같은 색상 공간 변환과 결합해 보다 세밀한 분석을 시도해보는 것도 좋은 방법입니다.