我们都知道,在不考虑噪声的情况下,图像模糊模型为:。b表示模糊图像,f表示原始清晰图像,h表示模糊核,*表示卷积。根据空域-频域转换定理,空域的卷积等于频域的乘,空域的加减等于频域su的加减。所以,其频域表示为:
,大写字母对应小写字母的频域。
如果已知模糊核h和模糊图像b,怎么求得原始图像s呢,答案是逆卷积。我们可以在频域进行等价变换:,并将h的频域得逆记作Φ,即

其空域为φ,可以视作复原滤波器,使得f≈b*φ。
而如何得到这个复原滤波器φ呢?看似可以直接对h求频域,然后求倒数,再转回空间域即可,
fai=ifft2(fft2(h).^(-1));
但是,这样做结果并不符合预期,例如,我们使用lena512作为原始清晰图像,高斯模糊作为模糊核,卷积得到模糊图像b,而利用上式得到fai,并对b进行卷积,得到的并不是预期图像(下图右)。

这是因为在卷积时(使用conv2或者imfilter),m*n大小的图像f与2k+1*2k+1大小的模糊核进行卷积,实质上得到了m+2k*n+2k大小的模糊图像,即conv2(f,h,'full')。转换到频域时,由于f和h直接fft2得到的矩阵大小不等,不能直接点乘,所以在转换前,自动做了一次截断或补零扩充操作,使得都变成m+2k*n+2k大后,再转到频域做点乘。将矩阵转到指定大小的频域可以通过fft2(X,m,n)实现,所以:模糊图像可以通过b=conv2(s,h);或者b=ifft2(fft2(s,m+2*k,n+2*k).*fft2(h,m+2*k,n+2*k));得到。
因此,正确的fai的求解公式为:
fai=ifft2(fft2(h,m+2*k,n+2*k).^(-1));
这样得到的fai是m+2*k,n+2*k大小的,与其频域的逆,即模糊核大小2k+1*2k+1差了许多,但是视觉上似乎是符合周期变化的:

但是周期函数并不好求。对b和fai直接卷积,会得到se:

此时的se大小为2m+4k-1*2m+4k-1。【2m+4k-1=(m+2k)+(m+2k)-1】
将se分成四个部分加起来即可得到使用复原滤波器卷积的结果:

或者直接使用频域点乘(模糊图像和fai大小相等,不需要调整大小):

但是直接取fai的前2k+1行2k+1列等,进行卷积得到的图像非常混乱:

写在最后:猛的一看压根不知道自己说了些啥,大概是求这个复原滤波器(逆滤波)的空间域表示吧,然后证明了一下,但是得到的空间域表示比较大,暂时不知道怎么来降低到和h差不多大小,欢迎大神来求解。
最后附上代码:
k=20;
s=imread('img/lena512.bmp');%清晰图像
[m,n,~]=size(s);
h=fspecial('gaussian',[2*k+1 2*k+1],5);%模糊核
b=conv2(s,h);%模糊图像:直接卷积
b2=ifft2(fft2(s,m+2*k,n+2*k).*fft2(h,m+2*k,n+2*k));%模糊图像:频域点乘
fai=ifft2(fft2(h,m+2*k,n+2*k).^(-1));%逆滤波/复原滤波器
%% 1空域卷积
se=conv2(b2,fai);%直接卷积
se=se(1:m+2*k-1,:)+se(m+2*k+1:end,:);%上下分一半后相加
se=se(:,1:m+2*k-1)+se(:,m+2*k+1:end);%左右分一半后相加
se=se(1:m,1:n);%裁剪
imshow(se,[])
%% 2 频域点乘
se2=ifft2(fft2(b).*fft2(fai));
se2=se2(1:m,1:n);
imshow(se2,[])
%% 3 对fai裁剪卷积得到的图像
imshow(conv2(b,fai(2:44,2:44)),[])
















