数字图像处理-运动模糊逆滤波维纳滤波(Matlab)
⽂章⽬录
数字图像处理-运动模糊&逆滤波&维纳滤波(Matlab)
1、对指定的⼀幅灰度图像,先⽤3*3均值滤波器进⾏模糊处理,形成退化图像1;再叠加椒盐噪声,形成退化图像2;再对上述退化图像1和2采⽤逆滤波进⾏复原,给出复原结果图像。分析对⽐在对H零点问题采⽤不同处理⽅法下的复原结果。
1-1 图像退化(均值滤波+椒盐噪声)
Matlab代码块:
%---------------------9x9均值滤波模糊处理-------------------
clc;%清空控制台
clear;%清空⼯作区
close all;%关闭已打开的figure图像窗⼝
color_pic=imread('lena512color.bmp');%读取彩⾊图像
gray_pic=rgb2gray(color_pic);%将彩⾊图转换成灰度图
double_gray_pic=im2double(gray_pic);%将uint8转成im2double型便于后期计算
[width,height]=size(double_gray_pic);
H=fspecial('average',9);%⽣成9x9均值滤波器,图像更模糊,3x3⼏乎看不出差别
degrade_img1=imfilter(double_gray_pic, H,'conv','circular');%使⽤卷积滤波,默认是相关滤波
%--------------------在均值滤波模糊图像基础上添加椒盐噪声------------------
degrade_img2=imnoise(degrade_img1,'salt & pepper',0.05);%给退化图像1添加噪声密度为0.05的椒盐噪声(退化图像2)
figure('name','退化图像');
subplot(2,2,1);imshow(color_pic,[]);title('原彩⾊图');
subplot(2,2,2);imshow(double_gray_pic,[]);title('原灰度图');
subplot(2,2,3);imshow(degrade_img1,[]);title('退化图像1');
subplot(2,2,4);imshow(degrade_img2,[]);title('退化图像2');
运⾏效果:
1-2 直接逆滤波还原图像
Matlab代码块:
%-------------------------对退化图像1逆滤波复原-------------------------
fourier_H=fft2(H,width,height);%注意此处必须得让H从9x9变成与原图像⼀样的⼤⼩此处为512x512,否则ifft2 ./部分会报错矩阵不匹配
fourier_degrade_img1=fft2(degrade_img1);%相当于G(u,v)=H(u,v)F(u,v),已知G(u,v),H(u,v),求F(u,v)
restore_one=ifft2(fourier_degrade_img1./fourier_H);%因为是矩阵相除要⽤./
figure('name','退化图像1逆滤波复原');
degrade
subplot(1,2,1);imshow(im2uint8(degrade_img1),[]);title('退化图像1');
subplot(1,2,2);imshow(im2uint8(restore_one),[]);title('复原图像1');
%-------------------------对退化图像2直接逆滤波复原-------------------------
fourier_degrade_img2=fft2(degrade_img2);%相当于G(u,v)=H(u,v)F(u,v)+N(u,v)
restore_two=ifft2(fourier_degrade_img2./fourier_H);
运⾏效果:
1-3 去掉噪声分量逆滤波还原图像
Matlab代码块:
%------------------------去掉噪声分量逆滤波复原-----------------------
noise =degrade_img2-degrade_img1;  %提取噪声分量
fourier_noise =fft2(noise );  %对噪声进⾏傅⾥叶变换
restore_three =ifft2((fourier_degrade_img2-fourier_noise )./fourier_H );  %G (u ,v )=H (u ,v )F (u ,v )+N (u ,v ),解得F (u ,v )=[G (u ,v )-N (u ,v )]/H (u ,v )
figure ('name','退化图像2逆滤波复原');
subplot (2,2,1);imshow (double_gray_pic ,[]);title ('原灰度图');
subplot (2,2,2);imshow (im2uint8(degrade_img2),[]);title ('退化图像2');
subplot (2,2,3);imshow (im2uint8(restore_two ),[]);title ('直接逆滤波复原');
subplot (2,2,4);imshow (im2uint8(restore_three ),[]);title ('去掉噪声分量逆滤波复原');
运⾏效果:
总结:逆滤波依赖噪声属性
当有噪声时,直接进⾏逆滤波,此时输出为:  从上式可见,如果H(u,v)⾜够⼩,则输出结果被噪声所⽀配,复原出来的图像便是⼀幅充满椒盐噪声的图。
  所以当我们已知道所加的噪声信号时,还原出的信号为,即如果不知道噪声信号,则清晰还原困难。
2、对⼀幅灰度图像进⾏运动模糊并叠加⾼斯噪声,并采⽤维纳滤波进⾏复原。
2-1 图像退化(运动模糊+⾼斯噪声)
Matlab代码块:
% ----------------2、对⼀幅灰度图像进⾏运动模糊并叠加⾼斯噪声,并采⽤维纳滤波进⾏复原-------------
clc ;        %清空控制台
clear ;      %清空⼯作区
close all ;  %关闭已打开的figure 图像窗⼝
color_pic =imread ('lena512color.bmp');  %读取彩⾊图像
gray_pic =rgb2gray (color_pic );    %将彩⾊图转换成灰度图
double_gray_pic =im2double (gray_pic );  %将uint8转成im2double 型便于后期计算
[width ,height ]=size (double_gray_pic );
%-------------------------添加运动模糊----------------------
H_motion = fspecial ('motion', 18, 90);%运动长度为18,逆时针运动⾓度为90°
motion_blur = imfilter (double_gray_pic , H_motion , 'conv', 'circular');%卷积滤波
noise_mean =0;  %添加均值为0
noise_var =0.001; %⽅差为0.001的⾼斯噪声
motion_blur_noise =imnoise (motion_blur ,'gaussian',noise_mean ,noise_var );%添加均值为0,⽅差为0.001的⾼斯噪声
figure ('name','运动模糊加噪');
subplot (1,2,1);imshow (motion_blur ,[]);title ('运动模糊');
subplot (1,2,2);imshow (motion_blur_noise ,[]);title ('运动模糊添加噪声');
运⾏效果:
H (u ,v )
G (u ,v )
G (u ,v )=H (u ,v )F (u ,v )+N (u ,v )
=H (u ,v )G (u ,v )F (u ,v )+H (u ,v )
N (u ,v )
F (u ,v )=H (u ,v )
G (u ,v )−N (u ,v )
2-2 维纳滤波(Matlab⾃带函数:deconvwnr)
函数参数介绍:
J = deconvwnr(I,PSF,NSR) deconvolves image I using the Wiener filter algorithm, returning deblurred image J. Image I can be an N-dimensional array. PSF is the point-spread function with which I was convolved. NSR is the noise-to-signal power ratio of the additive noise. NSR can be a scalar or a spectral-domain array of the same size as I. Specifying 0 for the NSR is equivalent to creating an ideal inverse filter.
Matlab代码块:
%----------------------------维纳滤波matlab⾃带函数deconvwnr-------------------------
restore_ignore_noise =deconvwnr(motion_blur_noise, H_motion,0);%nsr=0,忽视噪声
signal_var=var(double_gray_pic(:));
estimate_nsr=noise_var/signal_var;%噪信⽐估值
restore_with_noise=deconvwnr(motion_blur_noise,H_motion,estimate_nsr);%信号的功率谱使⽤图像的⽅差近似估计
figure('name','函数法维纳滤波');
subplot(1,2,1);imshow(im2uint8(restore_ignore_noise),[]);title('忽视噪声直接维纳滤波(nsr=0),相当于逆滤波');
subplot(1,2,2);imshow(im2uint8(restore_with_noise),[]);title('考虑噪声维纳滤波');
运⾏效果:
2-3 根据公式编写维纳滤波
公式原理:
Matlab代码块:
%---------------------------公式法----------------------------
fourier_H_motion=fft2(H_motion,width,height);%H(u,v)
pow_H_motion=abs(fourier_H_motion).^2;%|H(u,v)|^2
noise=motion_blur_noise-motion_blur;%提取噪声分量
fourier_noise=fft2(noise);%N(u,v)噪声傅⾥叶变换
fourier_double_gray_pic=fft2(double_gray_pic);%F(u,v)为未经过退化的图⽚
nsr=abs(fourier_noise).^2./abs(fourier_double_gray_pic).^2;%噪信⽐=|N(u,v)|^2/|F(u,v)|^2
H_w=1./fourier_H_motion.*pow_H_motion./(pow_H_motion+nsr);%H_w(u,v)=1/H(u,v)*|H(u,v)|^2/[|H(u,v)|^2+NSR]
fourier_motion_blur_noise=fft2(motion_blur_noise);%G(u,v)
restore_with_noise=ifft2(fourier_motion_blur_noise.*H_w);%输出频域=G(u,v)H_w(u,v),时域为频域傅⾥叶逆变换
figure('name','公式法维也纳滤波');
subplot(1,2,1);imshow(motion_blur_noise,[]);title('运动模糊添加噪声')
subplot(1,2,2);imshow(restore_with_noise,[]);title('维也纳滤波')
运⾏效果:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。