使用逆滤波法、维纳滤波法、约束最小二乘法、Lucy - Richardson算法恢复运动降质图像的Matlab代码
下面是使用逆滤波法、维纳滤波法、约束最小二乘法、Lucy - Richardson算法恢复运动降质图像的Matlab代码:
% 读取图像
image = imread('example.jpg'); % 请替换为你的图像文件名
image = im2double(image); % 转换为双精度类型
% 模拟运动模糊
PSF = fspecial('motion', 20, 45); % 创建运动模糊的点扩散函数
blurred = imfilter(image, PSF, 'conv', 'circular'); % 应用运动模糊
% 添加高斯噪声
noise_mean = 0;
noise_var = 0.0001;
noisy_blurred = imnoise(blurred, 'gaussian', noise_mean, noise_var); % 添加高斯噪声
% 逆滤波法
F = fft2(noisy_blurred); % 对降质图像进行二维傅里叶变换
H = fft2(PSF, size(noisy_blurred, 1), size(noisy_blurred, 2)); % 对PSF进行二维傅里叶变换
G = F ./ (H + eps); % 逆滤波操作,添加eps避免除零错误
restored_inverse = ifft2(G); % 进行二维逆傅里叶变换
restored_inverse = uint8(real(restored_inverse) * 255); % 转换为uint8类型
% 维纳滤波法
K = noise_var / var(blurred(:)); % 计算维纳滤波的参数K
restored_wiener = deconvwnr(noisy_blurred, PSF, K); % 进行维纳滤波
restored_wiener = uint8(restored_wiener * 255); % 转换为uint8类型
% 约束最小二乘法
R = fspecial('laplacian', [0.25, 0.5, 0.25; 0.5, -3, 0.5; 0.25, 0.5, 0.25]); % 创建拉普拉斯算子
restored_ls = deconvreg(noisy_blurred, PSF, 0.01, R); % 进行约束最小二乘滤波
restored_ls = uint8(restored_ls * 255); % 转换为uint8类型
% Lucy - Richardson算法
num_iter = 50; % 迭代次数
restored_lr = deconvlucy(noisy_blurred, PSF, num_iter); % 进行Lucy - Richardson算法恢复
restored_lr = uint8(restored_lr * 255); % 转换为uint8类型
% 显示结果
figure;
subplot(2, 3, 1);
imshow(uint8(image * 255));
title('原始图像');
subplot(2, 3, 2);
imshow(uint8(blurred * 255));
title('运动模糊图像');
subplot(2, 3, 3);
imshow(uint8(noisy_blurred * 255));
title('含噪运动模糊图像');
subplot(2, 3, 4);
imshow(restored_inverse);
title('逆滤波恢复图像');
subplot(2, 3, 5);
imshow(restored_wiener);
title('维纳滤波恢复图像');
subplot(2, 3, 6);
imshow(restored_ls);
title('约束最小二乘法恢复图像');
figure;
imshow(restored_lr);
title('Lucy - Richardson算法恢复图像');
代码说明:
- 读取图像:使用
imread
函数读取图像,并将其转换为双精度类型。 - 模拟运动模糊:利用
fspecial
函数创建运动模糊的点扩散函数(PSF),并使用imfilter
函数对图像进行卷积操作以模拟运动模糊。 - 添加高斯噪声:使用
imnoise
函数为模糊图像添加高斯噪声。 - 逆滤波法:对降质图像和PSF进行二维傅里叶变换,执行逆滤波操作,再进行二维逆傅里叶变换得到恢复图像。
- 维纳滤波法:计算维纳滤波的参数
K
,使用deconvwnr
函数进行维纳滤波。 - 约束最小二乘法:创建拉普拉斯算子,使用
deconvreg
函数进行约束最小二乘滤波。 - Lucy - Richardson算法:设置迭代次数,使用
deconvlucy
函数进行恢复。 - 显示结果:使用
subplot
和imshow
函数显示原始图像、降质图像和恢复后的图像,并添加中文标题。
你需要把代码中的'example.jpg'
替换成你自己的图像文件名。