微信公众号上线,搜索公众号小灰灰的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,值为0的4像素宽的边界,其余为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,值为0的4像素宽的边界,其余为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');