使用Matlab的自带函数生成高斯滤波器处理图片(一)

图像修复基础

使用Matlab的自带函数生成高斯滤波器在 频域处理与还原图片(一)

可搭配:使用Matlab的自带函数生成高斯滤波器在频域处理与还原图片(二)
一起食用
(我们在这里借用一下2B小姐姐的图,侵删)
在这里插入图片描述

使用高斯滤波器模糊图片

使用函数 fspecial 生成空域的高斯滤波器模板

%读取灰度图片
Img = rgb2gray(imread('myphoto.jpg')); 

%生成高斯滤波器
Gauss = fspecial('gaussian',21,2);     

注:对 fspecial 函数的参数稍微解释一下,第一个是生成的模板类型,第二个是模板的尺寸 ,第三个在这里是指 Gaussian函数 的平方差σ,尺寸与与平方差σ共同作用高斯滤波器的滤波效果,尺寸不变,在一定范围下,平方差σ越大模糊能力越强。

然后通过傅里叶变换将它们转化到频域中,由于高斯滤波器的模板尺寸与图片不一致,我们要提前给它补零得到与图片尺寸一致的 full_Gauss 矩阵(这里补零的方式会出现一点小bug,在下文会谈到)

%原图的fft
Img_afterfft = fft2(Img);

%原高斯滤波补零模板
full_Gauss = zeros(size(Img));

[M,N] = size(Img);
[m,n] = size(Gauss);
for i = 1:m
    for j = 1:n
        full_Gauss(i,j) = Gauss(i,j);
    end
end

%高斯滤波器的fft
Gauss_afterfft = (fft2(full_Gauss)); 

接下来利用频域的滤波器,对图像进行处理

%频域原图点乘高斯滤波器
Img_fft_Gauss =  Img_afterfft.*Gauss_afterfft;

Img_ifft1 = ifft2(Img_fft_Gauss);

figure(1)
subplot(121)
imshow(Img)
title('灰度原图')
subplot(122)
imshow(Img_ifft1,[])
title('高斯模糊后')

在这里插入图片描述
模糊效果出来了,但是显然图像被分块,移位了。
这就是在之前提到的,补零方式的bug,在上述补零办法中,原来的高斯模板的位置信息(在频域中就是相位信息),影响了处理图空间分布。所以在补零方法上需要做出这样的操作(下述一种方法)

%原高斯滤波补零模板
full_Gauss = zeros(size(Img));

[M,N] = size(Img);
[m,n] = size(Gauss);
for i = 1:m
    for j = 1:n
        full_Gauss(M/2-fix(m/2)+i,N/2-fix(n/2)+j) = Gauss(i,j);
    end
end

%高斯滤波器的fft
Gauss_afterfft = fft2(full_Gauss); 

%频域原图点乘高斯滤波器
Img_fft_Gauss =  Img_afterfft.*Gauss_afterfft;

figure(2)
subplot(121)
imshow(Img)
title('灰度原图')
subplot(122)

%使用fftshift函数分块的复原图还原回来
Img_ifft1 = fftshift(ifft2(Img_fft_Gauss));

imshow(Img_ifft1,[])
title('高斯模糊后')

在这里插入图片描述
这样就完成了模糊过程

还原被模糊的图片

在这里,我们需要得到原来高斯滤波器的倒数矩阵来处理被模糊的图片。

%高斯滤波器的倒数矩阵
iGauss_afterfft = conj(Gauss_afterfft)./abs(Gauss_afterfft).^2;

%得到模糊图的傅里叶变换矩阵
Img_ifft1_fft = fft2(fftshift(Img_ifft1));

%还原处理
Img_ifft1_fft = ifft2(Img_ifft1_fft.*iGauss_afterfft);

figure(2)
subplot(131)
imshow(Img)
title('灰度原图')
subplot(132)
imshow(Img_ifft1,[])
title('高斯模糊后')
subplot(133)
imshow(Img_ifft1_fft,[])
title('还原图')

这样我们就将图像还原了
在这里插入图片描述
在实际的图像恢复过程中,比较简单的方法和上述过程是类似的,只要我们找到使得图像变差的那个因素,对模糊图像做出一个逆操作,就可以得到还原的图像了。

猜你喜欢

转载自blog.csdn.net/qq_45083791/article/details/105258055