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

Butterfly ·
更新时间:2024-11-14
· 663 次阅读

图像修复基础

使用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; 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(Img_ifft1); 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('还原图')

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


作者:人生苦短-我选python



高斯滤波 图片 函数 高斯 matlab

需要 登录 后方可回复, 如果你还没有账号请 注册新账号