[OpenCV] Image Histogram Equalization (B&W) – 1
How to Histogram Equalization in B&W Image
영상처리에서 비선형변환을 하는 가장 기초적인 연산 중 하나로 Histogram Equalization(직역 시 히스토그램 평준화)을 꼽을 수 있다.
여기 직관적인 예를 살펴보자
두 사진간 어떤 사진이 더 보기좋은가? 라고 한다면 높은 확률로 우측 사진을 선택할 수 있다.
왜 그럴까? 결론부터 말하면 명도대비가 높기 때문이다.
덧. 개인차가 존재할 수 있다. 작가의 표현의도가 저(低) 명도대비 영상 촬영이었을 수도 있지 않을까?
Histogram
앞서 명도대비, 히스토그램 평준화.. 몇 없는 문단임에도 당황하게 하는 단어들이 보인다.
광학에 대한 내용과 이를 디지털적 신호로 변환, 다루기 위한 과정에서 필요한 용어이기 때문일지도.
용어를 이해하기 위해선 약간의 근본적 지식을 배울 필요가 있다.
아마 DSLR이나 미러리스등으로 사진촬영을 해보았다면 위의 단어를 어느정도 인지하고 있을 테고, 아래 그래프 또한 본적이 있을 것이다. (본 적이 없다면 이제부터 보면 된다)
Fig.1에서 각 사진의 히스토그램을 그래프로 표현한 것이다.
그렇다면 히스토그램은 무엇일까
컴퓨터에서 사진은 각 픽셀을 P개의 비트로 표현한 MxN 형태의 매트릭스이다.
6×6매트릭스(6×6 크기의 이미지)로 예를 들어보자.
이 이미지에서는 각 픽셀마다 4bit를 할당한다. 즉 각 칸이 가질 수 있는 값의 범위는 0<=x<=15 이다. x가 의미하는 바는 해당 픽셀의 명도값으로 보면된다.
그레이 레벨의 최대값을 L이라고 한다. ( L = 2^(p bit(s)) )
이 명도값의 분포를 표로 정리하면 히스토그램이 되고,
다시 그래프로 표현한 것이 바로 히스토그램 그래프이다.
내가 생각하는 히스토그램을 사용하는 이유는
1) 사진의 특정한 변환(전처리, 후처리)을 해야하는데 내 눈엔 괜찮아보이는데… 컴퓨터가 이거 제대로 알아먹을 수 있을까?
2) 구도는 괜찮은데 블랙 클리핑이 심하게 발생하네 어떤 걸 조절해서 찍어야할까?
에서 조금 더 쉽고 직관적이게 알아먹을 수 있도록 하기 위함이다.
우리는 개발자이기 때문에 당연히 1번의 이유를 주로 문제해결에 초점을 둔다.,
Contrast Intensity
다시 본론으로 돌아와서 이 명도값의 분포를 MxN형태의 메트릭스에서 사람의 눈으로 파악이 제대로 될 터가 없다. 그래서 Fig.5와 같이 히스토그램 그래프로 표현했더니 눈 씻고 찾아봐도 4를 넘는 수가 보이지 않는다. 분명 4bit라 최대 15까지 값을 가질 수 있을텐데 말이다.
또 그래프가 한쪽으로 치우쳐져있다. 이걸 저 (명도)대비 라고 하는데 이런 영상은 사물과 배경, 사물과 사물을 구별하기가 쉽지가 않다.
많은 경우에서 이런 영상을 고 대비 영상으로 처리를 할 필요가 있다. 한 쪽으로 치우쳐져있거나 뭉쳐있는 Contrast Intensity를 넓게 확산시키는 것이다.
이해가 잘 가지 않는다면, 한 곳에 뭉쳐있는 치즈를 길게 주욱 늘어뜨리는 상상을 해보자.
Histogram Equalization
Fig.3에서 보였던 예제를 가지고 손으로 직접 히스토그램을 평준화 해보자
히스토그램 평준화는 점 대 점(Point to Point) 연산으로 매우 간단한 계산과정을 거친다.
1) 히스토그램 계산
이 매트릭스를 Fig.4처럼 1 x 2^(p bits)의 히스토그램 매트릭스로 계산한다.
2) PDF 계산
도출한 히스토그램 매트릭스에서 PDF(probability density function)를 계산해야한다.
히스토그램이 빈도 수를 계산한 것이라면, 확률분포함수인 PDF는 각 Intensity의 빈도 확률을 계산한 것이다.
Intensity가 정확한 표현일지는 모르겠다. Gray Level, Contrast Value 로 이해해도 좋다.
총 픽셀수를 분모로 사용하면 된다. 확률의 총합은 당연히 1이다. = 1
3) CDF 계산
이 다음으로 누적분포함수를 계산한다. CDF(cumulative density function)는 PDF에서 순차적으로 누적한 값을 더하여 저장하면 된다. 대신 프로그램언어에서 계산할 경우CDF와 PDF는 별도의 배열로 계산하여야 한다. 시그마 연산을 하기 위해서는 원본 배열이 필요하기 때문이다.
그 결과로 위의 표처럼 계산될 것이다.
4) Sk (Calculating result of each pixel value for Destination Matrix) 계산
Sk는 최종적으로 각 픽셀에 반영할 새로운 Contrast Value를 계산한다.
CDF에서 최대 그레이레벨값을 곱하면 되는데,
L은 그레이 레벨의 최대값이기 때문에 2 ^ p bit(s) 임을 설명하였다. 컴퓨터에서 배열의 인덱스는 대게 0부터 시작하기 때문에 인덱스의 최대값 역시 -1을 해줘야한다.
따라서 이전 CDF 매트릭스 각값에 L-1을 곱하여 계산한다.
5) Destination Matrix 생성
점 대 점 연산이기 때문에 기존 매트릭스에서 갖는 픽셀값을 치환만해주면된다.
ex) 기존 Source 매트릭스에서의 0은 5.41로 치환, 1은 10.4, …
또한 도출된 결과에서 Grayscale이미지는 각 픽셀이 정수값을 갖기 때문에 반올림한다. 경우에 따라 Ceiling이나 Flooring을 하기도 하지만 일반적으로 Rounding한다.
Conclusion
지금까지 흑백영상의 Histogram Equalization을 통해 입력 매트릭스의 저대비 및 낮은 평균 Gray Level의 값의 영상을 비교적 고른 분포의 Histogram을 가진 매트릭스로 바꾸는 것을 보았다.
최종적으로 아래 그래프처럼 (다만 사람의 눈으로는 고르지 않은) 히스토그램이 도출되=었다.
전, 후 매트릭스의 Gray Level의 빈도수를 비교했을 때 기존의 Matrix 대비 균일해졌다고 볼 수 있다. 하지만 주어진 매트릭스의 shape이 (6, 6)으로 작고 픽셀당 4 bit를 할당하기 때문에 Histogram Equalization을 통해 개선된(Enhanced) 여부를 쉽게 파악하기가 쉽지 않다.
그래서 가장 처음에 lena.png를 이용하여 먼저 선 보인 것이다. Fig.2 처럼 개선된 정도가 확연하게 보이기 때문이다.
기존 0~50, 그리고 225~250영역에 비어있는 Gray Level의 빈도수를 Equalization을 통해 0~255 전체 영역에 Gray Level 빈도수가 고르게 분포된 것(고대비 영상으로 변한 것)을 확인할 수 있다.
또한, Histogram Equalization을 통해 도출된 값들을 합하여 Matrix의 Size로 나눈값이
Max Gray Level(2^Bit – 1)의 절반값과 비슷해 진다는 것을 알 수 있다.
1) 6*6 입력 행렬에서,
(5*13 + 10*12 + 13*6 + 14*3 +15*2) / (6*6) = 9.3
16/2 = 8
2) lena.png에서,
33743418/ (512*512) = 128.7209
256 / 2 = 128
좀 더 큰 배열을 입력으로 주었을 때 그 근사정도가 커졌다고 볼 수 있다.
따라서, 다음과 같은 식을 도출할 수 있었으며, L/2에 대한 근사정도가 커질수록 Gray Level의 빈도수가 고르게 분배되었다는 것을 알 수 있다.
그런데 글이 끝나가는 분위기인데, 왜 굳이 컬러 영상을다루지 않고 끝낼까?
그 이유는 흑백영상과 컬러영상의 특성이 다르기 때문에 컬러영상은 바로 Equalize Histogram함수를 사용할 수 없다.
이에 대해 다음 글에 이어서 작성한다! 이만 뿅
6개의 댓글