[디지털 영상처리 기초] 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 그래프 역시 표준편차가 커지고 필터의 크기가 확장됨에 따라 우하향하고 있습니다.
그렇다면 실제로도 그러한지 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)
이제 언샤프마스크를 적용해보겠습니다.
가우시안 필터를 적용한 mx_g3와 mx_g7을 미러링방식으로 언샤프마스크를 3개씩 적용하여 6개의 결과를 만들었습니다.
알파 값에 따른 성능의 변화를 확인하기 위하여 psnr 값을 확인해보겠습니다.
언샤프마스크에서 알파 값이 클수록 영상의 품질이 더 개선되는 것을 확인하였습니다.
이유는 블러링 된 영상에 엣지를 강조하여 더 선명하게 만들었다고 생각합니다.
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을 비교해보겠습니다.
g3 가우시안으로 만든 g1과 g3 가우시안으로 만든 g2 모두 가중치 k를 증가(0.2 -> 0.6)시키니까 psnr이 낮아졌습니다. 저는 이유로 gmask를 만드는 것이 원본 영상에서 저주파 통과 필터를 뺀 것이 gmask이기 때문이라고 생각합니다. 이유는 원본-저주파 영상을 하게 된 결과이기 때문에 고주파 성분만 남았을 것입니다. 이를 가중치를 주어서 엣지를 더 강조하게 되는데 여기서는 엣지가 너무 강조되어 영상의 품질이 떨어진 것이라고 판단됩니다.
실제로 확인해보겠습니다.
실제로 원본, g2_1, g2_2를 비교해 보았을 때 g2_2에서 카메라맨에 엣지에 하양색 테두리가 생긴 것을 볼 수 있습니다.
'디지털영상처리기초 > Matlab' 카테고리의 다른 글
[디지털 영상처리 기초] 10. 컬러 영상처리 (0) | 2021.06.29 |
---|---|
[디지털 영상처리 기초] 9. Image Geometry (0) | 2021.06.28 |
[디지털 영상처리 기초] 7. Neighborhood Processing (0) | 2021.06.25 |
[디지털 영상처리 기초] 6. 화소 단위 영상처리 2 (0) | 2021.06.24 |
[디지털 영상처리 기초] 5. 화소 단위 영상처리 (0) | 2021.06.22 |
댓글