基于维纳滤波的图像运动模糊还原matlab仿真

322 阅读4分钟

1.算法描述

        在信号处理中,维纳滤波是常用的降噪方法,它能够把实际信号从带有噪声的观测量中提取出来,无论是在语言信号还是图像信号中,维纳滤波都有重要的应用。维纳滤波是一种线性最小均方误差(LMMSE)估计,线性指的是这种估计形式是线性的,最小方差则是我们后面构造滤波器的优化准则,也就是说实际信号与估计量的差 y−y^ 要有最小的方差。而维纳滤波就是要构造一种滤波器,使得观测信号通过滤波器后能够得到的输出是实际信号的最小均方误差估计。最后说明一下,本文讲述的维纳滤波都是基于离散时间域的,一方面是因为在实际中一般需要处理的都是离散的情况,另一方面是对于连续域的情况分析较为复杂抽象故这里不予讨论。

 

        维纳滤波(wiener filtering) 一种基于最小均方误差准则、对平稳过程的最优估计器。这种滤波器的输出与期望输出之间的均方误差为最小,因此,它是一个最佳滤波系统。它可用于提取被平稳噪声污染的信号。从连续的(或离散的)输入数据中滤除噪声和干扰以提取有用信息的过程称为滤波,这是信号处理中经常采用的主要方法之一,具有十分重要的应用价值,而相应的装置称为滤波器。根据滤波器的输出是否为输入的线性函数,可将它分为线性滤波器和非线性滤波器两种。维纳滤波器是一种线性滤波器。

 

1.png

 

       对原始图像进行维纳滤波的算法是首先估计出每个像素点的M*N邻域内的平均值和方差值。有如下两个表达式计算:

 

f6e973dfb576a963dcc4624151be28b5_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

        用如下的表达式计算输出的灰度值。其中a(n1,n2)是调整前的灰度值,b(n1,n2)是调整后的灰度值。

 

f20ea372ee1a7d3fbdceaa0a84437204_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

         维纳滤波的基本原理是:设观察信号y(t)含有彼此统计独立的期望信号x(t)和白噪声ω(t)可用维纳滤波从观察信号y(t)中恢复期望信号x(t)。从噪声中提取信号波形的各种估计方法中,维纳(Wiener)滤波是一种最基本的方法,适用于需要从噪声中分离出的有用信号是整个信号(波形),而不只是它的几个参量。设维纳滤波器的输入为含噪声的随机信号。期望输出与实际输出之间的差值为误差,对该误差求均方,即为均方误差。因此均方误差越小,噪声滤除效果就越好。为使均方误差最小,关键在于求冲激响应。如果能够满足维纳-霍夫方程 ,就可使维纳滤波器达到最佳。

 

优点:适应面较广,无论平稳随机过程是连续的还是离散的,是标量的还是向量的,都可应用。对某些问题,还可求出滤波器传递函数的显式解,并进而采用由简单的物理元件组成的网络构成维纳滤波器。

 

缺点:要求得到半无限时间区间内的全部观察数据的条件很难满足,同时它也不能用于噪声为非平稳的随机过程的情况,对于向量情况应用也不方便。因此,维纳滤波在实际问题中应用不多。

 

2.仿真效果预览

matlab2022a仿真结果如下:

4.png

5.png

6.png

7.png

3.MATLAB核心程序 `%***维娜复原程序

figure(2);

subplot(231),imshow(I),title('原始图像');

 

LEN = 20;

THETA =10;

PSF = fspecial('motion',LEN,THETA);

 

Blurred = imfilter(I,PSF,'circular');

subplot(232),imshow(Blurred),title('生成的运动的模糊的图像');

 

noise = 0.1*randn(size(I));

subplot(233),imshow(im2uint8(noise)),title('随机噪声');

 

BlurredNoisy=imadd(Blurred,im2uint8(noise));

subplot(234),imshow(BlurredNoisy),title('添加了噪声的模糊图像');

 

Move=deconvwnr(Blurred,PSF);

subplot(235),imshow(Move),title('还原运动模糊的图像');

 

nsr = sum(noise(:).^2)/sum(im2double(I(:)).^2);

wnr2 = deconvwnr(BlurredNoisy,PSF,nsr);

subplot(236),imshow(wnr2),title('还原添加了噪声的图像');

 

%维纳滤波应用于边缘提取***

N = wiener2(I,[3,3]);%选用不同的维纳窗在此修改

M = I - N;

My_Wedge = im2bw (M,5/256);%化二值图像

BW1 = edge(I,'prewitt');

BW2 = edge(I,'canny');

BW3 = edge(I,'zerocross');

BW4 = edge(I,'roberts');

 

figure(3)

subplot(2,4,[3 4 7 8]),imshow(My_Wedge),title('应用维纳滤波进行边沿提取');

subplot(241),imshow(BW1),title('prewitt');

subplot(242),imshow(BW2),title('canny');

subplot(245),imshow(BW3),title('zerocross');

subplot(246),imshow(BW4),title('roberts');

 

%维纳滤波应用于图像增强**

for i = [1 2 3 4 5]

    K = wiener2(I,[5,5]);

end

 

  K = K + I;`