1.用点扩散(PSF)函数创建运动模糊图像,修改参数改变模糊程度。
a) 无噪声运动模糊图像
b) 有噪声运动模糊图像
2.用维纳滤波复原函数deconvwnr 对模糊图像进行复原重建。
a) 对无噪声运动模糊图像用deconvwnr(I,PSF)进行复原;
b)对有噪声运动模糊图像用deconvwnr(I,PSF)、deconvwnr(I,PSF,NSR) 和deconvwnr(I,PSF,NCORR,ICORR)函数进行复原。
function U()
clear;
clc;
img = im2double(imread('cameraman.tif')); % 读取文件
figure('Name','图像复原'); % 开一个叫图像复原的窗口
subplot(2,4,1);imshow(img);title('cameraman.tif原图'); % 显示原图
% 运动模糊(motion)滤波器================================================
len = 28 ;
theta = 14;
PSF = fspecial('motion'); % 逆时针方向以theta角度运动了len个像素
% 进行滤波=============================================================
blurred = imfilter(img,PSF,'circular','conv'); % 无噪声模糊图像,
% ‘circular’ 边界之外的输入数组值是通过隐式假设输入数组具有周期性来计算的。
% ‘conv’ 使用卷积执行多维滤波
% 添加噪声=============================================================
% 这里没用imnoise为了方便后面信噪比和相关性的计算
noisy=0.1*randn(size(img));
blurrednoisy = blurred+noisy; % 有噪声模糊图像
subplot(2,4,2);imshow(blurred);title('无噪声模糊图像'); % 显示无噪声模糊图像
subplot(2,4,5);imshow(blurrednoisy);title('有噪声模糊图像'); % 显示有噪声模糊图像
subplot(2,4,4);imshow(noisy);title('噪声图像'); % 显示噪声图像
% 图像复原 ============================================================
% deconvwnr(I,PSF,NSR) deconvwnr(I,PSF,NCORR,ICORR)
% NSR 噪声信号功率比 NCORR,ICORR噪声和原图像的自相关系数
% 对无噪声运动模糊图像用deconvwnr(I,PSF)进行复原
img_1 = deconvwnr(blurred,PSF);
subplot(2,4,3);imshow(img_1);title('模糊复原图像'); % 模糊复原图像
% 对有噪声运动模糊图像复原
sn = abs(fft2(noisy)).^2; % 噪声功率谱
np = sum(sn(:)/numel(noisy)); % 噪声功率
sf = abs(fft2(img)).^2; % 图像功率谱
fp = sum(sf(:)/numel(img)); % 图像功率
NSR = np/fp; % 噪声功率比
NCORR = fftshift(real(ifft2(sn))); % 噪音相关系数
ICORR = fftshift(real(ifft2(sf))); % 图像相关系数
img_2 = deconvwnr(blurrednoisy,PSF);
img_3 = deconvwnr(blurrednoisy,PSF,NSR);
img_4 = deconvwnr(blurrednoisy,PSF,NCORR,ICORR);
subplot(2,4,6);imshow(img_2);title('噪声模糊NSR=0复原');
subplot(2,4,7);imshow(img_3);title('噪声模糊NSR复原');
subplot(2,4,8);imshow(img_4);title('噪声模糊相关复原');
end