본문 바로가기
디지털영상처리기초/Matlab

[디지털 영상처리 기초] 8. Neighborhood Processing 2

by CodingKwon 2021. 6. 27.

[디지털 영상처리 기초] 8. Neighborhood Processing 2

 

가우시안 필터링

1. 가우시안 필터로 공간필터링을 실행하시오.

– 입력 영상: 카메라맨

– 가우시안 필터는 다음 범위에서 효과를 확인할 수 있도록 여러 개를 사용

• 가우시안 필터의 크기: 3~15

• 표준편차: 0.1~7.0

– 공간필터링 과정의 프레임 에지 처리 방법: 미러링

– 필터의 크기와 표준편차를 변화시키면서 블러링 정도를 PSNR로 비교하시오.

• 필터의 크기와 표준편차의 변화에 대한 조합은 블러링의 정도가 다양하게 나올 수 있도록 학생들이 결정하시오. (표준편차가 큰 경우 필터의 크기도 커져야 하는데 이를 프로그래밍하여 자동으로 표준편차에 따라서 필터의 크기가 확장되도록 작성하시오.)

• PSNR은 실습에서 사용했음.

• 필터의 크기와 표준편차를 변화할 때 PSNR을 표시하는 그래프를 그리시오.

 

표준편차에 따라서 필터가 확장되도록 7개의 필터를 미러링방식으로 준비했습니다.

 

% 원본영상
x = imread('cameraman.tif');

%  g1 (크기 3x3, 표준편차 1, 방식: 미러링)
g1 = fspecial('gaussian', [3,3], 1);
wr = floor(size(g1, 1) / 2);
wc = floor(size(g1, 2) / 2);
m_x = [x(wr:-1:1, : ); x; x(end:-1:end-(wr-1), :)];
m_x = [m_x(:, wc:-1:1), m_x, m_x(:, end:-1:end-(wc-1))];

x_g1 = uint8(filter2(g1, m_x, 'valid'));

%  g2 (크기 5x5, 표준편차 2, 방식: 미러링)
g2 = fspecial('gaussian', [5,5], 2);
wr = floor(size(g2, 1) / 2);
wc = floor(size(g2, 2) / 2);
m_x = [x(wr:-1:1, : ); x; x(end:-1:end-(wr-1), :)];
m_x = [m_x(:, wc:-1:1), m_x, m_x(:, end:-1:end-(wc-1))];

x_g2 = uint8(filter2(g2, m_x, 'valid'));

%  g3 (크기 7x7, 표준편차 3, 방식: 미러링)
g3 = fspecial('gaussian', [7,7], 3);
wr = floor(size(g3, 1) / 2);
wc = floor(size(g3, 2) / 2);
m_x = [x(wr:-1:1, : ); x; x(end:-1:end-(wr-1), :)];
m_x = [m_x(:, wc:-1:1), m_x, m_x(:, end:-1:end-(wc-1))];

x_g3 = uint8(filter2(g3, m_x, 'valid'));

%  g4 (크기 9x9, 표준편차 4, 방식: 미러링)
g4 = fspecial('gaussian', [9,9], 4);
wr = floor(size(g4, 1) / 2);
wc = floor(size(g4, 2) / 2);
m_x = [x(wr:-1:1, : ); x; x(end:-1:end-(wr-1), :)];
m_x = [m_x(:, wc:-1:1), m_x, m_x(:, end:-1:end-(wc-1))];

x_g4 = uint8(filter2(g4, m_x, 'valid'));

%  g5 (크기 11x11, 표준편차 5, 방식: 미러링)
g5 = fspecial('gaussian', [11,11], 5);
wr = floor(size(g5, 1) / 2);
wc = floor(size(g5, 2) / 2);
m_x = [x(wr:-1:1, : ); x; x(end:-1:end-(wr-1), :)];
m_x = [m_x(:, wc:-1:1), m_x, m_x(:, end:-1:end-(wc-1))];

x_g5 = uint8(filter2(g5, m_x, 'valid'));

%  g6 (크기 13x13, 표준편차 6, 방식: 미러링)
g6 = fspecial('gaussian', [13,13], 6);
wr = floor(size(g6, 1) / 2);
wc = floor(size(g6, 2) / 2);
m_x = [x(wr:-1:1, : ); x; x(end:-1:end-(wr-1), :)];
m_x = [m_x(:, wc:-1:1), m_x, m_x(:, end:-1:end-(wc-1))];

x_g6 = uint8(filter2(g6, m_x, 'valid'));

%  g7 (크기 15x15, 표준편차 7, 방식: 미러링)
g7 = fspecial('gaussian', [15,15], 7);
wr = floor(size(g7, 1) / 2);
wc = floor(size(g7, 2) / 2);
m_x = [x(wr:-1:1, : ); x; x(end:-1:end-(wr-1), :)];
m_x = [m_x(:, wc:-1:1), m_x, m_x(:, end:-1:end-(wc-1))];

x_g7 = uint8(filter2(g7, m_x, 'valid'));

% psnr
psnr_g1 = psnr(x_g1, x), psnr_g2 = psnr(x_g2, x), psnr_g3 = psnr(x_g3, x)
psnr_g4 = psnr(x_g4, x), psnr_g5 = psnr(x_g5, x), psnr_g6 = psnr(x_g6, x)
psnr_g7 = psnr(x_g7, x)

% 그래프 확인하기 (표준편차)
plot([psnr_g1, psnr_g2, psnr_g3, psnr_g4, psnr_g5, psnr_g6, psnr_g7]), title('필터의 크기와 표준편차의 변화에 대한 psnr')

% 실제 이미지
figure, subplot(1,3,1), imshow(x), title('원본')
subplot(1,3,2), imshow(x_g3), title('g3 (크기 7x7, 표준편차 3)')
subplot(1,3,3), imshow(x_g7), title('g7 (크기 15x15, 표준편차 7)')

가우시안 필터 표준편차에 따른 PSNR 비교

 

표준편차에 따라서 필터가 확장됨에 따라 psnr이 낮아지고 있습니다. 즉 표준편차가 클수록 psnr이 낮아지며 영상의 품질 또한 낮아진다고 할 수 있습니다. (블러링이 심해짐)

가우시안 필터의 크가와 표준편차의 변화에 대한 PSNR 그래프

psnr 그래프 역시 표준편차가 커지고 필터의 크기가 확장됨에 따라 우하향하고 있습니다.

그렇다면 실제로도 그러한지 3개의 표본을 확인해보겠습니다.

가우시안 표준편차에 따른 실제 영상 비교

실제로도 영상이 점차 블러링되고 있는 것을 확인할 수 있습니다.

 

 

 

언샤프마스킹

1) fspecial() 함수의 unsharp 옵션으로 언샤프마스크를 설계하고 공간 필터를 사용하여 언샤프마스킹을 구현하시오.

입력 영상: 가우시안 블러링이 적용된 카메라맨 영상 (앞 문제의 결과 중 임의의 2 개 영상 선택)

알파 값의 변화에 따라서 성능의 변화를 분석하시오.

 

먼저 입력영상 2개로 앞 문제에서 만든 g3 필터 (크기 7x7, 표준편차 3, 방식: 미러링), x_g3 (g3필터 적용 영상)와 g7 필터 (크기 15x15, 표준편차 7, 방식: 미러링), x_g7 (g7필터 적용 영상)를 이용하겠습니다.

 

% 원본영상
x = imread('cameraman.tif');

%  g3 (크기 7x7, 표준편차 3, 방식: 미러링)
g3 = fspecial('gaussian', [7,7], 3);
wr = floor(size(g3, 1) / 2);
wc = floor(size(g3, 2) / 2);
m_x = [x(wr:-1:1, : ); x; x(end:-1:end-(wr-1), :)];
m_x = [m_x(:, wc:-1:1), m_x, m_x(:, end:-1:end-(wc-1))];

x_g3 = uint8(filter2(g3, m_x, 'valid'));

% 가우시안 블러링 g3(크기 7x7, 표준편차 3, 방식: 미러링)
mask = ones(3,3);
wr = floor(size(mask, 1) / 2);
wc = floor(size(mask, 2) / 2);
mx_g3 = [x_g3(wr:-1:1, : ); x_g3; x_g3(end:-1:end-(wr-1), :)];
mx_g3 = [mx_g3(:, wc:-1:1), mx_g3, mx_g3(:, end:-1:end-(wc-1))];

%  g7 (크기 15x15, 표준편차 7, 방식: 미러링)
g7 = fspecial('gaussian', [15,15], 7);
wr = floor(size(g7, 1) / 2);
wc = floor(size(g7, 2) / 2);
m_x = [x(wr:-1:1, : ); x; x(end:-1:end-(wr-1), :)];
m_x = [m_x(:, wc:-1:1), m_x, m_x(:, end:-1:end-(wc-1))];

x_g7 = uint8(filter2(g7, m_x, 'valid'));

% 가우시안 블러링 g7(크기 15x15, 표준편차 7, 방식: 미러링)
mask = ones(3,3);
wr = floor(size(mask, 1) / 2);
wc = floor(size(mask, 2) / 2);
mx_g7 = [x_g7(wr:-1:1, : ); x_g7; x_g7(end:-1:end-(wr-1), :)];
mx_g7 = [mx_g7(:, wc:-1:1), mx_g7, mx_g7(:, end:-1:end-(wc-1))];

% unsharp 마스크
u1 = fspecial('unsharp', 0.2)
u2 = fspecial('unsharp', 0.4)
u3 = fspecial('unsharp', 1)

% 언샤프마스크 적용
u1_g3 = uint8(filter2(u1, mx_g3, 'valid'));
u2_g3 = uint8(filter2(u2, mx_g3, 'valid'));
u3_g3 = uint8(filter2(u3, mx_g3, 'valid'));

u1_g7 = uint8(filter2(u1, mx_g7, 'valid'));
u2_g7 = uint8(filter2(u2, mx_g7, 'valid'));
u3_g7 = uint8(filter2(u3, mx_g7, 'valid'));

% psnr 확인
psnr_u1_g3 = psnr(u1_g3, x)
psnr_u2_g3 = psnr(u2_g3, x)
psnr_u3_g3 = psnr(u3_g3, x)

psnr_u1_g7 = psnr(u1_g7, x)
psnr_u2_g7 = psnr(u2_g7, x)
psnr_u3_g7 = psnr(u3_g7, x)

imshow(u1_g7)

 

언샤프 마스크 unsharp mask

이제 언샤프마스크를 적용해보겠습니다.

가우시안 필터를 적용한 mx_g3와 mx_g7을 미러링방식으로 언샤프마스크를 3개씩 적용하여 6개의 결과를 만들었습니다.

알파 값에 따른 성능의 변화를 확인하기 위하여 psnr 값을 확인해보겠습니다.

PSNR 비교

언샤프마스크에서 알파 값이 클수록 영상의 품질이 더 개선되는 것을 확인하였습니다.

이유는 블러링 된 영상에 엣지를 강조하여 더 선명하게 만들었다고 생각합니다.

가우시안 블러링 영상에 언샤프 마스크(0.2) 적용

 

 

2) 다음 식을 사용하여 언샤프 마스크 필터를 구성하고 구현하시오.

언샤프 마스크

– 위 문제에서 사용한 가우시안 블러링 영상을 입력으로 사용하시오

 

위 문제에서 사용한 가우시안 블러링 영상 2개를 입력으로 사용하겠습니다.

- g3 필터 (크기 7x7, 표준편차 3, 방식: 미러링), x_g3 (g3필터 적용 영상)

- g7 필터 (크기 15x15, 표준편차 7, 방식: 미러링), x_g7 (g7필터 적용 영상)

 

% 원본영상
x = imread('cameraman.tif');

%  g3 (크기 7x7, 표준편차 3)
g3 = fspecial('gaussian', [7,7], 3);
wr = floor(size(g3, 1) / 2);
wc = floor(size(g3, 2) / 2);
m_x = [x(wr:-1:1, : ); x; x(end:-1:end-(wr-1), :)];
m_x = [m_x(:, wc:-1:1), m_x, m_x(:, end:-1:end-(wc-1))];

% f'(x,y) - 1
x_g3 = uint8(filter2(g3, m_x, 'valid'));

%  g7 (크기 15x15, 표준편차 7)
g7 = fspecial('gaussian', [15,15], 7);
wr = floor(size(g7, 1) / 2);
wc = floor(size(g7, 2) / 2);
m_x = [x(wr:-1:1, : ); x; x(end:-1:end-(wr-1), :)];
m_x = [m_x(:, wc:-1:1), m_x, m_x(:, end:-1:end-(wc-1))];

% f'(x,y) - 2
x_g7 = uint8(filter2(g7, m_x, 'valid'));

 

언샤프 마스크 필터를 구성하여 구현해보겠습니다.

원본영상에서 low pass filter를 빼줍니다. 즉 가우시안 필터 된 영상을 빼줍니다.

gmask1은 g3로 만든 가우시안 영상을 빼준 것이고, gmask2는 g7으로 만든 가우시안 영상을 빼준 것입니다.

각각 가중치를 0.2와 0.6 두 개씩 적용해보았습니다.


% 언샤프 마스크 필터를 구성하고 구현
gmask1 = x - x_g3;
g1_1 = x + 0.2 * gmask1
g1_2 = x + 0.6 * gmask1

gmask2 = x - x_g7;
g2_1 = x + 0.2 * gmask2
g2_2 = x + 0.6 * gmask2

% psnr 확인
p_g1_1 = psnr(g1_1, x), p_g1_2 = psnr(g1_2, x)
p_g2_1 = psnr(g2_1, x), p_g2_2 = psnr(g2_2, x)

subplot(1,3,1), imshow(x), title('원본')
subplot(1,3,2), imshow(g2_1), title('g2_1')
subplot(1,3,3), imshow(g2_2), title('g2_2')

 

 

이제 psnr을 비교해보겠습니다.

unsharp 마스크 가중치에 따른 PSNR 비교

g3 가우시안으로 만든 g1과 g3 가우시안으로 만든 g2 모두 가중치 k를 증가(0.2 -> 0.6)시키니까 psnr이 낮아졌습니다. 저는 이유로 gmask를 만드는 것이 원본 영상에서 저주파 통과 필터를 뺀 것이 gmask이기 때문이라고 생각합니다. 이유는 원본-저주파 영상을 하게 된 결과이기 때문에 고주파 성분만 남았을 것입니다. 이를 가중치를 주어서 엣지를 더 강조하게 되는데 여기서는 엣지가 너무 강조되어 영상의 품질이 떨어진 것이라고 판단됩니다.

 

실제로 확인해보겠습니다.

unsharp 마스크 적용 영상 비교

실제로 원본, g2_1, g2_2를 비교해 보았을 때 g2_2에서 카메라맨에 엣지에 하양색 테두리가 생긴 것을 볼 수 있습니다.

댓글