在上一期(医学图像处理 | 图像复原(二))推送中,我们介绍了如何通过matlab中的代码实现模糊噪声图像的建模。今天,我们一起来学习一下如何利用维纳滤波实现模糊噪声图像的复原。
之前我们只是讲到了维纳滤波的理论知识,但具体操作起来大家肯定也会有点迷茫,不知所措。有能力的同学可以尝试着依据原理自己编写验证一下!对于有些迷茫的同学也没关系,matlab中已经集成了维纳滤波功能的函数——deconvwnr。
首先,我们一起来看一下deconvwnr函数的三种可能的语法形式。
(1) fr=deconvwnr(g, PSF)
在此条形式中,g是我们要滤波的图像,PSF是自己估计添加的点扩散函数。此滤波器即为直接逆滤波器。
(2) fr=deconvwnr(g, PSF, NSPR)
在假设噪信功率比已知,或是个常量或是个数组的情况下,可以这样调用函数(NSPR即为噪信功率比)。当函数接收其中的任何一个形式时。此函数就可用于实现参数维纳滤波器。
(3) fr=deconvwnr(g, PSF, NACORR, FACORR)
假设噪声和未退化图像的自相关函数NACORR和FACORR是已知的,可以这样调用函数。这里涉及相关的方法小白就只提一下了!感兴趣的可以下去深入的了解一下。
噪声图像
首先,我们显示在上一篇推送中最后得到的模糊噪声图像。
imshow(pixeldup(g,8),[ ]);
二、直接逆滤波复原图像
下面,我们使用直接逆滤波,对图像进行复原。
fr1=deconvwnr(g,PSF);
imshow(pixeldup(fr1,8),[ ]);
所得图像如下:
由上图可知,直接逆滤波效果不理想,这个结果是由噪声的结果决定的。
三、使用常数比率维纳滤波复原图像
Sn=abs(fft2(noise)).^2;
nA=sum(Sn(:))/numel(noise);
Sf=abs(fft2(f)).^2;
fA=sum(Sf(:))/numel(f);
R=nA/fA;
fr2=deconvwnr(g,PSF,R);
imshow(pixeldup(fr2,8),[ ]);
注:
R为图像的噪信功率比。
构造维纳滤波器的过程中,我们感兴趣的两个量分别为平均噪声功率和平均图像功率,分别定义为:
其中,M和N分别表示图像和噪声数组的垂直和水平大小。这些量都是标量常量,且他们的比率R即定义为噪信功率比。即:
利用此滤波器,得到的图像如下:
与直接逆滤波相比,使用常数比率的维纳滤波有了重大改进,但结果仍然不理想。
四、使用自相关函数维纳滤波复原图像
NCORR=fftshift(real(ifft2(Sn)));
ICORR=fftshift(real(ifft2(Sf)));
fr3=deconvwnr(g,PSF,NCORR,ICORR);
imshow(pixeldup(fr3,8),[ ]);
注:
NACORR和ICORR分别计算的是噪声和未退化的图像的自相关函数。
所得图像如下:
使用自相关函数的维纳滤波效果最好,虽仍然有一些噪声的存在,但是已经和原图很接近了。
这是因为原图像和噪声函数都是已知的,所以可以正确地估算参量,从而能够由Wiener反卷积得到最佳结果。
如果在实践中,当这些参量之一(或更多)未知,挑战便是在实验中智能地选择所用函数,直到获得可接受的结果时止。所以图像复原的工作也是十分有难度的!让我们为这些工作者们点赞!
大家也可以尝试更多不同的滤波方法,看是否能够实现更优的滤波效果!