상세 컨텐츠

본문 제목

히스토그램 평활화(Histogram equalization)

영상처리/OpenCV Python

by cepiloth 2021. 5. 25. 11:31

본문

728x90
반응형

히스토그램이 그레이스케일 전체 구간에서 균일한 분포로 나타나도록 변경하는 명암비 향산 기법으로 히스토그램 균등화, 균일화, 평탄화라고 불리 운다.

히스토그램 평활화를 위한 변환 함수 구하기

 

히스토그램 평활화 계산 방법

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 비용이 무거워 보인다.

728x90
반응형

관련글 더보기

댓글 영역