영상처리 강좌 2 - 히스토그램 평활화( Histogram Equalization )OpenCV/OpenCV 강좌2016. 9. 23. 15:18
Table of Contents
반응형
히스토그램 평활화는 히스토그램을 이용하여 이미지의 명암 대비를 개선시키는 방법입니다.
그레이스케일 영상의 경우 픽셀이 가질 수 있는 값의 범위는 0 ~ 255 사이의 값입니다. 이미지 상에서 픽셀값이 0인 갯수, 픽셀값이 1인 갯수, ... , 픽셀값이 255인 갯수를 세어서 배열에 저장한 것이 히스토그램입니다. 왼쪽 이미지에 대해 히스토그램을 구하여 그래프로 그려보면 중앙의 좁은 범위에 픽셀들이 몰려있는 것을 볼 수 있습니다. 그래프에서 x축은 0~255사이의 픽셀값 범위이며 y축은 픽셀 갯수입니다.
히스토그램 평활화를 적용시키면 이미지의 픽셀값이 0~255 범위내에 골고루 분산되어 이미지의 명암대비가 개선됩니다.
구현 과정
1. 입력 영상에 대한 히스토그램과 누적 히스토그램을 계산합니다. 누적 히스토그램은 현재 픽셀값까지의 히스토그램을 더해주는 것입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | //입력 그레이스케일 영상의 히스토그램 계산 int histogram[256] = { 0, }; for (int y = 0; y < img_input.rows; y++) { for (int x = 0; x < img_input.cols; x++) { int value = img_gray.at<uchar>(y, x); histogram[value] += 1; } } //입력 그레이스케일 영상의 누적 히스토그램 계산 int cumulative_histogram[256] = { 0, }; int sum = 0; for (int i = 1; i < 256; i++) { sum += histogram[i]; cumulative_histogram[i] = sum; } | cs |
2. 정규화된 누적 히스토그램을 구하여 입력 그레이스케일 영상에 히스토그램 평활화를 적용합니다.
P_new = N[ P_old ] * 255
N : 정규화된 누적 히스토그램
P_old : 입력 영상의 픽셀값
P_new: 결과 영상의 픽셀값
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | //입력 그레이스케일 영상의 정규화된 누적 히스토그램 계산 float normalized_cumulative_histogram[256] = { 0.0, }; int image_size = img_input.rows * img_input.cols; for (int i = 0; i < 256; i++) { normalized_cumulative_histogram[i] = cumulative_histogram[i] / (float)image_size; } //히스토그램 평활화 적용 및 결과 영상의 히스토그램 계산 img_result = Mat(img_input.rows, img_input.cols, CV_8UC1); int histogram2[256] = { 0, }; for (int y = 0; y<img_input.rows; y++) { for (int x = 0; x < img_input.cols; x++) { img_result.at<uchar>(y, x) = normalized_cumulative_histogram[img_gray.at<uchar>(y, x)] * 255; histogram2[img_result.at<uchar>(y, x)] += 1; } } //결과 영상의 누적 히스토그램 계산 int cumulative_histogram2[256] = { 0, }; sum = 0; for (int i = 1; i < 256; i++) { sum += histogram2[i]; cumulative_histogram2[i] = sum; } | cs |
입력 영상의 경우 픽셀들이 중앙에 몰려 있었는데
이미지 평활화 적용 후, 0~255사이에 넓게 분포하게 되었습니다. 누적 히스토그램도 점차적으로 증가하게 되었습니다.
전체 소스코드입니다.
반응형
'OpenCV > OpenCV 강좌' 카테고리의 다른 글
OpenCV 3.1 예제 - OpenCV를 pthread, mutex와 같이 사용하기 (2) | 2016.11.25 |
---|---|
영상처리 강좌 3 - 컨볼루션(Convolution)과 스무딩(Smoothing), 샤프닝(Sharpening) (2) | 2016.09.24 |
Hough Line Transform 구현 (15) | 2016.09.21 |
ArUco Marker Detection 구현 및 Pose Estimation (29) | 2016.09.09 |
opencv를 이용한 영상 이진화(binarization, thresholding) (12) | 2016.08.31 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
@webnautes :: 멈춤보단 천천히라도
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!