안녕하세요. 지난 포스팅의 디지털 영상 처리 - 주파수 도메인 필터를 이용한 영상 스무딩 구현에서는 MATLAB을 이용해서 주파수 도메인을 이용하여 영상 스무딩을 적용해보았습니다. 다시 한번 말씀드리지만 이러한 관계가 성립하는 가장 기본적인 원리는 컨볼루션 정리입니다!! 오늘은 지난 포스팅에 이어서 주파수 도메인 필터를 이용해서 영상 샤프닝을 구현해보도록 하겠습니다. 전체 코드는 아래의 깃허브 링크를 참조해주시길 바랍니다.
사실 지난 포스팅과 크게 다른 점이 없습니다. 일단 고주파 통과 필터링 역시 어떤 필터를 사용하느냐에 따라서 이상적, Butterworth, 가우시안으로 나뉘게 됩니다. 그리고 저주파 통과 필터와는 아래의 관계식이 성립합니다.
$$H_{\text{HP}} = 1 - H_{\text{LP}}$$
그래서 실제로 수식도 아래와 같습니다.
이를 코딩을 이용하면 기존 저주파 통과 필터 생성 함수를 활용하면 됩니다.
function [HighPassFilter] = IdealHighPassMaskGenerator(imageSize,D0)
LowPassFilter = IdealLowPassMaskGenerator(imageSize, D0);
HighPassFilter = 1 - LowPassFilter;
end
function [HighPassFilter] = ButterworthHighPassMaskGenerator(imageSize,D0,n)
LowPassFilter = ButterworthLowPassMaskGenerator(imageSize, D0, n);
HighPassFilter = 1 - LowPassFilter;
end
function [HighPassFilter] = GaussianHighPassMaskGenerator(imageSize, D0)
LowPassFilter = GaussianLowPassMaskGenerator(imageSize, D0);
HighPassFilter = 1 - LowPassFilter;
end
코드를 보시면 그냥 1에서 저주파 통과 필터를 뺀 것을 볼 수 있습니다. 아주 간단하죠? 필터링 하는 과정은 어차피 저주파 통과 필터링과 동일한 알고리즘이기 때문에 코드는 생략하고 결과만 보도록 하겠습니다.
위에서부터 각각 이상적, Butterworth, 가우시안 고주파 통과 필터를 이용한 결과입니다. IHPF를 이용하면 ILPF와 마찬가지로 물결파동 현상이 일어나는 것을 관찰할 수 있습니다. 하지만 나머지 필터들에서는 관찰되지 않습니다.
지금까지 한것은 고주파 영역, 즉 엣지 영역을 추출해낸것과 동일합니다. 이제는 실질적으로 이 결과들을 이용해서 영상 샤프닝을 이용해보겠습니다. 먼저, 라플라시안 필터링의 코드와 결과입니다.
function [sharpen_image, laplacian_image] = LaplacianFiltering(image)
[width,height] = size(image);
mask = zeros([width, height]);
for i=1:width
for j=1:height
distance = sqrt((j - height/2)^2 + (i - width/2)^2);
mask(i, j) = -4*(pi^2)*(distance^2);
end
end
image_fft = fftshift(fft2(double(image)));
laplacian_image = real(ifft2(ifftshift(image_fft .* mask)));
laplacian_image = uint8(laplacian_image ./ max(laplacian_image, [], 'all'));
sharpen_image = image - laplacian_image;
end
이 부분은 제가 제대로 구현을 못한 것인지 모르겠지만 큰 차이는 보이지 않았습니다. 다음으로 다른 샤프닝 알고리즘인 언샤프 마스킹과 고주파 증폭을 하나로 합친 고주파 강조 필터링의 코드와 결과를 보도록 하겠습니다.
function [filtered_image] = HighFrequencyEmphasisFiltering(image, k1, k2, type, D0, n)
if type=="ideal"
mask = IdealHighPassMaskGenerator(size(image),D0);
elseif type=="butterworth"
mask = ButterworthHighPassMaskGenerator(size(image), D0, n);
elseif type == "gaussian"
mask = GaussianHighPassMaskGenerator(size(image), D0);
end
image_fft = fftshift(fft2(double(image)));
filtered_fft = (k1 + k2 * mask) .* image_fft;
filtered_image = uint8(real(ifft2(ifftshift(filtered_fft))));
end
이번에는 비교적 결과가 더 좋은 것을 볼 수 있습니다. 고주파 증폭 필터링은 $k1$과 $k2$의 값에 따라서 다양한 결과를 얻을 수 있다는 것이 특징입니다.
마지막으로 준동형 필터링의 코드와 결과를 보도록 하겠습니다.
function [filtered_image] = HomomorphicFiltering(image, D0, gammaL, gammaH, type,n)
if type=="ideal"
mask = IdealHighPassMaskGenerator(size(image),D0);
elseif type=="butterworth"
mask = ButterworthHighPassMaskGenerator(size(image), D0, n);
elseif type == "gaussian"
mask = GaussianHighPassMaskGenerator(size(image), D0);
end
mask = (gammaH - gammaL) * mask + gammaL;
ln_image = log(1 + double(image)); % image -> ln(image)
ln_image_fft = fftshift(fft2(ln_image)); % ln(image) -> fft(ln(image))
ln_filtered_image_fft = mask .* ln_image_fft; % fft(ln(image)) -> fft(ln(image)) * mask
ln_filtered_image = real(ifft2(ifftshift(ln_filtered_image_fft))); % fft(ln(image)) * mask -> real(ifft(fft(ln(image)) * mask))
filtered_image = uint8(exp(ln_filtered_image)); % real(ifft(fft(ln(image)) * mask)) -> exp(real(ifft(fft(ln(image)) * mask)))
end
준동형 필터링은 꽤나 좋은 결과를 얻었습니다. 인체의 장기와 뼈가 살에 비해서 비교적 더 강조되었기 때문입니다.
'image processing' 카테고리의 다른 글
디지털 영상 처리 - 영상 열화 및 복원 과정 모델 (0) | 2021.05.02 |
---|---|
디지털 영상 처리 - 선택적 필터링 (0) | 2021.04.28 |
디지털 영상 처리 - 주파수 도메인 필터를 이용한 영상 스무딩 구현 (1) | 2021.04.25 |
디지털 영상 처리 - 주파수 도메인 필터를 이용한 영상 샤프닝 (0) | 2021.04.19 |
디지털 영상 처리 - 주파수 도메인 필터를 이용한 영상 스무딩 (1) | 2021.04.16 |