OpenCV 강좌, 히스토그램 평활화와 명암 보정

안녕하세요! 이번 강좌에서는 OpenCV를 이용한 히스토그램 평활화와 명암 보정에 대해 알아보겠습니다. 이미지 프로세싱에서 히스토그램 평활화는 이미지의 대비를 향상시키기 위한 유용한 기법 중 하나입니다. 이 기술을 통해 이미지의 시각적 품질을 개선할 수 있습니다.

1. 히스토그램이란?

히스토그램은 이미지의 픽셀 값의 분포를 나타내는 그래프입니다. 수평 축은 픽셀의 밝기 값 (0에서 255까지)을 나타내고, 수직 축은 각 밝기 값에 해당하는 픽셀의 수를 나타냅니다.

1.1. 이미지 히스토그램의 중요성

이미지의 히스토그램은 이미지의 밝기 및 대비를 이해하는 데 도움을 줍니다. 예를 들어, 히스토그램이 왼쪽으로 치우쳐져 있다면 이미지가 어두운 것이고, 오른쪽으로 치우쳐져 있으면 이미지가 밝습니다. 따라서, 히스토그램을 분석함으로써 이미지의 품질을 개선할 필요가 있는지 알 수 있습니다.

2. 히스토그램 평활화란?

히스토그램 평활화는 이미지의 대비를 향상시키기 위한 기법입니다. 이 방법은 이미지의 히스토그램을 재구성하여 픽셀 값의 분포를 균등화합니다. 결과적으로, 보다 균일하게 분포된 픽셀 값을 통해 이미지의 시각적 품질이 향상됩니다.

2.1. 히스토그램 평활화를 하는 이유

  • 대비를 향상시켜 세부 정보를 더 잘 보이게 함
  • 어두운 이미지를 밝게 만들고, 밝은 이미지를 고르게 보이도록 함
  • 이미지 분석 및 컴퓨터 비전 기능 향상

3. OpenCV를 이용한 히스토그램 평활화 예제

OpenCV를 사용하여 히스토그램 평활화를 적용하는 방법을 알아보겠습니다. 다음은 파이썬을 이용한 히스토그램 평활화의 코드 예제입니다.

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

# 이미지를 읽어온다
image = cv2.imread('input_image.jpg', cv2.IMREAD_GRAYSCALE)

# 원본 이미지의 히스토그램을 계산한다
hist_original = cv2.calcHist([image], [0], None, [256], [0, 256])

# 히스토그램 평활화를 진행한다
image_equalized = cv2.equalizeHist(image)

# 평활화된 이미지의 히스토그램을 계산한다
hist_equalized = cv2.calcHist([image_equalized], [0], None, [256], [0, 256])

# 결과를 출력한다
plt.figure(figsize=(12, 6))

plt.subplot(2, 2, 1)
plt.title('Original Image')
plt.imshow(image, cmap='gray')
plt.axis('off')

plt.subplot(2, 2, 2)
plt.title('Histogram of Original Image')
plt.plot(hist_original)
plt.xlim([0, 256])

plt.subplot(2, 2, 3)
plt.title('Equalized Image')
plt.imshow(image_equalized, cmap='gray')
plt.axis('off')

plt.subplot(2, 2, 4)
plt.title('Histogram of Equalized Image')
plt.plot(hist_equalized)
plt.xlim([0, 256])

plt.tight_layout()
plt.show()

위의 코드를 실행하면, 원본 이미지와 평활화된 이미지를 비교할 수 있으며, 각각에 대한 히스토그램을 시각화할 수 있습니다. 이 과정에서 원본 이미지의 히스토그램은 집중되어 있을 수 있지만, 평활화된 이미지의 히스토그램은 보다 균일하게 분포될 것입니다.

4. 명암 보정 (Contrast Stretching)

명암 보정은 이미지의 명암을 조절하여 이미지의 대비를 개선하는 또 다른 방법입니다. 이 기법은 이미지의 모든 픽셀 값을 특정 범위로 매핑하여 명암을 늘리는 방식으로 작동합니다. 일반적으로 픽셀 값의 범위는 0과 255 사이입니다.

4.1. 명암 보정의 필요성

명암 보정은 이미지의 디테일을 보존하면서 이미지의 명도와 대비를 조절할 수 있어 이미지 분석에 큰 도움이 됩니다. 예를 들어, 의료 이미지, 위성 사진, CCTV 영상 등에서 세부 정보를 강조하고 잘 보이게 하기 위해 사용됩니다.

4.2. OpenCV를 이용한 명암 보정 예제

이제 OpenCV를 사용하여 명암 보정을 수행하는 방법을 알아보겠습니다. 아래 예제는 간단한 명암 보정 방법을 보여줍니다.

# 명암 보정 함수 정의
def contrast_stretching(image):
    # 이미지의 최소 및 최대 픽셀 값 계산
    min_val = np.min(image)
    max_val = np.max(image)

    # 명암 보정 수행
    stretched = ((image - min_val) / (max_val - min_val)) * 255
    return stretched.astype(np.uint8)

# 이미지 읽기
image = cv2.imread('input_image.jpg', cv2.IMREAD_GRAYSCALE)

# 명암 보정 수행
contrast_stretched_image = contrast_stretching(image)

# 결과 화면에 출력
cv2.imshow('Original Image', image)
cv2.imshow('Contrast Stretched Image', contrast_stretched_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

이 예제를 통해 명암 보정 기법을 적용한 후 원본 이미지와 변환된 이미지를 확인할 수 있습니다. 여기서는 픽셀 값의 최소값과 최대값을 이용하여 새로운 범위로 픽셀 값을 재조정합니다.

5. 결론

이번 강좌에서는 OpenCV를 활용한 히스토그램 평활화와 명암 보정에 대해 자세히 알아보았습니다. 이러한 기법들은 이미지의 품질을 개선하고, 세부 정보를 강조하여 다양한 컴퓨터 비전 애플리케이션에 활용될 수 있습니다. 다양한 이미지를 가지고 실험하면서 각 기법의 효과를 직접 확인해보시기 바랍니다.

읽어주셔서 감사합니다! 더 많은 OpenCV 관련 내용이 궁금하신 분들은 댓글로 질문해주시면 성심껏 답변해드리겠습니다.