ᐧ༚̮ᐧ Data Science | AI/Python

[컴퓨터 비전] 파이썬 OpenCV로 배우는 이미지 전처리: 히스토그램

Letter_B 2024. 11. 11. 14:47
728x90
반응형

 

 

이미지 히스토그램이란?

 

이미지 히스토그램은 이미지 내에서 픽셀 밝기 값의 빈도를 나타내는 그래프입니다. x축에는 0에서 255까지의 픽셀 밝기 값이 있고, y축에는 각 밝기 값에 해당하는 픽셀 수가 표시됩니다. 이 시각화는 이미지의 대비, 밝기, 그리고 밝기 분포를 분석하는 데 유용합니다. 컴퓨터 비전 전처리 단계에서 히스토그램을 활용해 밝기와 대비를 조정하면, 이미지의 특징을 더 잘 학습할 수 있도록 도울 수 있습니다.

 

OpenCV 이미지 히스토그램 만들기

아래 코드에서 cv2.calcHist() 함수를 통해 image.jpg의 히스토그램을 계산한 후, matplotlib 라이브러리를 사용하여 이미지 히스토그램을 출력하였다.

 

cv2.calcHist(images, channels, mask, histSize, ranges)

calcHist 변수:

  • images 분석할 이미지
  • channels: 계산할 채널. 그레이스케일 이미지일 경우 채널이 하나이기 때문에 0, 컬러이미지는 채널 순서대로 BGR [0, 1, 2] 중 선택하여 입력
  • mask: 분석하고 싶은 영역이 있을 때 입력하는 마스크, 이미지 전체를 보고 마스크가 없을 경우 None 입력
  • histSize: 히스토그램 빈 bin 수를 입력. 픽셀 값이 0-255이기 때문에 256개의 구간으로 나누어 계산한다.
  • ranges: 픽셀 값은 범위. 일반적으로 0부터 255까지 픽셀 값을 입력한다.

 

import cv2
import matplotlib.pyplot as plt

image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
hist = cv2.calcHist([image], [0], None, [256], [0, 256])

fig, axs = plt.subplots(1, 2, figsize=(10, 4))
axs[0].imshow(image, cmap='gray')
axs[0].axis('off')
axs[1].plot(hist, color='black')
plt.show()

 

 

히스토그램 가로축은 픽셀의 밝기(0부터 255까지)를 나타내고, 세로축은 해당 밝기를 가진 픽셀의 개수를 나타낸다. 위 히스토그램을 보면 왼쪽(어두운 영역, 낮은 픽셀)에 픽셀 분포가 많이 집중되어 있는 것을 볼 수 있다. 실제 이미지를 보면, 전체적으로 어둡고 그림자나 검은색 배경이 포함되어 있는 걸 볼 수 있다.

 

 

 

 

히스토그램 평활화 histogram equalization

히스토그램 평활화는 이미지의 대비를 향상하는 기법이다. 이 방법은 픽셀 강도 값을 재분포하여 히스토그램이 범위를 더 넓혀, 이미지 대비를 더 균형 있게 만든다.

 

다음은 OpenCV에서 그레이스케일 이미지에 히스토그램 평활화를 적용하고 시각화하는 방법이다.

 

equalized_image = cv2.equalizeHist(image)

fig, axs = plt.subplots(1, 2, figsize=(8, 4))
axs[0].imshow(image, cmap='gray')
axs[0].axis('off')
axs[0].set(title='Original')
axs[1].imshow(equalized_image, cmap='gray')
axs[1].axis('off')
axs[1].set(title='Equalized')
plt.show()

 

원본 이미지와 평활화된 이미지의 히스토그램도 비교해 보겠다.

 

# 원본 이미지와 평활화된 이미지의 히스토그램 계산
original_hist = cv2.calcHist([image], [0], None, [256], [0, 256])
equalized_hist = cv2.calcHist([equalized_image], [0], None, [256], [0, 256])

fig, axs = plt.subplots(1, 2, figsize=(8, 4))
axs[0].plot(original_hist, color='black')
axs[0].set_xlim([0, 256])
axs[0].set_title('Original Histogram')
axs[1].plot(equalized_hist, color='black')
axs[1].set_xlim([0, 256])
axs[1].set_title('Equalized Histogram')
plt.show()

 

 

 

 

원본 히스토그램을 보면 대부분의 픽셀 값이 0에서 100 사이에 집중 되어 있다. 이미지가 전체적으로 어두우며, 대비가 낮다. 이미지의 어두운 부분과 밝은 부분이 잘 구분되지 않아 디테일을 놓칠 수가 있다.

 

히스토그램 평활화 후의 히스토그램을 보면, 픽셀 값이 0부터 255까지 더 넓은 범위에 분포되어 있다. 이를 통해 이미지의 밝은 영역과 어두운 영역의 대비가 증가하여 더 많은 디테일을 확인 할 수 있다.

728x90
반응형