Matlab运动模糊,维纳滤波

一、目标:

  1. 任选一幅彩色风景图片作为源图像,设置不同的模糊参数实现任一副图像的运动模糊(fspecial,imfilter函数),再用imadd和imnoise给图像添加不同类型的噪声,显示噪声图像。
  1. 对1产生的图像分别进行复原,选用维纳滤波器进行图像复原,显示处理结果。

二、函数分析:

1、fspecial()

定义:创建预定义的二维过滤器

形式:h = fspecial('motion',len,theta)

描述:h = fspecial('motion',len,theta),返回一个过滤器,使其在与图像卷积后近似相机的线性运动。len指定运动的长度,theta指定逆时针方向的运动角度(以度为单位)。过滤器将成为水平和垂直运动的矢量。默认的len是9,默认的theta是0,这对应于9个像素的水平运动。

2、imfilter()

定义:多维图像的N-D滤波

形式:B = imfilter(A,h,options,...)

描述:根据一个或多个指定选项执行多维筛选。其中本实验代码中Blurred1 = imfilter(imgrgb,PSF1,'circular','conv');指的是加入了运动模糊。

3、SNR-信噪比

定义:信号的平均功率和噪声的平均功率之比

形式:信噪比(dB)= 10 * log10(S/N) (dB), 单位(db)作为度量单位。

4、deconvwnr()

定义:基于维纳滤波的去模糊图像

形式:J = deconvwnr(I,psf,nsr)

           J = deconvwnr(I,psf,ncorr,icorr)

           J = deconvwnr(I,psf)

描述:其中J = deconvwnr(I,psf,nsr),使用维纳滤波算法对图像I进行解卷积,返回去模糊图像J。psf是对I进行卷积的点扩展函数(psf)。nsr是加性噪声的噪声与信号功率比。该算法在估计图像和真实图像之间的最小均方误差意义下是最优的。

三、代码展示:

% 1、任选一幅彩色风景图片作为源图像,设置不同的模糊参数实现任一副图像的运
%    动模糊(fspecial,imfilter函数),再用imadd和imnoise给图像添加不同类
%    型的噪声,显示噪声图像。 
%    
% 2、对1产生的图像分别进行复原,选用维纳滤波器进行图像复原,显示处理结果。 
%
% @author: jackma
% @time:   2020-11-9 3:23
% @URL:   www.jackrma.com
% @Copyright:博客所有权归本人和CSDN所有,如有转载请在显著位置给出博文
%            链接和作者姓名,否则本人将付诸法律。
% @edit:   

% 1.添加运动模糊
clc
clear
imgrgb = imread('2.jpg'); % 读取彩色图像
figure('Name', '运动模糊参数对比'); %标题
subplot(221);
imshow(imgrgb);
title("原始图像");

LEN1 = 50;   % 运动模糊中运动的长度
THETA1 = 11; % 指定逆时针方向的运动角度(以度为单位)
PSF1 = fspecial('motion',LEN1,THETA1); % 用于在与图像卷积后近似相机的线性运动
Blurred1 = imfilter(imgrgb,PSF1,'circular','conv'); % 加入运动模糊
subplot(222);
imshow(Blurred1);
title("模糊图像1-长度50,角度11度");

LEN2 = 50;   % 运动长度50
THETA2 = 22; % 运动角度22度,(和模糊图像1的运动角度数据做对照)
PSF2 = fspecial('motion',LEN2,THETA2); %用于在与图像卷积后近似相机的线性运动
Blurred2 = imfilter(imgrgb,PSF2,'circular','conv'); % 加入运动模糊
subplot(223);
imshow(Blurred2);
title("模糊图像2-长度50,角度22度");

LEN3 = 100;   % 运动长度100,(和模糊图像1的运动长度数据做对照)
THETA3 = 11; % 运动角度11度
PSF3 = fspecial('motion',LEN3,THETA3);
Blurred3 = imfilter(imgrgb,PSF3,'circular','conv');
subplot(224);
imshow(Blurred3);
title("模糊图像3-长度100,角度11度");

% 2.添加噪声(都在模糊图像1基础上增加噪声,方便对照)
NUM1 = 0.05; % 噪声强度5%
figure('Name', '模糊图像1加入噪声并复原'); % 标题
I1 = imnoise(Blurred1, 'salt & pepper', NUM1); %给模糊图像1添加椒盐噪声,强度5%
subplot(221);
imshow(I1);
title('加入强度5%椒盐噪声的图像1');

NUM2 = 0.05; % 噪声强度5%
I2 = imnoise(Blurred1, 'gaussian', NUM2); % 给模糊图像1添加高斯噪声,强度5%
subplot(222);
imshow(I2);
title('加入强度5%高斯噪声的图像2');

% 3.维纳滤波复原图像
SNR1 = sum(NUM1.^2) / var(im2double(imgrgb(:)).^2);% 信噪比
                                                 % 加入im2double是因为var前面
                                                 % 必须是单精度或者双精度
wnr1 = deconvwnr(I1, PSF1, SNR1);
subplot(223);
imshow(wnr1); % 恢复图像1
title('恢复图像1');

SNR2 = sum(NUM2.^2) / var(im2double(imgrgb(:)).^2);
wnr2 = deconvwnr(I2, PSF1, SNR2);
subplot(224);
imshow(wnr2); % 恢复图像2
title('恢复图像2');

% 保存处理后的图像
imwrite(uint8(Blurred1),'./output/Blurred1.bmp');
imwrite(uint8(Blurred2),'./output/Blurred2.bmp');
imwrite(uint8(Blurred3),'./output/Blurred3.bmp');
imwrite(uint8(I1),'./output/I1.bmp');
imwrite(uint8(I2),'./output/I2.bmp');
imwrite(uint8(wnr1),'./output/wnr1.bmp');
imwrite(uint8(wnr2),'./output/wnr2.bmp');


四、结果展示及分析:

Matlab运动模糊,维纳滤波_第1张图片

                                                         图1 运动模糊不同参数对比图

                                                           图2 模糊图像1加入噪声及其复原总图

 

具体结果对照如下:

                                       Matlab运动模糊,维纳滤波_第2张图片

                                                图3 模糊图像1 (参数长度50,角度11度)      

                                                   为方便对照,以下图像都是该图基础上变换

 

 

Matlab运动模糊,维纳滤波_第3张图片Matlab运动模糊,维纳滤波_第4张图片

             图4 加入强度10%椒盐噪声的图像                                                                            图5 维纳滤波处理图4的结果

Matlab运动模糊,维纳滤波_第5张图片Matlab运动模糊,维纳滤波_第6张图片

                   图6 加入强度10%高斯噪声的图像                                                                图7 维纳滤波处理图6的结果

       显然由结果可得,在图像设置成运动模糊后,并且加入了各种噪声,通过对照图3-图7和图3-图5两组对象,发现维纳滤波对运动模糊处理能力较强,但是也不太突出。但是在图像中增加噪声后,通过对比图4-图5和图6-图7两组对象,发现维纳滤波复原后的图像噪声比复原前图像噪声更严重。

 

你可能感兴趣的:(数字图像处理,图像处理,matlab)