应用于频域图像的高斯圆对称滤波器

Gaussian Circularly Symmetric Filter Applied to a Frequency Domain Image

我在对图像应用高斯滤镜时遇到问题,其中一项要求是确保它是圆对称滤镜。我不确定是否需要添加零填充序列,但请查看下面的代码,如果您能帮我解决问题,请告诉我!谢谢!

请注意:我无法使用任何工具箱功能,否则这将非常简单明了。

L=256;
L1 = 255;
%load 'iptest_im.mat'
%ipFreq(iptest01)



[ImageX,ImageY] = size(A);


load 'iptest_im.mat';
A = iptest01;
A=double(A);  % Just in Case
Fourier=fft2(A);  
ABS_Fourier=abs(Fourier);

%Gaussian 
Gaussian=zeros(ImageX,ImageY);
sigma=5; % Sigma Values for Gaussian Filter **** WHERE YOU CHANGE
for i = 1:ImageX
    for j = 1:ImageY
            D = (i-ImageX/2)^2 + (j-ImageY/2)^2;
            Gaussian(i,j) = L1*exp(-(D)/(2*(sigma)^2));      
    end
end

GaussianFilt = fft2(Gaussian);
FourierFilt = Fourier .* GaussianFilt;


%Display for No shift
FFT_NoShift = abs((log10(FourierFilt+1)));
minA=min(min(FFT_NoShift));
FFT_NoShift = FFT_NoShift-minA; % shift
maxA = max(max(FFT_NoShift));
if maxA~=0
    FFT_NoShift=FFT_NoShift*L1/maxA; % compress or expand
end

%Display for Shift
FFT_Shifted = fftshift(abs(log10(FourierFilt+1)));
minA=min(min(FFT_Shifted));
FFT_Shifted = FFT_Shifted-minA; % shift
maxA = max(max(FFT_Shifted));
if maxA~=0
    FFT_Shifted=FFT_Shifted*L1/maxA; % compress or expand
end

InvFFT = abs(ifft2(FourierFilt));
%InvFFT = abs(ifft2(FFT_Shifted1));
%InvFFT = abs(ifft2(FFT_NoShift1));
 

在乘以频谱分量之前将高斯滤波器的傅立叶变换归一化为 1

在乘以频率分量之前对高斯核进行归一化将有助于进行适当的缩放。在这里,我使用高斯核的最大值将其所有分量归一化为 1。如果需要,您也可以将 fftshift() 应用于所有傅里叶频率分量,但会获得相同的结果。移动所有光谱分量或移动 none。您可能会应用一些您拥有的对数缩放,但我不完全确定围绕它的实现细节。

Greyscale_Image = rgb2gray(imread("peppers.png"));
[ImageX,ImageY] = size(Greyscale_Image);

Fourier_Transform = fft2(Greyscale_Image);

Gaussian = zeros(ImageX, ImageY);
sigma = 5; 
for i = 1: ImageX
    for j = 1:ImageY
            D = (i-ImageX/2)^2 + (j-ImageY/2)^2;
            Gaussian(i,j) = exp(-(D)/(2*(sigma)^2));      
    end
end

GaussianFilt = round(abs(fft2(Gaussian)));
%Normalizes the Guassian filter%
GaussianFilt = GaussianFilt./max(GaussianFilt,[],'all');


Reconstructed = uint8(ifft2(Fourier_Transform.*GaussianFilt));
imshow(Reconstructed);

运行 使用 MATLAB R2019b