在上一期(医学图像处理 | 图像复原(二))推送中,我们介绍了如何通过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),[ ]);

opencv基于维纳滤波恢复离焦图像代码 维纳滤波复原噪声图像_matlab

二、直接逆滤波复原图像

 

下面,我们使用直接逆滤波,对图像进行复原。

fr1=deconvwnr(g,PSF);

imshow(pixeldup(fr1,8),[ ]);

所得图像如下:

opencv基于维纳滤波恢复离焦图像代码 维纳滤波复原噪声图像_图像识别_02

由上图可知,直接逆滤波效果不理想,这个结果是由噪声的结果决定的。

三、使用常数比率维纳滤波复原图像

 

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为图像的噪信功率比

构造维纳滤波器的过程中,我们感兴趣的两个量分别为平均噪声功率和平均图像功率,分别定义为:

opencv基于维纳滤波恢复离焦图像代码 维纳滤波复原噪声图像_维纳滤波_03

opencv基于维纳滤波恢复离焦图像代码 维纳滤波复原噪声图像_matlab_04

其中,M和N分别表示图像和噪声数组的垂直和水平大小。这些量都是标量常量,且他们的比率R即定义为噪信功率比。即:

opencv基于维纳滤波恢复离焦图像代码 维纳滤波复原噪声图像_调用函数_05

利用此滤波器,得到的图像如下:

opencv基于维纳滤波恢复离焦图像代码 维纳滤波复原噪声图像_图像复原_06

与直接逆滤波相比,使用常数比率的维纳滤波有了重大改进,但结果仍然不理想。

四、使用自相关函数维纳滤波复原图像

 

NCORR=fftshift(real(ifft2(Sn)));

ICORR=fftshift(real(ifft2(Sf)));

fr3=deconvwnr(g,PSF,NCORR,ICORR);

imshow(pixeldup(fr3,8),[ ]);

注:

NACORR和ICORR分别计算的是噪声和未退化的图像的自相关函数。

所得图像如下:

opencv基于维纳滤波恢复离焦图像代码 维纳滤波复原噪声图像_matlab_07

使用自相关函数的维纳滤波效果最好,虽仍然有一些噪声的存在,但是已经和原图很接近了。

这是因为原图像和噪声函数都是已知的,所以可以正确地估算参量,从而能够由Wiener反卷积得到最佳结果。

如果在实践中,当这些参量之一(或更多)未知,挑战便是在实验中智能地选择所用函数,直到获得可接受的结果时止。所以图像复原的工作也是十分有难度的!让我们为这些工作者们点赞!

 

大家也可以尝试更多不同的滤波方法,看是否能够实现更优的滤波效果!