Histogram equalization
머신비전, 영상처리 분야의 Histogram equalization 알고리즘에 대해 알아보겠습니다.
0. Overview
Historgram equalization은
이전 글인 contrast stretching과 비슷하게
명암대비를 변경하여 이미지를 더욱 육안으로 확인하기 쉽도록 합니다.
Histogram equalization의 경우에는
intensity가 집중되어 있는 곳을 stretching 하고,
반대로, intensity가 집중되지 않은 곳은 압축시켜
최종적으로, histogram을 equalization 하게 만듭니다.
[출처] en.wikipedia.org/wiki/Histogram_equalization
1. 원리
아래의 그림과 같이
[p_0, p_k]의 gray-scale을 가진 input histogram H(p)을
[q_0, q_k]의 brightness scale을 가진 equalized output histogram G(q)으로 만드는
monotonic pixel brightness transformation q = T(p)를 찾는 것입니다.
Sonka, Milan, Vaclav Hlavac, and Roger Boyle. Image processing, analysis, and machine vision. 4th ed. Cengage Learning, 2014. p118.
아래는 T를 찾기 위한 과정입니다.
각 히스토그램에 대해서는 아래와 같고,
equalized histogram G(q)에 상응하는
상수인 uninform probability density function f는
NxN 이미지에서 아래와 같습니다.
(5.5)의 식은 (5.4)에 대입하기 위해
idealized continuous probability density에 대해 (q - q_0)를 곱한
[q_0, q] 범위의 히스토그램의 합은 다음과 같습니다.
(5.6)의 식을 정리하면 우리가 처음 구하려고 한
T는 아래와 같이 구할 수 있습니다.
여기서 H에 대해 적분 되어 있는 식을 cumulative histogram이라 부릅니다.
Sonka, Milan, Vaclav Hlavac, and Roger Boyle. Image processing, analysis, and machine vision. 4th ed. Cengage Learning, 2014. p119
2. 알고리즘
Sonka, Milan, Vaclav Hlavac, and Roger Boyle. Image processing, analysis, and machine vision. 4th ed. Cengage Learning, 2014. p119
간단하게 설명하면,
cumulative image histogram H_c의 형태를 사용하여,
brightness scale을 rebalance 해줍니다.
3. python 구현
사용한 라이브러리는 위와 같습니다.
최종적으로, 각 그림(그림1, 그림2)의
첫 번째 줄 그림의
주황색 cumulative histogram을 이용하여
두 번째 그래프인
monotonic pixel brightness transformation T를 만들고,
이것(T)을 이용하여 세 번째 줄
histogram equalization 결과를 만들어 냈습니다.
각각 살펴보면,
각 그림(그림1, 그림2)의
두 번째 줄 그래프 monotonic pixel brightness transformation T에 대해 설명하면,
히스토그램이 집중되어 있는 곳은 기울기가 급하고
반대인 곳은 기울기가 완만한 것을 알 수 있습니다.
그리고, 기울기가 급하기 때문에 입력 x에 비해 출력 y가 넓게 퍼지는 효과를 줍니다.
반대로, 기울기가 완만한 곳은 입력 x에 비해 출력 y가 한 곳으로 집중되는 효과를 줍니다.
각 그림(그림1, 그림2)의 세 번째 줄 그림 histogram equalization의 결과는
앞서 말한 overview와 조금 다릅니다. 히스토그램이 완전히 equal하지 않습니다.
그 이유는
equal한 일정한 개수를 선택하여 gray-scale을 바꿔주는 것이아닌
histogram이 많은 gray-scale을 넓게 퍼지게 하고
histogram이 적은 gray-scale을 한 곳으로 모이게 하여
그 구간의 평균 밀도(?)를 일정하게 하는 방식을 택했기 때문입니다.
histogram equalization 한 결과에 대해 다시 cumulative histogram을 그렸을 때
linear 한 것을 보면, 평균적인 각 픽셀의 개수는 거의 eqaul함을 알 수 있습니다.
해당 소스는 아래의 링크에서 보실 수 있습니다.
github.com/jstar0525/MachineVision/tree/main/04%20Histogram%20equalization