CS/디지털영상처리

[디지털영상처리] Histogram Processing (2)

nowkoes 2023. 10. 17. 13:18

본문

Local Histogram Processing

 

 히스토그램 매칭을 사용하면 특정 경우에 이미지의 대비가 부족해질 수 있다. 예를 들어, 위 그림의 다섯 개의 검은색 네모 안의 영역처럼 밝기가 낮아 세부 내용을 확인하기 어려울 때가 있다. 이러한 문제를 해결하기 위해 히스토그램 평활화를 적용해 보면, 영상의 대비는 향상되지만, 특정 계급에 픽셀 값이 과도하게 집중될 수 있다. 이런 현상은 원활한 영상 처리에 방해가 된다.

 

원본 이미지의 히스토그램 분포(좌), 평활화를 거친 히스토그램의 분포와 이미지(우)

 

 영상 처리에서 전역적인 처리 방법이 아닌, 영상의 각 지역별로 다르게 처리를 하고 싶을 때 지역 히스토그램 처리(Local Histogram Processing) 기법이 필요하게 된다. 이 방법은 영상의 각 부분별로 히스토그램 평활화나 조정을 수행하여, 그 지역의 세부적인 특성을 개선하거나 강조하는데 유용하다. 예를 들어, 일부 지역이 너무 어둡거나 밝아서 세부 정보가 눈에 잘 들어오지 않을 때, 지역 히스토그램 처리를 통해 해당 부분만을 대상으로 명암 대비를 개선할 수 있다.

 

 기본 원리와 과정은 다음과 같다. 이미지 내에서 처리하고자 하는 이웃을 정의하고, 각 이웃에서의 히스토그램을 계산한다. 그리고 이미지의 지역적인 특성을 개선하거나 강조하여 결과 이미지를 생성한다.


구현

Ig = rgb2gray(imread("histo_local2.jpg"));
Ires = Ig;
[m,n] = size(Ig);

g_mean = mean(Ig(:));
g_sigma = std(double(Ig(:)));
wsize = 3;
half_wsize = floor(wsize/2);

 우선 이웃(neigborhood)을 정의해야 한다. 이웃은 어떻게 정의하냐에 따라 다르지만, 이번 포스팅에서는 3 x 3 정사각형 행렬을 기준으로 진행하겠다. 그리고 위의 이미지에서 옅은 회색조의 숨겨진 이미지의 대비를 개선하기 위한 통계적 자료로 평균과 표준편차를 사용한다.

 

for i = 1+half_wsize : m-half_wsize
    for j = 1+half_wsize : n-half_wsize
        neighbor = Ig(i-half_wsize:i+half_wsize, j-half_wsize:j+half_wsize);
        neighbor_mean = mean(neighbor(:));
        neighbor_sigma = std(double(neighbor(:)));

        if (neighbor_mean <= g_mean) && (neighbor_sigma <= g_sigma)
            Ig(i,j) = Ig(i,j) * 20; 
        end
    end
end

figure(1);
subplot(1,2,1); imshow(Ig);
subplot(1,2,2); imshow(Ires);

출력

 

 특정 픽셀 값이 회색 배경에 있을 때, 검은색 배경과 회색 배경에 걸쳐져 있을 때, 검은색 배경에 있을 때로 나누어 보자. 즉, 이웃들의 분포가 검은색 배경으로 되어 있으면, 이웃들의 분포 평균 밝기가 낮을 것이며, 표준편차 또한 낮게 나타날 것이다. 반대로 이웃이 회색과 검은색 배경에 걸쳐 있으면, 평균 밝기는 전체 이미지의 평균 발기와 비슷하거나 조금 높게 나타나며, 표준편차는 높게 나타날 것이다. 여기서 세밀한 조절을 하려면 밝기와 표준편차에 상수 k를 이용해 세밀한 조절을 할 수 있다.

 

 또한, 원본 이미지의 값을 직접 변경하면 안 된다. 만약 원본 배열 Ig에 직접적인 수정을 하면, 기준이 되는 전역 평균과 표준편차 지표와 이웃과의 지표가 비틀린다. 쉽게 얘기하면, 이미지의 픽셀을 직접 수정하며 이미 처리된 픽셀이 다시 처리되거나, 이미지 내에서 연속적으로 처리되는 픽셀들 사이의 관계나 패턴이 깨질 수 있다.

 

Ires가 아닌 Ig만 썼을 때 결과

 

총합본

더보기
Ig = rgb2gray(imread("histo_local2.jpg"));
Ires = Ig;
[m,n] = size(Ig);

g_mean = mean(Ig(:));
g_sigma = std(double(Ig(:)));
wsize = 3;
half_wsize = floor(wsize/2);

for i = 1+half_wsize : m-half_wsize
    for j = 1+half_wsize : n-half_wsize
        neighbor = Ig(i-half_wsize:i+half_wsize, j-half_wsize:j+half_wsize);
        neighbor_mean = mean(neighbor(:));
        neighbor_sigma = std(double(neighbor(:)));

        if (neighbor_mean <= g_mean) && (neighbor_sigma <= g_sigma)
            Ig(i,j) = Ig(i,j) * 20; 
        end
    end
end

figure(1);
subplot(1,2,1); imshow(Ig);
subplot(1,2,2); imshow(Ires);

요약

히스토그램 처리
1. 히스토그램 매칭
 a. 정의: 이미지의 히스토그램을 조절하여 참조 이미지의 히스토그램과 유사하게 만드는 기법
  - 두 이미지의 색상 분포나 밝기 분포가 조절되는 과정에서, 그들 사이의 순서나 대소 관계가 바뀌지 않으므로
    윤곽은 남아 있음
 b. 특징: 주로 영상 간의 대비나 밝기 분포를 통일시키기 위해 사용
 c. 과정
  ① 입력 이미지의 히스토그램 T(r)과 참조 이미지의 히스토그램 G(z)를 평활화
  ② z를 역함수 G-1(s) = G-1(T(r))을 이용해 구함

2. 지역 히스토그램 처리
 a. 정의: 이미지의 지역적인 부분에 히스토그램 처리를 수행하는 방법
 b. 특징: 지역적인 특징을 강조하거나 보정하기 위해 사용
 c. 과정
  ① 이웃을 정의
  ② 이웃에 대한 통계적 자료 정의, 혹은 이미지 전체적인 통계적 자료 (평균, 표준편차 등)
  ③ 이웃과 통계적 지표를 이용해 이미지 개선
반응형