图像复原
图像复原
实验目的
利用反向滤波和维纳滤波进行降质图像复原,比较不同参数选择对复原结果的影响。
实验内容
利用反向滤波方法进行图像复原;利用维纳滤波方法进行图像复原。
实验原理
1.逆滤波图像复原
逆滤波(反向滤波)图像复原是最简单的线性滤波复原方法。在已知降质系统的传递函数 和降至图像的傅里叶变换后,可以用下式求得复原图像的傅里叶变换估计。
复原图像的估计可通过傅里叶反变换求得:
在实际使用逆滤波进行图像复原时,要考虑零点的影响。如果在平面上有一些点或区域的,即出现了零点,就会导致不定解。
2.维拉滤波图像复原
维纳滤波图像复原的目的是寻找一个理想图像的估计值,使它们之间的均方误差最小。如果不知道噪声的统计性质,即和未知时,误差函数的最小值在频域中用下式计算:
式中K是噪声对信号的频谱密度之比,近似为一常数。
实验结果与分析
(1)输入图像采用实验1所获取的图像,对输入图像采用运动降质模型,如下式所示:
与降质图像相关的参数是:。
答:首先读入图像lena512color.png并将其转换为灰度图,然后根据运动降质模型的表达式构造,需注意当时,。将原始灰度图进行傅里叶变换和移位变换得到,与运动降质模型相乘,然后再进行移位反变换和傅里叶反变换即可得到运动降质后的图像。原图像和运动模糊后的图像分别如下图左右所示:
实验的源代码如下所示:
clear();
lena=imread("lena512color.png");
lena_gray = rgb2gray(lena);
figure;
subplot(1,2,1)
imshow(lena_gray)
title("原始输入");
T=1;
a=0.02;
b=0.02;
N=512;
H=T*ones(N,N);
for u=-N/2:N/2-1
for v=-N/2:N/2-1
if(a*u+b*v)~=0
H(u+N/2+1,v+N/2+1)=T/(pi*(a*u+b*v))*sin(pi*(a*u+b*v))*exp(-1j*pi*(a*u+b*v));
end
end
end
%% (1)
F = fftshift(fft2(double(lena_gray)));
G = F .* H;
blurred_image_no_noise=real(ifft2(ifftshift(G)));
subplot(1,2,2)
imshow(uint8(blurred_image_no_noise))
title("运动模糊图像");
(2)没有噪声的情况下,对降质后的图像进行反向滤波和维纳滤波操作,得到复原图像。
答:根据逆滤波图像复原公式和维纳滤波函数复原公式,将(1)中得到的分别使用两种复原公式得到,再将进行移位反变换和傅里叶反变换即可得到滤波后的图像。反向滤波和维纳滤波后得到的图像分别如下图左右所示:
实验的源代码如下所示:
%% (2)
figure
inverse_filtered_F=G ./ H;
inverse_filtered_image = real(ifft2(ifftshift(inverse_filtered_F)));
subplot(1,2,1)
imshow(uint8(inverse_filtered_image))
title("反向滤波复原");
K=0;
wiener_filter_F=conj(H)./(abs(H).^2+K).*G;
wiener_filtered_image=real(ifft2(ifftshift(wiener_filter_F)));
subplot(1,2,2)
imshow(uint8(wiener_filtered_image))
title("维纳滤波复原");
(3)对降质后的图像施加均值为 0,方差为 10 的高斯噪声,对降质后的图像进行反向滤波和维纳滤波操作,得到复原图像。
答:首先生成均值为0,方差为10的高斯噪声,然后将噪声先进行傅里叶变换再进行移位变换,加到(1)中得到的上。然后按照和(2)中同样的方法进行反向滤波和维纳滤波操作,得到复原图像。添加噪声后的降质图像、反向滤波操作后的图像、维纳滤波操作后的图像分别如下图左、中、右所示:
实验的源代码如下图所示:
%% (3)
figure;
noise = 10*randn(N,N);
Fnoise=fftshift(fft2(noise));
noisy_G=G+Fnoise;
blurred_image_with_noise=real(ifft2(ifftshift(noisy_G)));
subplot(1,3,1)
imshow(uint8(blurred_image_with_noise))
title("降质加噪");
PSNR_noise=psnr(uint8(blurred_image_with_noise),lena_gray);
inverse_filtered_noise_F=noisy_G ./ H;
inverse_filtered_noise_image = real(ifft2(ifftshift(inverse_filtered_noise_F)));
subplot(1,3,2)
imshow((inverse_filtered_noise_image),[])
title("反向滤波复原");
K=0.01;
wiener_filter_noise_F=conj(H)./(abs(H).^2+K).*noisy_G;
wiener_filtered_noise_image=real(ifft2(ifftshift(wiener_filter_noise_F)));
subplot(1,3,3)
imshow((wiener_filtered_noise_image),[])
title("维纳滤波复原");
(4)在加噪声的情况下,对每一种方法通过计算复原出来的图像的峰值信噪比,进行最优参数的选择,包括反向滤波方法中进行复原的区域半径(这里指恢复频谱边缘到图像中心的像素点距离,实验时统一用像素个数/图像宽高像素数)、维纳方法中的噪声对信号的频谱密度比值𝐾。
答:首先进行反向滤波的最佳区域半径的选取。根据实验参考教程,先大致锁定的范围为32到35,然后在此范围内将每隔0.1取一个值。恢复频谱边缘到图像中心的像素点距离小于的点才进行反向滤波,否则该点取0。对的值进行遍历,对每个对应的反向滤波复原后的图像计算相应的PSNR值,并作PSNR与对应的关系图。
然后进行频谱密度比值𝐾的选取。根据实验参考教程,先大致锁定𝐾的范围为0到0.1,在此范围内每隔0.001取一个值。对于每一个𝐾值,对加噪声后的图像进行维纳滤波,计算出复原后的图像相应的PSNR值,并作PSNR与𝐾之间对应的关系图。
对应的关系图如下图所示:
根据输出结果有:
可知反向滤波的最佳半径为33.3,维纳滤波的最佳𝐾值为0.064。
实验的源代码如下:
%% (4)
figure;
r_range = 30:0.1:35;
best_radius = 30;
max_psnr_i = 0;
psnr_i = zeros(size(r_range));
for idx = 1:length(r_range)
r = r_range(idx);
inv_filtered_F = zeros(N, N);
for a = 1:N
for b = 1:N
if sqrt((a - N/2).^2 + (b - N/2).^2) < r
inv_filtered_F(a, b) = noisy_G(a, b) ./ H(a, b);
end
end
end
inv_filtered_image = real(ifft2(ifftshift(inv_filtered_F)));
PSNR_i = psnr(uint8(inv_filtered_image), lena_gray);
psnr_i(idx) = PSNR_i;
if PSNR_i > max_psnr_i
max_psnr_i = PSNR_i;
best_radius = r;
end
end
subplot(2,1,1)
plot(r_range, psnr_i);
xlabel('r');
ylabel('PSNR_i');
grid on;
K_range = 0:0.001:0.1;
best_K = 0;
max_psnr_w = 0;
psnr_w = zeros(size(K_range));
for kdx = 1:length(K_range)
K = K_range(kdx);
wi_filter_F_n=conj(H)./(abs(H).^2+K).*noisy_G;
wi_filtered_image_n=real(ifft2(ifftshift(wi_filter_F_n)));
PSNR_w=psnr(uint8(wi_filtered_image_n),lena_gray);
psnr_w(kdx) = PSNR_w;
if PSNR_w > max_psnr_w
max_psnr_w = PSNR_w;
best_K = K;
end
end
subplot(2,1,2)
plot(K_range,psnr_w)
xlabel('K');
ylabel('PSNR_w');
grid on;
fprintf('加噪PSNR:%.2f\n',PSNR_noise);
fprintf('最佳半径: %d\n', best_radius);
fprintf('最大PSNR: %.2f\n', max_psnr_i);
fprintf('最佳K值: %.3f\n', best_K);
fprintf('最大PSNR: %.2f\n', max_psnr_w);
(5)将降质图像和利用最优参数恢复后的图像同时显示出来,以便比较。
答:将降质加噪后的图像,利用最佳半径进行反向滤波恢复后的图像和利用最佳进行维纳滤波恢复后的图像分别显示如下左、中、右图所示:
实验的源代码如下:
%% (5)
figure
subplot(1,3,1)
imshow(uint8(blurred_image_with_noise))
title("降质加噪");
inv_filtered_F=zeros(N,N);
r=best_radius;
for a=1:N
for b=1:N
if sqrt((a-N/2).^2+(b-N/2).^2)<r
inv_filtered_F(a,b)=noisy_G(a,b)./H(a,b);
end
end
end
inv_filtered_image=real(ifft2(ifftshift(inv_filtered_F)));
subplot(1,3,2)
imshow(inv_filtered_image,[])
title("最佳半径为33.2的圆内逆滤波");
K=best_K;
wi_filter_F_n=conj(H)./(abs(H).^2+K).*noisy_G;
wi_filtered_image_n=real(ifft2(ifftshift(wi_filter_F_n)));
subplot(1,3,3)
imshow(wi_filtered_image_n,[])
title("实际最佳K=0.064的维纳滤波");
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix