안녕하세요. 지난 포스팅의 디지털 영상 처리 - 주파수 도메인 필터를 이용한 영상 샤프닝 구현에 이어서 오늘은 영상 스무딩을 MATLAB으로 구현해보도록 하겠습니다. 전체 코드는 아래의 깃허브 링크에 있습니다.
주파수 도메인에서의 영상 스무딩을 다들 제대로 이해하셨다면 필터링 과정 자체는 다르지 않다는 것을 아실겁니다. 다른 점은 오직 어떤 마스크를 쓰느냐에 따라서 달라지죠. 그래서 저는 함수를 구현할 때, 저역 통과 필터링 하나의 함수에서 어떤 타입의 필터링을 수행할 것인지 파라미터로 넘겨주면 그에 따른 마스크를 만들어주는 방식으로 구현하였습니다.
function [reject_image] = LPF(image,D0,type,n)
if type=="ideal"
mask = IdealMaskGenerator(size(image),D0);
elseif type=="butterworth"
mask = ButterworthMaskGenerator(size(image), D0, n);
elseif type == "Gaussian"
mask = GaussianMaskGenerator(size(image), D0);
end
image_fft = fftshift(fft2(double(image)));
reject_image_fft = image_fft .* mask;
reject_image = uint8(real(ifft2(ifftshift(reject_image_fft))));
end
전체적인 구조를 보시면 일단 타입에 따라서 마스크를 생성합니다. 그리고 입력 영상의 자료형은 uint8이기 때문에 입력 영상을 double로 캐스팅해줍니다. 그리고 MATLAB에서 지원하는 fft2 함수를 이용해서 2차원 푸리에 변환을 적용합니다. 그 다음으로 $(-1)^{x + y}$를 적용하는 fftshift 함수를 이용하여 중심이동을 시켜줍니다. 그러면 영상 도메인에서 주파수 도메인으로의 변환은 완료되었습니다. 그 다음 단계는 다들 아시다 싶이 첫번째 단계에서 만들어놓은 마스크에 주파수 도메인에서 필터링을 수행합니다. 그 다음에서는 역방향으로 ifftshift 함수를 적용한 뒤 ifft2를 하면 주파수 도메인에서 영상 도메인으로 변환됩니다. 여기서 중요한 점은 영상이라는 것은 기본적으로 실수형 uint8 자료형이기 때문에 실수값만 뽑아서 uint8로 캐스팅해주면 모든 과정이 끝나게 됩니다. 아래의 코드들은 각각 주파수 도메인에서 이상적, Butterworth, Gaussian 필터들을 정의하는 함수들입니다. 코드만 보시더라도 바로 아래의 수식을 이용했다는 것을 쉽게 아실 수 있습니다.
function [mask] = IdealMaskGenerator(imageSize, D0)
%IdealMaskGenerator : 이상적 저역 주파수 필터링을 위한 마스크를 생성하는 함수
% Input
% 1. inputSize : 입력 영상의 크기 -> 마스크 영상의 크기를 정하기 위한 입력 파라미터
% 2. D0 : 대역 차단을 시킬 최대 범위
% Output : 이상적 저역 주파수 필터링을 위한 마스크
width = imageSize(1);
height = imageSize(2);
mask = zeros(width, height);
for i = 1 : height
for j = 1 : width
D = sqrt((i - width/2)^2+(j - height/2)^2);
if D < D0
mask(i, j) = 1;
end
end
end
end
function [mask] = ButterworthMaskGenerator(imageSize,D0,n)
%ButterworthMaskGenerator : Butterworth 저역 주파수 필터링을 위한 마스크를 생성하는 함수
% Input
% 1. inputSize : 입력 영상의 크기 -> 마스크 영상의 크기를 정하기 위한 입력 파라미터
% 2. D0 : 최대 마스크 값의 50%가 되는 지점
% 3. n : Butterworth 마스크의 차수
% Output : Butterworth 저역 주파수 필터링을 위한 마스크
width = imageSize(1);
height = imageSize(2);
mask = zeros(width, height);
for i=1:height
for j=1:width
D = sqrt((i - (height/2))^2+(j - (width/2))^2);
denominator = 1 + (D / D0)^(2*n);
mask(i, j) = 1/denominator;
end
end
end
function [mask] = GaussianMaskGenerator(imageSize,D0)
%GaussianMaskGenerator : Gaussian 저역 주파수 필터링을 위한 마스크를 생성하는 함수
% Input
% 1. inputSize : 입력 영상의 크기 -> 마스크 영상의 크기를 정하기 위한 입력 파라미터
% 2. D0 : 대역 차단을 위한 범위 -> 분산(variance)와 동일한 역
% Output : Gaussian 저역 주파수 필터링을 위한 마스크
width = imageSize(1);
height = imageSize(2);
mask = zeros(width, height);
for i=1:height
for j=1:width
D = sqrt((i - (height/2))^2+(j - (width/2))^2);
expoValue = -D^2/(2*D0^2);
mask(i, j) = exp(expoValue);
end
end
end
마지막으로 각 필터링의 결과를 보고 마치도록 하겠습니다.
이론 파트에서도 설명드렸지만 ILPF와 BLPF,GLPF의 가장 큰 차이점은 마스크의 불연속성에 대한 것이였습니다. 그리고 불연속성은 저희가 원치않는 인위적 구조물인 물결파동 현상을 만든다고도 말씀드렸죠. 실제로의 위의 ILPF는 물결 파동 현상이 발생하였지만 다른 필터들은 발생하지 않은 것을 볼 수 있습니다.
'image processing' 카테고리의 다른 글
디지털 영상 처리 - 선택적 필터링 (0) | 2021.04.28 |
---|---|
디지털 영상 처리 - 주파수 도메인 필터를 이용한 영상 샤프닝 구현 (0) | 2021.04.26 |
디지털 영상 처리 - 주파수 도메인 필터를 이용한 영상 샤프닝 (0) | 2021.04.19 |
디지털 영상 처리 - 주파수 도메인 필터를 이용한 영상 스무딩 (1) | 2021.04.16 |
디지털 영상 처리 - 주파수 공간 필터링 기초 (0) | 2021.04.13 |