对经过大气湍流退化的图片实现全逆滤波复原、维纳滤波复原、约束最小二乘滤波复原,并对比不同k值下的滤波效果(Matlab)。
时间: 2023-06-13 20:05:33 浏览: 164
大气湍流退化图像复原论文及matlab实现
5星 · 资源好评率100%
全逆滤波、维纳滤波和约束最小二乘滤波都是常用的图像复原方法。其中,全逆滤波是一种简单直接的方法,但对于噪声较大或高频分量较强的图像,会出现振铃现象。维纳滤波是针对噪声较大的情况下进行图像复原的一种方法,可以有效地降噪,但是对于图像高频分量较强的情况,会有较强的平滑效果。约束最小二乘滤波则可以在保留图像细节的基础上,降噪和平滑图像。
以下是实现全逆滤波、维纳滤波和约束最小二乘滤波的Matlab代码:
```matlab
% 读入图像并添加高斯噪声
I = im2double(imread('degraded_image.png'));
J = imnoise(I, 'gaussian', 0.01);
% 计算傅里叶变换
F = fft2(J);
% 计算全逆滤波系数
H = 1./F;
% 计算维纳滤波系数
K = 0.01;
S = abs(F).^2;
W = conj(F)./(S + K);
% 计算约束最小二乘滤波系数
lambda = 0.05;
T = lambda./(S + lambda);
C = conj(F).*T;
% 进行滤波复原
G_inv = real(ifft2(H.*F));
G_wiener = real(ifft2(W.*F));
G_lsq = real(ifft2(C.*F));
% 显示复原结果
figure;
subplot(2,2,1); imshow(I); title('原图');
subplot(2,2,2); imshow(J); title('加噪图');
subplot(2,2,3); imshow(G_inv); title('全逆滤波');
subplot(2,2,4); imshow(G_wiener); title('维纳滤波');
figure;
subplot(1,2,1); imshow(G_lsq); title('约束最小二乘滤波 (k=0.05)');
```
在以上代码中,我们首先读入了经过大气湍流退化的图像,并使用`imnoise`函数添加了高斯噪声。接着,我们计算了图像的傅里叶变换,并分别求出了全逆滤波、维纳滤波和约束最小二乘滤波的系数。最后,我们使用`ifft2`函数进行了滤波复原,并将结果进行了显示。
为了比较不同k值下的约束最小二乘滤波效果,我们可以使用循环语句,对不同的k值进行遍历,并重复进行滤波复原和显示操作:
```matlab
% 不同k值下的约束最小二乘滤波
figure;
for k = [0.01, 0.05, 0.1, 0.5]
T = k./(S + k);
C = conj(F).*T;
G_lsq = real(ifft2(C.*F));
subplot(2,2,find([0.01, 0.05, 0.1, 0.5] == k)); imshow(G_lsq); title(['k=', num2str(k)]);
end
```
在以上代码中,我们对k值进行了遍历,并使用`find`函数找到当前k值在数值列表中的位置,然后将复原结果进行显示,并在标题中显示当前的k值。
运行以上代码,即可得到不同滤波方法的复原结果,以及不同k值下约束最小二乘滤波的效果。
阅读全文