在matlab上用小尺寸高斯低通滤波器对一张较大的图像进行频率域滤波,过程是先将图片和滤波器填充到相同大小,再变换到频率域进行滤波,滤波结果显示为一张全白图片,原图像为2160×2160大小的一张风景图,问题代码如下:
%读取图像
clc;clear;
img = imread('C:\Users\86155\Desktop\yinghua.jpg');
origin = rgb2gray(img);
[rows, cols] = size(origin);
sigma = 5;%滤波器标准差
%在频率域用高斯低通滤波器处理
for k = 3:2:33 %滤波器尺寸从3—33
%%将图像和高斯滤波器填充零到相同大小(行列数均为2160+k-1),并做傅里叶变换
pad_img = padarray(origin,[k-1 k-1],0,'post');%图像填充及FFT
F_img = fft2(double(pad_img));
F_img = fftshift(F_img);
spain_gaus = fspecial('gaussian',[k k],sigma);%产生空间域高斯低通滤波器,填充及FFT
pad_spain_gaus = padarray(spain_gaus,[1079 1079],0,'both');
pad_spain_gaus = padarray(pad_spain_gaus,[1 1],0,'pre');
fft_gaus = fft2(double(pad_spain_gaus));
shift_fft_gaus = fftshift(fft_gaus);
figure;imshow(1+log10(abs(shift_fft_gaus)));%显示滤波器频谱
%%对图像进行滤波并显示结果
fft_start_time = tic;
img_filtered = F_img.*shift_fft_gaus;
img_filtered = ifftshift(img_filtered);
fft_result = real(ifft2(img_filtered));
finalResult = fft_result(1:rows, 1:cols);
fft_end_time = toc(fft_start_time);
fprintf('运行时间: %f s\n',fft_end_time);
str = [num2str(k),'×',num2str(k),'滤波结果'];
figure;imshow(finalResult);
title(str);
end
代码使用的图像如下:
中间产生的3×3滤波器频谱:
想知道怎样修改代码才能得到正确的滤波结果