히스토그램이 그레이스케일 전체 구간에서 균일한 분포로 나타나도록 변경하는 명암비 향산 기법으로 히스토그램 균등화, 균일화, 평탄화라고 불리 운다.
4x4 행렬이 있을때 16개의 요소에서 0의 개수는 4, 1의 개수는 3 등 전체 요소에서 3/16 개가 있다. 여기까지는 단순하게 히스토그램을 구하는 방법으로 쉽게 구 할 수 있다.
누적 히스토그램을 구한다. p(g) 정규화된 히스토그램에서 첫 번째는 4/16 그대로 내려오고 bin 1부터는 이전의 요소와 더하여 누적한다. cdf(g)의 경우 bin 마지막은 1로 수렴하게 된다.
히스토그램 평활화를 하기전에는 색상의 분포가 고르지 않은 것을 볼 수 있다. 평활화를 적용한 영상은 분포가 고른 것을 확인할 수 있다.
#OpenCV 히스토그램 평활화
/*
src : 입력 영상. 그레이스케일 영상.
dst : 결과 영상
*/
cv2.equlizehost(src, dst=None) -> dst
equalize.py 예제 코드
import sys
import numpy as np
import cv2
# 그레이스케일 영상의 히스토그램 평활화
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()
직관적 방법: R, G, B 각 색 평면에 대해 히스토그램 평활화
간단한 생각으로는 위처럼 각 채널 영역을 분리하고 하면 될거 같지만 각 R, G, B 요소의 범위가 다르기 때문에 아래와 같은 문제가 발생할 수 있다.
HSV, HSI, YCrCb 등 컬러영상의 히스토그램 평활하는 밝기 성분에 대해서만 히스토그램 평활화 수행(생상 성분은 불면)한다.
# 컬러 영상의 히스토그램 평활화
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()
컬러 영상을 YCrCb 컬러 공간으로 변경한 영상에서 Y(휘도, 밝기) 영역만 평활화를 하고 다시 merge 하고 또다시 bgr 형태로 변환하면 변환하는 연산량과 merge 비용이 무거워 보인다.
히스토그램 역투영(Histogram backprojection) (0) | 2021.05.25 |
---|---|
특정 색상 영역 추출 하기 (0) | 2021.05.25 |
히스토그램 스트레칭(Histogram stretching) (0) | 2021.05.25 |
영상의 명암비(Contrast) 조절 (0) | 2021.05.25 |
히스토그램 분석 (0) | 2021.05.25 |
댓글 영역