반응형
황선규 박사님의 OpenCV 강의를 공부하면서 정리하였습니다.
황선규 박사님의 'OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝'를 바탕으로 제작하였습니다.
히스토그램 평활화(Histogram equalization)
히스토그램 평활화는 히스토그램이 그레이스케일 전체 구간에서 균일한 분포로 나타나도록 변경하는 명암비 향상 기법입니다. cdf를 이용하여 평활화를 합니다.
1. 그레이스케일 영상 히스토그램 평활화하기 - cv2.equlizeHist
OpenCV에서 제공하는 cv2.equlizeHist 함수로 히스토그램 평활화를 할 수 있습니다.
[함수 설명]
cv2.equalizeHist(src, dst=None) -> dst
• 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()
[결과]
히스토그램 평탄화가 적용되었습니다.
2. 히스토그램 스트레칭과 평활화 비교
히스토그램평활화는 뭉쳐져있는 부분을 펼쳐주고 픽셀 빈도가 적은 곳은 오히려 뭉쳐지게 합니다.
3. 컬러 영상의 히스토그램 평활화
cv2.equalize()는 그레이스케일 영상만 지원합니다.
따라서 BGR 영상을 YCrCb영상으로 전환해서 split()으로 나눠준 뒤에 Y차원 요소들만 평활화 작업을 거친 후 merge로 결합하고 다시 BGR 영상으로 전환해야 합니다.
[예제 코드]
# 컬러 영상의 히스토그램 평활화
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()
[결과]
이처럼 컬러 영상에도 히스토그램 평탄화를 적용할 수 있습니다.
반응형
'Python > 파이썬 OpenCV 공부' 카테고리의 다른 글
[파이썬 OpenCV] 트랙바를 이용한 특정 색상 영역 추출 - cv2.inRange, cv2.createTrackbar (0) | 2020.09.28 |
---|---|
[파이썬 OpenCV] 특정 색상 영역 추출 - cv2.inRange (3) | 2020.09.28 |
[파이썬 OpenCV] 영상의 명암비 조절 - 히스토그램 스트레칭, 정규화(cv2.normalize) (1) | 2020.09.28 |
[파이썬 OpenCV] OpenCV 함수만으로 히스토그램 그리기 - cv2.line 활용 (0) | 2020.09.28 |
[파이썬 OpenCV] 영상의 히스토그램 분석하기 - cv2.calcHist (0) | 2020.09.28 |