%%%%%%%%%%% 模糊图像复原的设计与实现 %%%%%%%%%%%%%%%%%
%%%%%%%%%%% 1.维纳滤波算法 %%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%% 2.波约束最小二乘滤波算法 %%%%%%%%%%%%%%%%%
%%%%%%%%%%% 3.Richardson-Lucy算法 %%%%%%%%%%%%%%%%%%%
%%%%%%%%%%% 读取原始图像 %%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc
clear all
[FileName, FilePath]=uigetfile('*.tif;*.jpg;*.png;*.img;*.gif;','请选择需要图像数据');%选择测试图片
str=[FilePath FileName];%选择图片路径地址
Ori_img = imread(str);%读取图像
figure(1)
subplot(331);imshow(Ori_img);title('原始图像')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%% 生成一副运动模糊图像 %%%%%%%%%%%%%%%%%%%%%%
LEN = 27;THETA = 27;%设置模糊变量
psf = fspecial('motion',LEN,THETA); %点扩散函数
MoHu_img = imfilter(Ori_img,psf,'conv','circular'); % 产生运动模糊图像
subplot(332);imshow(MoHu_img);title('运动模糊图像');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%% 1.利用维纳滤波算法复原 %%%%%%%%%%%%%%%%%%%%
%信噪比 0.01
Wiener_img_low = deconvwnr(MoHu_img,psf,0.01);%利用维纳滤波算法复原
subplot(334);imshow(Wiener_img_low);title('维纳滤波算法修复图像K=0.01');
%信噪比 0.001
Wiener_img_high = deconvwnr(MoHu_img,psf,0.001);%利用维纳滤波算法复原
subplot(335);imshow(Wiener_img_high);title('维纳滤波算法修复图像K=0.001');
%信噪比 0.0001
Wiener_img_veryhigh = deconvwnr(MoHu_img,psf,0.0001);%利用维纳滤波算法复原
subplot(335);imshow(Wiener_img_veryhigh);title('维纳滤波算法修复图像K=0.001');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%% 2.利用波约束最小二乘滤波算法复原 %%%%%%%%
Mini_img = deconvreg(MoHu_img,psf); %利用波约束最小二乘滤波算法复原
subplot(333);imshow(Mini_img);title('约束最小二乘滤波算法修复图像');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%% 3.利用Richardson-Lucy算法复原 %%%%%%%%%%%
%重复次数缺省10
Lucy_img_10 = deconvlucy(MoHu_img,psf); %利用Richardson-Lucy算法复原重复次数缺省
subplot(337);imshow(Lucy_img_10);title('Richardson-Lucy算法修复图像缺省');
%重复次数30
Lucy_img_30 = deconvlucy(MoHu_img,psf,30); %利用Richardson-Lucy算法复原重复次数30
subplot(338);imshow(Lucy_img_30);title('Richardson-Lucy算法修复图像30');
%重复次数60
Lucy_img_60 = deconvlucy(MoHu_img,psf,60); %利用Richardson-Lucy算法复原重复次数30
subplot(339);imshow(Lucy_img_60);title('Richardson-Lucy算法修复图像60');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%% 保存图像 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
imwrite(Ori_img,'测试图片保存.jpg');
imwrite(MoHu_img,'测试图片模糊.jpg');
imwrite(Wiener_img_low,'测试图片维纳0.01.jpg');
imwrite(Wiener_img_high,'测试图片维纳0.001.jpg');
imwrite(Wiener_img_veryhigh,'测试图片维纳0.0001.jpg');
imwrite(Mini_img,'测试图片最小二乘.jpg');
imwrite(Lucy_img_10,'测试图片Lucy10.jpg');
imwrite(Lucy_img_30,'测试图片Lucy30.jpg');
imwrite(Lucy_img_60,'测试图片Lucy60.jpg');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%% 读取每种方法处理后的效果图 %%%%%%%%%%%%%%%%%
A=imread('测试图片保存.jpg');%根据选择图片名称修改
B=imread('测试图片模糊.jpg');
C=imread('测试图片维纳0.01.jpg');
D=imread('测试图片最小二乘.jpg');
E=imread('测试图片Lucy10.jpg');
F=imread('测试图片维纳0.001.jpg');
G=imread('测试图片维纳0.0001.jpg');
H=imread('测试图片Lucy30.jpg');
I=imread('测试图片Lucy60.jpg');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%% 计算每种方法处理后图像的峰值信噪比PSNR %%%%%
psnr_Value_MuHu = PSNR(A,B);
psnr_Value_WeiNa_low = PSNR(A,C);
psnr_Value_WeiNa_high = PSNR(A,F);
psnr_Value_WeiNa_veryhigh = PSNR(A,G);
psnr_Value_Min = PSNR(A,D);
psnr_Value_Lucy10 = PSNR(A,E);
psnr_Value_Lucy30 = PSNR(A,H);
psnr_Value_Lucy60 = PSNR(A,I);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%% 显示每种方法处理后图像的峰值信噪比PSNR %%%%%
psnr_Value_MuHu%显示模糊图像信噪比
psnr_Value_WeiNa_low%显示维纳0.01信噪比
psnr_Value_WeiNa_high%显示维纳0.001信噪比
psnr_Value_WeiNa_veryhigh%显示维纳0.0001信噪比
psnr_Value_Min%显示最小二乘信噪比
psnr_Value_Lucy10%显示Lucy10信噪比
psnr_Value_Lucy30%显示Lucy30信噪比
psnr_Value_Lucy60%显示Lucy10信噪比
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%