본문 바로가기
과학/영상처리

[영상처리]히스토그램(Histogram)의 정의 및 평활화(Equalization)

by 원쓰원 2023. 1. 2.

영상처리에서의 히스토그램 예시

1. 히스토그램(Histogram)의 정의

1) 일반적인 정의

히스토그램은 일반적으로 자주 표현되는 표 대신, 한눈에 알아보기 쉽도록 표현한 막대그래프를 의미합니다. 가로축과 세로축으로 구성되어 있으며 가로축은 계급, 세로축은 도수를 뜻합니다. 해당 계급에서의 도수를 모두 더하면 총개수를 구할 수 있습니다.

2) 영상처리에서의 정의

히스토그램(Histogram)은 영상이 얼마나 밝고 어두운지를 표현해주는 막대 그래프입니다. 한마디로, 영상에서 각 픽셀이 가진 밝기를 의미합니다. 흑백 영상을 예로 들자면 가로축은 픽셀의 밝기를 의미하고, 수치는 최소 0에서 최대 255까지로 표현합니다. 또한, 세로축은 각 밝기에 해당하는 픽셀의 개수를 의미합니다. 따라서, 히스토그램의 모양은 영상의 크기와 명도 분포에 따라 달라진다고 할 수 있습니다.

 

2. 히스토그램 값의 의미

낮은 명도를 가진 영상은 일반적으로 그 픽셀들이 0에 가까운 값을 가지고 있으므로, 히스토그램 상에서 가로축이 0인 값 근처에 집중되어 있습니다. 반대로, 높은 명도를 가진 영상은 픽셀 값이 대체로 255에 가까우므로 그 값이 오른쪽 근처에 집중되어 있습니다. 또한, 히스토그램의 분포가 좁은 범위에 존재한다면 픽셀 간에 명도 차이가 작아서 명암의 대비가 좋지 않은 영상을 뜻합니다. 반대로, 넓은 범위에 분포해 있다면 픽셀 간에 명도 차이가 커서 대비가 좋은 영상을 의미합니다. 이처럼 히스토그램은 영상의 특성을 분석할 수 있다는 의미를 가집니다. 또한, 이 분포를 균일하게 변환한다면 명도가 적당한 영상을 얻을 수 있을 것이라 추측할 수 있습니다.

 

3. 히스토그램의 산술 연산 및 이동(Shift)

1) 덧셈 연산(Adding operation)

덧셈 연산이란 각 화소에 특정 값을 더하여 명도 값을 증가 시키는 것을 의미합니다. 명도 값이 증가하게 된다면 결과적으로 영상의 전체적인 밝기가 올라가게 되고, 히스토그램 상에서 높은 밝기를 의미하는 오른쪽 방향으로 이동하게 됩니다.

2) 뺄셈 연산(Minus operation)

반대로, 뺄셈 연산이란 각 화소에 특정 값을 빼서 명도 값을 감소 시키는 것을 의미합니다. 명도 값이 감소한다면 결과적으로 영상이 어둡게 되고, 히스토그램 상에서 낮은 밝기를 의미하는 왼쪽 방향으로 이동하게 됩니다.

3) 곱셈 연산(Multiplying operation)

곱셈 연산이란 각 화소에 특정 값을 곱하는 것을 의미합니다. 1이상의 값을 곱하게 된다면, 낮은 명도의 픽셀은 낮은 폭으로 그 값이 증가하게 되고, 높은 명도의 픽셀은 큰 폭으로 그 값이 증가하게 됩니다. 따라서, 각 픽셀 간의 명도 차이가 증가하게 되고 명암의 대비가 증가합니다. 결론적으로 히스토그램이 넓게 분포하게 됩니다.

4) 나눗셈 연산(Dividing operation)

나눗셈 연산이란 각 화소에 특정 값을 나누는 것을 의미합니다. 1이상의 값을 나누게 된다면, 낮은 명도의 픽셀은 상대적으로 적게 감소할 것이고, 높은 명도의 픽셀은 큰 폭으로 그 값이 감소하게 됩니다. 따라서, 각 픽셀 간의 명도 차이가 감소하게 되고 명암의 대비 또한 감소합니다. 결론적으로 히스토그램이 좁게 분포하게 됩니다.

4. 히스토그램 평활화(Histogram Equalization)의 정의

앞서 살펴본 히스토그램의 의미에서, 우리는 히스토그램의 분포를 균일하게 변환하는 것이 의미가 있다는 것을 깨달았습니다. 말 그대로, 히스토그램 평활화란 명암 값의 분포가 균일하지 못한 영상에 대해 분포를 균일화시킴으로써 영상의 질을 향상시키는 것을 의미합니다. 한곳에 집중되어 있던 명암 값이 균일한 분포를 갖게 된다면, 어두운 영상은 밝아지고 너무 밝은 영상은 조금 어두워져 적당한 명도를 유지하게 됩니다.

 

5. 히스토그램 평활화 순서

1) 명도 값의 빈도수 계산

먼저, 히스토그램을 이용하여 명도 값의 빈도수를 계산합니다. 직접 영상을 분석하여 각 픽셀의 명도 값을 알아낼 수도 있지만, 더 간편하게 계산하기 위해서는 MATLAB 프로그램을 사용합니다.

 

가로의 총 픽셀수를 w라 하고, 세로의 총 픽셀 수를 h라 할 때 이중 반복문을 돌며 각 픽셀의 값을 불러와 hist라는 변수에 저장합니다.

for i = 1 : w
    for j = 1 : h
        k = img(i,j);
        hist(k) = hist(k) + 1;
    end
end

이와 같은 방식으로 명도 값의 빈도수를 계산할 수 있습니다.

 

2) 누적 분포 함수(Cumulative Distribution Function)

누적 분포 함수란, 특정 명도 이하의 값을 가지는 픽셀이 몇개가 있는지를 나타냅니다. 조금 더 자세히 설명하자면, 가로축에는 밝기를 의미하는 0에서 255의 숫자가 기재되어 있습니다. 또한, 세로축에는 각 밝기 이하의 명도를 가지는 픽셀의 확률이 기재되어 있습니다. 이 또한, 간편하게 MATLAB으로 계산할 수 있습니다.

for i = 1 : w * h
    sum += hist(i);
    cdf[i] = sum;
end

3) 정규화(Normalization)

이제, 누적 분포 함수를 이용하여 정규화를 진행합니다. 이 정규화 과정으로 히스토그램 평활화를 마무리 합니다.

for i = 1 : w * h
    image[i] = cdf[i] * HIGH / (w * h); // HIGH: 최대 명암 값
end

댓글