CS/디지털영상처리

[디지털영상처리] Histogram Equalization (1)

nowkoes 2023. 10. 12. 12:53

히스토그램 평활화

개요

출처: 위키백과

 

 히스토그램(Histogram)데이터의 분포를 그래프 형태로 시각화한 것이다. 이는 데이터 집합의 각 부분 또는 값의 빈도수를 보여주며, x축(계급, 카테고리)과 y축(빈도)으로 이루어져 있다. 히스토그램은 데이터의 형태, 중심, 분포, 변동, 이상치 등을 빠르게 파악하는 데 유용하다.

 

 디지털 영상 처리에서 히스토그램은 각 픽셀 값이 얼마나 자주 등장하는지를 표현한다. 즉, x축으로는 이미지의 각 픽셀 밝기를, y축으로는 픽셀 수를 표현한다. 이미지 f(x, y) 함수를 정규화되지 않은 히스토그램으로 표현하면 다음과 같다. 

 

 

 여기서 rk는 k번째 계급을 의미하고, nk는 f(x, y)에서의 픽셀 수를 의미한다. 이 형태의 히스토그램은 이미지에서 각 밝기 레벨의 빈도수를 직접적으로 보여준다. 만약 이를 이미지의 크기로 정규화하면 다음과 같이 수식화할 수 있다.

 

 

 여기서 p(rk)는 픽셀 값이 rk인 확률을 나타낸다. 여기서 히스토그램을 정규화했을 때, 히스토그램이 확률 분포로 바뀜으로써 다양한 통계적 분석과 처리를 수행할 수 있게 된다. 또한 다양한 크기의 이미지 간 히스토그램을 균일하게 비교할 수 있다.

 

 이번 시간에는 이러한 이미지의 히스토그램을 다뤄보는 시간을 가지도록 하겠다.


본문

히스토그램의 분포와 이미지 밝기 관계

histo_ex.jpg

 

 다음과 같은 이미지 샘플이 있다고 가정해 보자. 지금부터 이미지의 밝기와 히스토그램의 분포의 관계에 대해 살펴보도록 하겠다. 

 

Ig = rgb2gray(imread('histo_ex.jpg'));

figure(1);
subplot(1,2,1); imshow(Ig, []);
subplot(1,2,2); histogram(double(Ig), 0:255);

histogram 함수의 설명 출처: mathworks

 

 매트랩에서는 배열에 해당하는 요소들을 히스토그램화시켜주는 histogram() 함수가 존재한다. 이 분포를 움직여, 이미지의 밝기/대비와 어떤 관계에 있는지 확인해 보자.

 

1. 전체적인 밝기를 낮출 때

Ig = rgb2gray(imread('histo_ex.jpg'));

for cnt = 1:30
    Ig = Ig - 1;
    plotHistogram(Ig);
end

function plotHistogram(Ig)
    figure(2);
    subplot(1,2,1); imshow(Ig);
    subplot(1,2,2); histogram(double(Ig), 0:255);
end

 

2. 전체적인 밝기를 높일 때

Ig = rgb2gray(imread('histo_ex.jpg'));
figure(3);

for cnt = 1:40
    Ig = Ig + 3;
    plotHistogram(Ig);
end

function plotHistogram(Ig)
    figure(2);
    subplot(1,2,1); imshow(Ig);
    subplot(1,2,2); histogram(double(Ig), 0:255);
end

 

3. 중앙으로 모았을 때 

Ig = rgb2gray(imread('histo_ex.jpg'));
center_value = median(double(Ig(:)));
target_value = uint8(255/2);

figure(4);

while median(double(Ig(:))) ~= target_value
    Ig = Ig + 1;
    plotHistogram(Ig);
end

function plotHistogram(Ig)
    figure(4);
    subplot(1,2,1); imshow(Ig);
    subplot(1,2,2); histogram(double(Ig), 0:255);
end

 

 이 코드는 Ig의 중앙값을 이용해 히스토그램을 중앙으로 옮기는 코드다. 즉, center_value를 계산해, 이 값이 target_value가 될 때까지 Ig를 1씩 더해주는 코드다.

 

왼쪽부터 figure(2), figure(3), figure(4)

 

 여기서 이미지의 대비와, 밝기가 바뀌면 히스토그램이 변화한다는 사실을 알 수 있다. 

 

  • 히스토그램이 왼쪽에 몰렸을 때: 밝기가 어두워짐
  • 히스토그램이 오른쪽에 몰렸을 때: 밝아짐
  • 히스토그램이 중앙에 몰렸을 때: 대비가 낮아짐

 

 그렇다면 전체적인 이미지의 품질을 히스토그램을 이용하여 높이려면 어떻게 해야 할까? 해당 내용은 다음 포스트에서 다루도록 하겠다.

반응형