히스토그램 평활화(Histogram equalization)
- 히스토그램이 그레이스케일 전체 구간에서 균일한 분포로 나타나도록 변경하는 명암비 향상 기법
- 히스토그램 균등화, 균일화, 평탄화라고 한다.
히스토그램 평활화를 위한 변환 함수 구하기
- 히스토그램 함수 구하기 : $h(g) = N_{g}$
- 정규화된 히스토그램 함수 구하기 : $p(g) = \frac{h(g)}{w \times h}$
- 누적 분포 함수(cdf) 구하기 : $cdf(g) = \sum_{0\leq i< g}p(i)$
- 변환 함수 : $ dst(x, y)= round(cdf(scr(x,y))\times L_{max}) $
히스토그램 평활화와 히스토그램 누적 분포 함수와의 관계
✔︎ 히스토그램 평활화 함수 - cv2.equalizeHist
cv2.equalizeHist(src, dst=None)
- src : 입력 영상 (그레이스케일 영상)
- dst : 결과 영상
# 그레이스케일 영상의 히스토그램 평활화
src = cv2.imread('Hawkes.jpg', cv2.IMREAD_GRAYSCALE)
if src is None:
print('image load failed!')
sys.exit()
dst = cv2.equalizeHist(src)
cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitkey()
cv2.destroyAllWindows()
히스토그램 스트레칭과 평활화 비교
히스토그램평활화는 뭉쳐져있는 부분을 펼쳐주고 픽셀 빈도가 적은 곳은 오히려 뭉쳐지게 한다.
컬러 히스토그램 평활화
히스토그램 평활화는 그레이스케일 영상만 가능하다. 그러면 컬러 영상은 어떻게 평활화를 해야 할까?
1. R, G, B 각 색 평면에 대해 히스토그램 평활화
RGB를 각각 평활화하여 합쳤을 때, 색상이 푸르게 나타났음을 알 수 있다.
2. 밝기 성분에 대해서만 히스토그램 평활화
YCrCb로 변환하여 밝기만 평활화 하고 합쳤을 경우 색감이 뚜렷해짐을 볼 수 있다.
💬 실습
import sys
import numpy as np
import cv2
# 컬러 영상의 히스토그램 평활화
src = cv2.imread('field.bmp')
if src is None:
print('Image load failed!')
sys.exit()
src_ycrcb = cv2.cvtColor(src, cv2.COLOR_BGR2YCrCb)
ycrcb_planes = cv2.split(src_ycrcb)
# 밝기 성분에 대해서만 히스토그램 평활화 수행
ycrcb_planes[0] = cv2.equalizeHist(ycrcb_planes[0])
dst_ycrcb = cv2.merge(ycrcb_planes)
dst = cv2.cvtColor(dst_ycrcb, cv2.COLOR_YCrCb2BGR)
cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
'OpenCV' 카테고리의 다른 글
[OpenCV with Python] 영상처리 : 히스토그램 역투영 (0) | 2022.02.01 |
---|---|
[OpenCV with Python]영상처리 : 특정 색상 영역 추출 (0) | 2022.02.01 |
[OpenCV with Python] 영상처리 : 명암비 조절 (0) | 2022.02.01 |
[OpenCV with Python] 영상처리 : 히스토그램 분석 (0) | 2022.02.01 |
[OpenCV with Python] 영상처리 : 컬러 영상과 색 공간 (0) | 2022.02.01 |