Matlab图像处理系列——图像复原之维纳滤波复原、约束最小二乘复原、L-R复原、盲去卷积图像复原

微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等
在这里插入图片描述
本节目录

一、维纳滤波复原
1、维纳滤波原理
2、维纳滤波的Matlab仿真
二、约束最小二乘复原及Matlab仿真
三、Lucky-Richardson复原及Matlab仿真
四、盲去卷积图像复原及Matlab仿真
五、Matlab源码
1、维纳滤波的Matlab仿真源码
2、约束最小二乘复原的Matlab仿真源码
3、Lucky-Richardson复原的Matlab仿真源码
4、盲去卷积图像复原的Matlab仿真源码

本节内容
一、维纳滤波复原
1、维纳滤波原理

维纳滤波又称为最小均方误差滤波,综合考虑了退化函数和噪声,找出一个原始图像f(x)的估值,使两者的均方误差较小。
均方误差:
在这里插入图片描述

复原图像的最佳估计:
在这里插入图片描述

H(u,v)表示退化函数;
HT(u,v)表示共轭退化函数;
Sn(u,v)表示噪声的功率谱;
Sf(u,v)表示为退化图像的功率谱。
若上述中Sn(u,v)=0,维纳滤波退化为逆滤波。
若噪声为高斯白噪声,则Sn(u,v)为常数,用一个系数K来代替Sn(u,v)/Sf(u,v),即:
在这里插入图片描述

2、维纳滤波的Matlab仿真
自定义wn_filter函数,实现维纳滤波。
在这里插入图片描述
在这里插入图片描述

二、约束最小二乘复原及Matlab仿真
约束最小二乘复用采用图像的二阶导数作为最小准则函数,定义:
在这里插入图片描述

若g为退化图像,n表示噪声,g-Hf=n。
在这里插入图片描述

P(u,v)是函数p(x,y)的傅里叶变换,p(x,y)为拉普拉斯算子。
在这里插入图片描述

Matlab提供了deconvereg函数实现有约束最小二乘复原。
J=deconvreg(I,psf,np,lrange)指定搜索最佳解决方案的范围lrange。该算法在lrage范围内找到一个最优拉格朗日乘数的值。
I表示输入图像矩阵;
psf表示点扩散函数;
np为加性噪声功率,默认值为0;
lrange表示长度为2的向量。
在这里插入图片描述

三、Lucky-Richardson复原及Matlab仿真
Lucky-Richardson(L-R)算法是非线性方法中一种典型的算法,在噪声信息未知时仍可得到较好的复原结果。采用泊松噪声对未知噪声建模,通过迭代求得最可能的复原图像。
迭代收敛,模型的最大似然函数
在这里插入图片描述

Matlab提供了deconvlucy函数,通过加速收敛的迭代算法完成图像复原。
J=deconvlucy(I,psf,NumIt,Dampar,Weight)
I代表输入像素矩阵;
psf表示退化过程的点扩散函数,用于恢复psf和可能的加性噪声引起的退化;
Numlt表示算法迭代的次数;
Dampar表示结果图像偏差的阈值,当偏差小于该值,算法停止迭代;
Weight表示每个像素的加权值,记录了每个像素反应相机记录的质量。
在这里插入图片描述

四、盲去卷积图像复原及Matlab仿真
如果不清楚点扩散函数,Matlab提供了deconvblind函数,实现盲去卷积功能。
[J,psf]=deconvblind(I,InitPsf,NumIt,Dampar,Weight)
J=deconvlucy(I,psf,NumIt,Dampar,Weight)
I代表输入像素矩阵;
InitPsf表示初始化点扩散函数;
Numlt表示算法迭代的次数;
Dampar表示结果图像偏差的阈值,当偏差小于该值,算法停止迭代。
Weight表示每个像素的加权值,记录了每个像素反应相机记录的质量。
J表示滤波后的图像;
psf表示最终估计的点扩散函数。
在这里插入图片描述

五、Matlab源码
1、wn_filter函数源码

function out=wn_filter(I,H,threshold,K)
%维纳滤波复原函数
%I 输入图像,灰度
%H 传递函数
%threshold 逆滤波半径
%K噪声图像功率比
%若为彩色图像,转化为灰度图像
if ndims(I)>=3
    I=rgb2gray(I);
end
Id=im2double(I);
%傅里叶变换
f_Id=fft2(Id);
f_Id=fftshift(f_Id);
f_Id1=f_Id;
[M,N]=size(f_Id1);
D=abs(H);
D=D.^2;
%维纳滤波
if threshold>M/2
    %全滤波
    f_Id1=f_Id1./(H+eps);
else
    %对一定半径内滤波
    for i=1:M
        for j=1:N
            if sqrt((i-M/2)^2+(j-N/2)^2)<threshold
                f_Id1(i,j)=(f_Id1(i,j)./(H(i,j))...
                    .*(D(i,j)./(D(i,j)^2+K)));
            end
        end
    end
end
%傅里叶逆变换
f_Id2=ifftshift(f_Id1);
out=ifft2(f_Id2);
out=abs(out)*255;
out=uint8(out);

2、维纳滤波的Matlab仿真源码

clear all;
clc;
close all;
%读取图像
I=imread('leno_old.png');
I1=rgb2gray(I);
%fft
F=im2double(I1);
F=fft2(F);
F=fftshift(F);
%退化
[M,N]=size(F);
[u,v]=meshgrid(1:M,1:N);
H=exp(-0.0025*((u-M/2).^2+(v-N/2).^2).^(5/6));
F=F.*H;
%添加噪声
B1=ifftshift(F);
B1=ifft2(B1);
B1=abs(B1)*256;
B1=uint8(B1);
B1=imnoise(B1,'gaussian',0,0.001);
imwrite(B1,'lena_g.png');
I0=imread('lena_g.png');
%逆滤波
B2=rev_filter(I0,H,48);
%维纳滤波
B3=wn_filter(I0,H,48,0.05);
subplot(2,2,1);
imshow(I1);
title('原图');
subplot(2,2,2);
imshow(B1);
title('退化高斯噪声图像');
subplot(2,2,3);
imshow(B2);
title('逆滤波图像B2');
subplot(2,2,4);
imshow(B3);
title('维纳滤波图像B3');

3、约束最小二乘复原的Matlab仿真源码

clear all;
clc;
close all;
%生成8*8格子图像
I=checkerboard(8);
%运动模糊的点扩散函数
psf=fspecial('motion',7,45);
fprintf('点扩散函数:\n');
disp(psf);
%对图像进行运动模糊滤波
B1=imfilter(I,psf,'circular');
%添加高斯噪声
noise=imnoise(zeros(size(I)),'gaussian',0,0.001);
B1=B1+noise;
%维纳滤波
B2=deconvwnr(B1,psf,0.02);
%约束最小二乘滤波
B3=deconvreg(B1,psf,0.02,[1e-7 1e7]);
subplot(2,2,1);
imshow(I);
title('原图');
subplot(2,2,2);
imshow(B1);
title('退化高斯噪声图像');
subplot(2,2,3);
imshow(B2);
title('维纳滤波图像B2');
subplot(2,2,4);
imshow(B3);
title('约束最小二乘滤波图像B3');

4、Lucky-Richardson复原的Matlab仿真源码

clear all;
clc;
close all;
%生成8*8格子图像
I=checkerboard(8);
%运动模糊的点扩散函数
psf=fspecial('motion',7,45);
fprintf('点扩散函数:\n');
disp(psf);
%对图像进行运动模糊滤波
B1=imfilter(I,psf);
%添加方差为0.01的高斯噪声
SD=0.01;
noise=imnoise(B1,'gaussian',0,SD^2);
%Lucy-Richardson算法复原
Dampar=10*SD;
LIM=ceil(size(psf,1)/2);
Weight=zeros(size(B1));
%weight数字的大小64*64,值为04像素宽的边界,其余为1
Weight(LIM+1:end-LIM,LIM+1:end-LIM)=1;
%迭代次数为10 20 50 100
NumIt1=10;
NumIt2=20;
NumIt3=50;
NumIt4=100;
%复原
B2=deconvlucy(B1,psf,NumIt1,Dampar,Weight);
B3=deconvlucy(B1,psf,NumIt2,Dampar,Weight);
B4=deconvlucy(B1,psf,NumIt3,Dampar,Weight);
B5=deconvlucy(B1,psf,NumIt4,Dampar,Weight);
subplot(3,2,1);
imshow(I);
title('原图');
subplot(3,2,2);
imshow(B1);
title('退化图像');
subplot(3,2,3);
imshow(B2);
title('迭代10次,L-R图像B2');
subplot(3,2,4);
imshow(B3);
title('迭代20次,L-R图像B3');
subplot(3,2,5);
imshow(B4);
title('迭代50次,L-R图像B4');
subplot(3,2,6);
imshow(B5);
title('迭代100次,L-R图像B5');

5、盲去卷积图像复原的Matlab仿真源码

clear all;
clc;
close all;
%生成8*8格子图像,并退化
I=checkerboard(8);
psf=fspecial('gaussian',7,10);
fprintf('点扩散函数:\n');
disp(psf);
%对图像进行运动模糊滤波
B1=imfilter(I,psf);
%添加方差为0.01的高斯噪声
SD=0.01;
noise=imnoise(B1,'gaussian',0,SD^2);
%Lucy-Richardson算法复原
Dampar=10*SD;
LIM=ceil(size(psf,1)/2);
Weight=zeros(size(B1));
%weight数字的大小64*64,值为04像素宽的边界,其余为1
Weight(LIM+1:end-LIM,LIM+1:end-LIM)=1;
%点扩展函数的估计值
InitPsf=ones(size(psf));
[J,psf_out]=deconvblind(B1,InitPsf,20,Dampar,Weight);
subplot(3,2,1);
imshow(I);
title('原图');
subplot(3,2,2);
imshow(B1);
title('退化图像');
subplot(3,2,3);
imshow(J);
title('盲去卷积图像J');
subplot(3,2,4);
imshow(psf_out,[]);
title('psf out');
  • 22
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小灰灰的FPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值