一、实验目的
1 了解图像复原的意义及主要退化模型的建立;
2 掌握直接逆滤波的原理及缺点,并进行完善;
3 维纳滤波两种语法的图像复原方法及应用;
4 通过本实验掌握利用MATLAB编程实现数字图像的复原方法。
二、实验仪器
安装有MATLAB工具的计算机或个人笔记本
三、实验原理
图像的退化有多种原因,包括光学系统中的衍射、传感器非线性畸变、摄影胶片的非线性、大气湍流的扰动效应、图像运动造成的模糊、几何畸变等等。各种退化图像的复原都可归结为一种过程:把退化模型化,并且采用相反的过程进行处理,以便恢复出原图像。
1.退化模型的建立:
退化过程被建模为一个退化函数和一个加性噪声项。
G(u,v)=F(u,v)*H(u,v)+N(u,v)
(1)大气湍流的模型:
(2)运动模糊模型:
H(u,v)=T/(π(ua+vb)) sin[π(ua+vb)]e^(-jπ(ua+vb))
运动模糊退化生成函数:
PSF=fspecial(‘motion’,len,theta);
其中len为移动像素个数,theta为移动方向。
2.复原方法:
(1)直接逆滤波(反向滤波法):
a. 无噪声情况:
根据
可得:
对上式进行逆变换到空间域即得到复原图像。
无噪声直接逆滤波步骤:
对退化图像(预先生成)g(x,y)进行二维傅立叶变换,得到G(u,v)。
计算系统冲激响应h(x,y)的二维傅立叶变换,求得H(u,v);
计算F(u,v);
计算F(u,v)的傅立叶反变换,求得f(x,y)。
b. 有噪声情况:
病态性质:
(a) H(u,v)= 0:无法确定F(u,v)
(b) H(u,v)0:放大噪声
放大噪声的原因: H(x,y)的幅值随着u,v离原点的距离的增加而迅速下降,而噪声的幅值变化则较平缓。
修正:
(2)维纳滤波
维纳滤波器:
F ̂(u,v)=(H^* (u,v))/(|H(u,v)|^2+(S_n (u,v))/(S_f (u,v) )) G(u,v)
H*(u,v)是系统传递函数的复共轭;
Sn(u,v)是噪声功率谱:
Sf(u,v)是输入图像的功率谱:
维纳滤波函数:
deconvwnr
fr=deconvwnr(g,PSF); %噪信比为0
fr=deconvwnr(g,PSF,NSPR); %噪信比为常量或数组,标量输入
噪信比的算法:
(1)通过功率谱计算
SN=abs(fft2(noise)).^2;
SNA=sum(SN(: ))/numel (noise);
SF=abs(fft2(f)).^2;
SFA=sum(SF(: ))/numel(f);
NSPR=SNA/SFA;
(2)通过方差计算:方差函数:var
varn=var(noise(: )); 计算噪声方差
varf=var(f(: )); 计算信号方差
NSPR=varn/varf;
四、实验内容
1.逆滤波:选择MATLAB文件夹中的foggy图像作为实验图像。
分别用直接逆滤波法和伪逆滤波法去除大气湍流造成的图像退化。
具体步骤:
直接逆滤波:
读取图像----生成退化函数----生成退化图像(原图像频谱点乘退化函数矩阵)----逆运算(退化图像频谱点除退化函数矩阵)
伪逆滤波:
读取图像----生成退化函数----生成退化图像(原图像频谱点乘退化函数矩阵)----选取合适阈值,对退化矩阵进行修正得到修正后的退化矩阵----逆运算(退化图像频谱点除退化函数矩阵)
相关算法:
(1)生成退化函数:
大气湍流的数学模型为:
H(u,v)=exp(-0.0025* ( (u-M/2).2+(v-N/2).2).^(5/6) );
G(u,v)=F.*H
(2)复原
(a)直接逆滤波
F=G./H;
按照此方法编程运行后能否复原图像?试分析原因并撰写实验报告。
此方法复原出的结果较差,不能复原出原图像。不能复原出原图像的原因是对于那些里原点较远的像素点,会导致光传递函数趋近于0,从而放大噪声
(b)修正函数逆滤波
for u=1:M for v=1:N if sqrt((u-M/2).2+(v-N/2).2)<threshold F=G./(H(u,v)+eps); end end end
此段程序运行后能否复原图像?效果如何?试分析原因并撰写实验报告。
能复原出原图像,效果不错,因为我们通过阈值修正了光传递函数,从而使离原点较远的像素点设置为1,从而避免放大噪声的现象出现
2.维纳滤波复原
选择LENA图像或利用checkerboard生成棋盘图像。
(1)对测试图像用fspecial函数生成运动造成的退化图像, 用维纳滤波法进行图像复原。
(2)对(1)中的退化图像加入高斯噪声,用维纳滤波的两种语法形式(不加噪信比和加入噪信比)进行复原并显示各图像。噪信比的计算见实验原理部分介绍。观察两种复原结果是否有区别,试分析原因并写入实验报告。
附:
实验所需相关
测试图像:棋盘图像;lena或cameraman图像
常用函数:imread; rgb2gray; im2double; fspecial; imnoise; imfilter; subplot; imshow
本实验新函数:
checkerboard(N); N代表每一个方块的每一边所包含的像素。
deconvwnr(I,PSF)%维纳滤波函数,其中I为处理图像,PSF为点扩散函数亦即图像退化函数
deconvwnr(I,PSF,NSPR)%维纳滤波函数,其中I为处理图像,PSF为点扩散函数,NSPR为噪信功率比。
五、撰写实验报告
报告需包含:程序、图像、分析评价。
六、实验代码
%% close all I = imread('foggysf1.jpg'); I = imcrop(I,[0,1299,512,511]); I = rgb2gray(I); imwrite(I,'xsa.png'); %% I = imread('xsa.png'); I = im2double(I); F = fft2(I); F = fftshift(F); [M,N] = size(I); for i = 1:M for j = 1:N H(i,j) = exp(-0.0025* ( (i-M/2).^2+(j-N/2).^2).^(5/6) ); end end G = F.*H; g = ifftshift(G); g = ifft2(g); % imshow(g,[]) F1 = G./H; f1 = ifft2(F1); % figure % imshow(f1) subplot(2,2,1),imshow(I),title('原图像') subplot(2,2,2),imshow(g,[]),title('运动退化图像') subplot(2,2,3),imshow(abs(f1)),title('直接逆滤波') for i = 1:M for j = 1:N if (i^2 + j^2) > 10 H(i,j) = 1; end end end F1 = G./H; f1 = ifft2(F1); subplot(2,2,4),imshow(abs(f1)),title('修正后直接逆滤波') %% % 1 I = imread('C:\Users\DELL\Desktop\lena.jpg'); A = fspecial('motion',7,45); K = imfilter(I,A,'circular'); M = deconvwnr(K,A); subplot(1,3,1);imshow(I);title('原图像') subplot(1,3,2);imshow(K);title('退化图像') subplot(1,3,3);imshow(M);title('滤波图像') % (2) I = imread('C:\Users\DELL\Desktop\lena.jpg'); A = fspecial('motion',15,45); K = imfilter(I,A,'circular'); noise = imnoise(K,'gaussian',0,0.01); SN=abs(fft2(noise)).^2; SNA=sum(SN(:))/numel (noise); SF=abs(fft2(I)).^2; SFA=sum(SF(:))/numel(I); NSPR=SNA/SFA; M = deconvwnr(noise,A,NSPR); subplot(131);imshow(I); subplot(132);imshow(noise); subplot(133);imshow(M);
七、实验截图