图像修复基础
使用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('还原图')
这样我们就将图像还原了
在实际的图像恢复过程中,比较简单的方法和上述过程是类似的,只要我们找到使得图像变差的那个因素,对模糊图像做出一个逆操作,就可以得到还原的图像了。