본문 바로가기
OpenCV

OpenCV 영상처리 - 히스토그램 평활화(cv2.equalizeHist)

by Kwonys 2024. 3. 18.
728x90
반응형

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

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

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

  • 히스토그램 함수 구하기 : 
  • 정규화된 히스토그램 함수 구하기 : 
  • 누적 분포 함수(cdf) 구하기 : 
  • 변환 함수 : dst(x, y) = round(cdf(src(x, y)) x Lmax

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

히스토그램 평활화와 히스토그램 누적 분포 함수와의 관계

히스토그램 평활화 함수

cv2.equalizeHist(src, dst=None) -> dst
  • src : 입력 영상. 그레이스케일 영상
  • dst : 결과 영상.

히스토그램 평활화 예제

src = cv2.imread('Hawkes.jpg', cv2.IMREAD_GRAYSCALE)
dst = cv2.equalizeHist(src)

히스토그램 스트레칭과 평활화 비교

  • 히스토그램 스트레칭: 균일한 간격,
  • 히스토그램 평활화 : 픽셀이 높은 구간은 넓게 펴주고, 픽셀이 낮은 구간은 좁게 펴줌

히스토그램 평활화는 그레이스케일 영상만 적용이 가능하지만 컬러 영상도 강제적으로 사용할 수 있다.

컬러 영상의 히스토그램 평활화

  • 직관적 방법 : R, G, B 각 색 평면에 대해 히스토그램 평활화
    * R,G,B를 평활화 하면 색이 바뀌어버릴 수 있다.

 

  • YCrCb 영상에서 밝기 성분에 대해서만 히스토그램 평활화 수행

컬러 영상의 히스토그램 평활화

src = cv2.imread('field.bmp')

# BGR을 YCrCb2BGR로 변환
src_ycrcb = cv2.cvtColor(src, cv2.COLOR_BGR2YCrCb)

# Y / Cr / Cb 분리
ycrcb_planes = cv2.split(src_ycrcb)

# 밝기(Y)에 대해서만 히스토그램 평활화를 수행
ycrcb_planes[0] = cv2.equalizeHist(ycrcb_planes[0])

# Y / Cr / Cb 결합
dst_ycrcb = cv2.merge(ycrcb_planes)

# YCrCb2BGR을 다시 BGR로 변환
dst = cv2.cvtColor(dst_ycrcb, cv2.COLOR_YCrCb2BGR)

  • 주의할 점: YCrCb를 다시 RGB로 변환하지 않고 출력하면 이상한 결과가 나온다.

728x90
반응형