이미지 히스토그램이란?
이미지 히스토그램은 이미지 내에서 픽셀 밝기 값의 빈도를 나타내는 그래프입니다. 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까지 더 넓은 범위에 분포되어 있다. 이를 통해 이미지의 밝은 영역과 어두운 영역의 대비가 증가하여 더 많은 디테일을 확인 할 수 있다.
'ᐧ༚̮ᐧ Data Science | AI > Python' 카테고리의 다른 글
[파이썬, conda] 가상 환경이란? (feat. 가상환경 생성, 활성화, 삭제) (1) | 2024.11.16 |
---|---|
[컴퓨터 비전] 파이썬 OpenCV 튜토리얼: 설치, 이미지 읽기 (0) | 2024.11.10 |
[파이썬 Pandas] 데이터프레임 병합 merge 가이드 (1) | 2024.11.09 |
비주얼 스튜디오 코드 폰트 바꾸기, 크기 바꾸기 + 코딩용 폰트 추천! (1) | 2023.02.17 |
비주얼 스튜디오 테마 추천 및 변경하기 (0) | 2023.02.16 |