1. 程式人生 > >運動模糊影象復原

運動模糊影象復原

1.維納濾波

deconvwnr 用wiener濾波器實現影象去模糊
deconvreg 用regularized濾波器實現影象去模糊
deconvlucy 用Lucy-Richardson濾波器實現影象去模糊
deconvbind 用盲反捲積演算法實現影象去模糊

題目是已知模糊核的,我們需要自己嘗試不同的方差找到最合適的。

img=imread('motion.bmp');
img=im2double(img);
subplot(2,2,1),imshow(img),title("initial")
len=30;
theta=11;
PSF=fspecial("motion"
,len,theta); sVar=var(img(:)); wnr1=deconvwnr(img,PSF,0); subplot(2,2,2),imshow(wnr1),title("without using NSR") wnr2=deconvwnr(img,PSF,0.0001/sVar); subplot(2,2,3),imshow(wnr2),title("with using NSR=0.0001"); wnr3=deconvwnr(img,PSF,0.001/sVar); subplot(2,2,4),imshow(wnr3),title("with using NSR=0.001"); figure(2
),imshow(wnr2) h=fspecial('average'); f=filter2(h,wnr2); figure(3),imshow(f)

在這裡插入圖片描述
處理之後發現取0.001時效果最好,把影象去除,加以均值濾波(對於高斯噪聲來說略優)。

2.模糊及逆濾波

使用imnoise對模糊後的影象加高斯噪聲。
fspecial是定義核所用的,非常重要。

img=imread('work.jpg');
img=rgb2gray(img);
img=im2double(img);

len=28;
theta=14;
PSF=fspecial("motion",len,theta);
blurred=
imfilter(img,PSF,'circular'); % motion blur subplot(2,3,1),imshow(img),title("原圖") subplot(2,3,2),imshow(blurred),title("運動模糊") If=fft2(blurred); Pf=fft2(PSF,500,500); deblurred=ifft2(If./Pf); subplot(2,3,3),imshow(deblurred),title("直接逆濾波") mean=0; var=0.0001; noised=imnoise(blurred,'gaussian',mean,var); subplot(2,3,4),imshow(noised),title("模糊加噪聲") Ifn=fft2(noised); deblurredn=ifft2(Ifn./Pf); subplot(2,3,5),imshow(deblurredn),title("直接逆濾波")

在這裡插入圖片描述
呵呵,逆濾波不能處理有噪聲的影象哦。