Tech & Development/Image Processing

[OpenCV] Basic 11 - 이미지 히스토그램 (Histogram) 분석

Theo (테오) 2024. 11. 19. 00:11
반응형

이미지 히스토그램은 이미지에서 색상 분포나 밝기 정보를 시각적으로 표현한 그래프입니다. 히스토그램을 분석하면 이미지의 명도, 대비, 색상 정보를 알 수 있어 이미지 처리에서 중요한 역할을 합니다. 예를 들어, 히스토그램을 사용해 이미지의 밝기나 대비를 조정할 수 있습니다.

Import packages

import cv2
import numpy as np
import matplotlib.pyplot as plt

Function to Display Images in Jupyter Notebook

Jupyter Notebook 및 Google Colab에서 이미지를 표시할 수 있도록 Function으로 정의합니다.

def img_show(title='image', img=None, figsize=(8, 5)):
    plt.figure(figsize=figsize)

    if type(img) == list:
        titles = title if type(title) == list else [title] * len(img)

        for i in range(len(img)):
            rgbImg = cv2.cvtColor(img[i], cv2.COLOR_GRAY2RGB) if len(img[i].shape) <= 2 else cv2.cvtColor(img[i], cv2.COLOR_BGR2RGB)
            plt.subplot(1, len(img), i + 1)
            plt.imshow(rgbImg)
            plt.title(titles[i])
            plt.xticks([]), plt.yticks([])

        plt.show()
    else:
        rgbImg = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB) if len(img.shape) < 3 else cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        plt.imshow(rgbImg)
        plt.title(title)
        plt.xticks([]), plt.yticks([])
        plt.show()

Load Image

이미지를 불러옵니다.

cv2_image = cv2.imread('asset/images/test_image.jpg')

1. Grayscale 히스토그램

Grayscale 이미지의 히스토그램은 이미지의 밝기 분포를 나타냅니다. 히스토그램의 x축은 밝기 값 (0~255), y축은 각 밝기 값의 픽셀 개수를 나타냅니다.

gray_image = cv2.cvtColor(cv2_image, cv2.COLOR_BGR2GRAY)
hist = cv2.calcHist([gray_image], [0], None, [256], [0, 256])

plt.figure(figsize=(8, 5))
plt.plot(hist, color='black')
plt.title("Grayscale Histogram")
plt.xlabel("Pixel Value")
plt.ylabel("Frequency")
plt.show()

2. RGB 히스토그램

컬러 이미지의 경우 각 채널(BGR)에 대해 별도의 히스토그램을 그릴 수 있습니다. 이를 통해 이미지에서 각 색상의 분포를 확인할 수 있습니다.

colors = ('b', 'g', 'r')
plt.figure(figsize=(8, 5))

for i, color in enumerate(colors):
    hist = cv2.calcHist([cv2_image], [i], None, [256], [0, 256])
    plt.plot(hist, color=color)
    plt.xlim([0, 256])

plt.title("RGB Histogram")
plt.xlabel("Pixel Value")
plt.ylabel("Frequency")
plt.show()

3. 히스토그램 평활화 (Histogram Equalization)

히스토그램 평활화는 이미지의 대비를 개선하여 더 뚜렷한 이미지를 얻는 데 유용합니다. 이 방법은 이미지의 픽셀 밝기 값을 재분배하여, 히스토그램이 고르게 분포되도록 합니다.

  • Grayscale 이미지 평활화:
equalized_image = cv2.equalizeHist(gray_image)

# 원본 및 평활화 이미지 비교
img_show(["Original Grayscale", "Equalized Image"], [gray_image, equalized_image])

# 평활화 이미지의 히스토그램
equalized_hist = cv2.calcHist([equalized_image], [0], None, [256], [0, 256])

plt.figure(figsize=(8, 5))
plt.plot(equalized_hist, color='black')
plt.title("Equalized Grayscale Histogram")
plt.xlabel("Pixel Value")
plt.ylabel("Frequency")
plt.show()

4. CLAHE (Contrast Limited Adaptive Histogram Equalization)

CLAHE는 히스토그램 평활화의 개선된 방법으로, 작은 영역마다 히스토그램을 평활화하여 지나친 밝기 왜곡을 방지합니다. 이는 특히 조명이 고르지 않은 이미지에 유용합니다.

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
clahe_image = clahe.apply(gray_image)

# 원본 및 CLAHE 적용 이미지 비교
img_show(["Original Grayscale", "CLAHE Image"], [gray_image, clahe_image])

# CLAHE 이미지 히스토그램
clahe_hist = cv2.calcHist([clahe_image], [0], None, [256], [0, 256])

plt.figure(figsize=(8, 5))
plt.plot(clahe_hist, color='black')
plt.title("CLAHE Histogram")
plt.xlabel("Pixel Value")
plt.ylabel("Frequency")
plt.show()

요약

이미지 히스토그램은 이미지의 밝기와 색상 분포를 시각화하여 이미지의 특성을 분석하는 데 유용합니다. 히스토그램 평활화와 CLAHE는 이미지 대비를 개선하여 더 나은 시각적 품질을 제공합니다. 히스토그램을 활용해 이미지 분석 및 전처리를 효과적으로 수행할 수 있습니다.

반응형