对经过大气湍流退化的图片实现全逆滤波复原、维纳滤波复原、约束最小二乘滤波复原,并对比不同k值下的滤波效果(Matlab)
时间: 2023-06-14 22:05:46 浏览: 260
大气湍流退化图像复原论文及matlab实现
5星 · 资源好评率100%
全逆滤波、维纳滤波和约束最小二乘滤波都是常用的图像复原方法。其中,全逆滤波是指在频域中对图像进行逆滤波操作,维纳滤波是在频域中对图像进行加权处理,而约束最小二乘滤波则是在频域中对图像进行最小二乘约束处理。
在对经过大气湍流退化的图片进行复原时,可以尝试使用以上三种方法。具体步骤如下:
1. 读取原始图片和退化图片,计算它们之间的点扩散函数(PSF)。
2. 对退化图片进行傅里叶变换,得到频域图像。
3. 对频域图像进行处理,分别使用全逆滤波、维纳滤波和约束最小二乘滤波进行复原。
4. 将复原后的频域图像进行反傅里叶变换,得到空域图像。
5. 对比不同k值下的滤波效果,选择最优的k值进行图像复原。
在Matlab中,可以使用以下代码实现上述步骤:
```matlab
% 读取原始图片和退化图片
f = imread('original.png');
g = imread('degraded.png');
% 计算点扩散函数
psf = fspecial('motion', 20, 45);
% 对退化图片进行傅里叶变换
G = fft2(double(g));
% 计算频域图像
H = fft2(psf, size(G,1), size(G,2));
% 全逆滤波
F_hat_inv = G ./ H;
% 维纳滤波
k = 0.001;
F_hat_wiener = conj(H) ./ (abs(H).^2 + k);
F_hat_wiener = F_hat_wiener .* G;
% 约束最小二乘滤波
F_hat_lsm = conj(H) ./ (abs(H).^2 + k);
F_hat_lsm = F_hat_lsm .* G ./ (abs(H).^2 + k);
% 反傅里叶变换,得到空域图像
f_hat_inv = real(ifft2(F_hat_inv));
f_hat_wiener = real(ifft2(F_hat_wiener));
f_hat_lsm = real(ifft2(F_hat_lsm));
% 显示结果
figure;
subplot(2,2,1); imshow(f); title('原始图片');
subplot(2,2,2); imshow(g); title('退化图片');
subplot(2,2,3); imshow(f_hat_inv); title('全逆滤波');
subplot(2,2,4); imshow(f_hat_wiener); title('维纳滤波');
% 对比不同k值下的滤波效果
k_values = [0.0001, 0.001, 0.01, 0.1];
figure;
for i = 1:length(k_values)
k = k_values(i);
F_hat_lsm = conj(H) ./ (abs(H).^2 + k);
F_hat_lsm = F_hat_lsm .* G ./ (abs(H).^2 + k);
f_hat_lsm = real(ifft2(F_hat_lsm));
subplot(2,2,i); imshow(f_hat_lsm); title(['k = ', num2str(k)]);
end
```
在上述代码中,使用了`fspecial`函数计算了点扩散函数,使用`fft2`和`ifft2`函数进行傅里叶变换和反傅里叶变换。在维纳滤波和约束最小二乘滤波中,使用了不同的k值进行比较。最后使用`subplot`函数将不同的结果显示在同一张图中,方便对比。
需要注意的是,以上代码仅为示例代码,实际使用时需要根据具体情况进行调整。
阅读全文