6. 圖像復原技術


6.1 圖像噪聲模型

 1 %--------噪聲的MATLAB實現----------
 2 
 3 %圖像添加噪聲
 4 J=imnoise(I,type,parameters);% type:噪聲類型
 5 
 6 %高斯噪聲
 7 %通過均值和方差產生高斯噪聲
 8 J=imnoise(I,'gaussian',m,v);%m為均值,默認值0;v為方差默認值0.01
 9 %通過位置信息產生高斯噪聲
10 J=imnoise(I,'localvar',V);
11 %根據亮度值產生高斯噪聲
12 J=imnoise(I,'localvar',h,v);%h表示圖像亮度值;v表示與h向量對應的高斯噪聲方差
13 
14 %椒鹽噪聲
15 J=imnoise(I,'salt & pepper',d);%噪聲的密度為d,噪聲占整個像素總數的百分比,默認0.05
16 
17 %泊松噪聲
18 J=imnoise(I,'possion');%從數據中產生泊松噪聲,不是人工噪聲添加到數據中
19 
20 %乘性噪聲
21 J=imnoise(I, 'speckle', v);%J=I*n*I;n是均值為0,方差為V的均勻分布的隨機噪聲,V默認值0.04
22 
23 %均勻分布的噪聲
24 m=256; n=256;
25 a=50;
26 b=180;
27 I=a+(b-a)*rand(m,n);
28 figure;
29 subplot(121);  imshow(uint8(I));
30 subplot(122);  imhist(uint8(I));
31 
32 %指數分布的噪聲
33 m=256; n=256;
34 a=0.04;
35 k=-1/a;
36 I=k*log(1-rand(m, n));
37 figure;
38 subplot(121);  imshow(uint8(I));
39 subplot(122);  imhist(uint8(I));

6.2 空域內的濾波復原

 1 %--------均值濾波--------
 2 
 3 %算術均值和幾何均值
 4 I=imread('cameraman.tif');
 5 I=im2double(I);
 6 I=imnoise(I, 'gaussian', 0.05); %添加高斯噪聲
 7 PSF=fspecial('average', 3); %產生PSF
 8 J=imfilter(I, PSF); %算術均值濾波
 9 K=exp(imfilter(log(I), PSF)); %集合均值濾波
10 figure;
11 subplot(131);  imshow(I);
12 subplot(132);  imshow(J);
13 subplot(133);  imshow(K);
14 
15 %逆諧波均值濾波
16 I=imread('cameraman.tif');
17 I=im2double(I);
18 I=imnoise(I, 'salt & pepper', 0.01);
19 PSF=fspecial('average', 3);
20 Q1=1.6;
21 Q2=-1.6;
22 j1=imfilter(I.^(Q1+1), PSF); %Q為正,去除椒噪聲
23 j2=imfilter(I.^Q1, PSF);
24 J=j1./j2;
25 k1=imfilter(I.^(Q2+1), PSF); %Q為負,去除鹽噪聲
26 k2=imfilter(I.^Q2, PSF);
27 K=k1./k2;
28 figure;
29 subplot(131);  imshow(I);
30 subplot(132);  imshow(J);
31 subplot(133);  imshow(K);
32 
33 %--------順序統計濾波--------
34 
35 %中值濾波器能很好的保留圖片邊緣,非常適合去除椒鹽噪聲,效果優於均值濾波
36 %最大值濾波器也能去除椒鹽噪聲,但會從黑色物體的邊緣去除一些黑色像素
37 %最小值濾波器會從白色物體的邊緣去除一些白色像素
38 
39 %二維中值濾波
40 J=medfilt2(I); %窗口大小默認3*3
41 J=medfilt2(I,[m,n]); %窗口大小m*n
42 
43 %二維排序濾波
44 J=ordfilt2(I, order, domain); %對矩陣domain中的非零值進行排序,order為選擇的像素位置
45 
46 %最大值/最小值濾波
47 I=imread('cameraman.tif');
48 I=im2double(I);
49 I=imnoise(I, 'salt & pepper', 0.01);
50 J=ordfilt2(I, 1, ones(4,4));
51 K=ordfilt2(I, 9, ones(3));
52 
53 %--------自適應濾波--------
54 %wiener2()根據圖像的噪聲進行自適應維納濾波,可以對噪聲進行估計。根據圖像的局部方差來調整濾波器的輸出
55 J=wiener2(I,[m,n],noise); %窗口大小m*n,默認3*3;noise為噪聲的能量
56 [J,noise]=wiener2(I,[m,n]);
57 
58 RGB=imread('saturn.png');
59 I=rgb2gray(RGB);
60 J=imnoise(I, 'gaussian', 0, 0.03);
61 [K, noise]=wiener2(J, [5, 5]); %自適應濾波
62 figure;
63 subplot(121);  imshow(J);
64 subplot(122);  imshow(K);

6.3 圖像復原方法

逆濾波復原

 1 %逆濾波復原
 2 clear all; close all;
 3 I=imread('cameraman.tif');
 4 I=im2double(I);
 5 [m, n]=size(I);
 6 M=2*m; n=2*n;
 7 u=-m/2:m/2-1;
 8 v=-n/2:n/2-1;
 9 [U, V]=meshgrid(u, v);
10 D=sqrt(U.^2+V.^2);
11 D0=130; %截至頻率
12 H=exp(-(D.^2)./(2*(D0^2))); %高斯低通濾波器
13 N=0.01*ones(size(I,1), size(I,2));
14 N=imnoise(N, 'gaussian', 0, 0.001); %添加噪聲
15 J=fftfilter(I, H)+N; %頻域濾波並加入噪聲
16 figure;
17 subplot(121);  imshow(I); %顯示原始圖像
18 subplot(122);  imshow(J, [ ]); %顯示退化后的圖像
19 HC=zeros(m, n);
20 M1=H>0.1; %頻率范圍
21 HC(M1)=1./H(M1);
22 K=fftfilter(J, HC); %逆濾波
23 HC=zeros(m, n);
24 M2=H>0.01;
25 HC(M2)=1./H(M2);
26 L=fftfilter(J, HC); %進行逆濾波
27 figure;
28 subplot(121);  imshow(K, [ ]); %顯示結果
29 subplot(122);  imshow(L, [ ]); %頻率范圍較大,會放大噪聲的影響;頻率范圍較小,則達不到去除模糊的效果
30 
31 function Z=fftfilter(X, H)
32 F=fft2(X, size(H,1), size(H, 2));
33 Z=H.*F;
34 Z=ifftshift(Z);
35 Z=abs(ifft2(Z));
36 Z=Z(1:size(X, 1), 1:size(X, 2));
37 end

維納濾波復原

 1 J=deconvwnr(I, PSF, NSR);  %PSF為點擴散函數,NSR為信噪比
 2 J=deconvwnr(I, PSF, NCORR,ICORR); %NCORR為噪聲的自相關函數,ICORR為原始圖像的自相關函數
 3 
 4 %維納濾波對運動模糊的圖像進行復原
 5 clear all; close all;
 6 I=imread('onion.png');
 7 I=rgb2gray(I);
 8 I=im2double(I);
 9 LEN=25; %參數設置
10 THETA=20;
11 PSF=fspecial('motion', LEN, THETA); %產生PSF
12 J=imfilter(I, PSF, 'conv', 'circular'); %運動模糊
13 NSR=0;
14 K=deconvwnr(J, PSF, NSR); %維納濾波復原
15 figure;
16 subplot(131);  imshow(I); %原圖像
17 subplot(132);  imshow(J); %退化圖像
18 subplot(133);  imshow(K); %復原圖像
19 
20 %維納濾波對含有噪聲的運動模糊圖像進行復原
21 clear all; close all;
22 I=imread('cameraman.tif');
23 I=im2double(I);
24 LEN=21; 
25 THETA=11;
26 PSF=fspecial('motion', LEN, THETA); 
27 J=imfilter(I, PSF, 'conv', 'circular');
28 noise_mean=0;
29 noise_var=0.0001;
30 K=imnoise(J, 'gaussian', noise_mean, noise_var); %添加高斯噪聲
31 figure;
32 subplot(121);  imshow(I);
33 subplot(122);  imshow(K);
34 NSR1=0;
35 L1=deconvwnr(K, PSF, NSR1); %維納濾波復原
36 NSR2=noise_var/var(I(:));
37 L2=deconvwnr(K, PSF, NSR2); %圖像復原
38 figure;
39 subplot(121);  imshow(L1);
40 subplot(122);  imshow(L2);
41 
42 %通過圖像自相關信息進行復原
43 clear all; close all;
44 I=imread('rice.png');
45 I=im2double(I);
46 LEN=20;
47 THETA=10;
48 PSF=fspecial('motion', LEN, THETA);
49 J=imfilter(I, PSF, 'conv', 'circular');
50 figure;
51 subplot(121);  imshow(I);
52 subplot(122);  imshow(J);
53 noise=0.03*randn(size(I));
54 K=imadd(J, noise); %添加噪聲
55 NP=abs(fft2(noise)).^2;
56 NPower=sum(NP(:))/prod(size(noise));
57 NCORR=fftshift(real(ifft2(NP))); %噪聲的自相關函數
58 IP=abs(fft2(I)).^2;
59 IPower=sum(IP(:))/prod(size(I));
60 ICORR=fftshift(real(ifft2(IP))); %圖像的自相關函數
61 L=deconvwnr(K, PSF, NCORR, ICORR); %圖像復原
62 figure;
63 subplot(121);  imshow(K);
64 subplot(122);  imshow(L);

約束最小二乘法復原

 1 J=deconvreg(I,PSF); %PSF為點擴散函數
 2 J=deconvreg(I,PSF,NOISEPOWER);  %NOISEPOWER為噪聲強度,默認為0
 3 J=deconvreg(I,PSF,NOISEPOWER,LRANGE); %LRANGE拉格朗日搜索范圍
 4 J=deconvreg(I,PSF,NOISEPOWER,LRANGE,REGOP); %REGOP為約束算子
 5 
 6 %約束最小二乘法進行圖像復原
 7 clear all; close all;
 8 I=imread('rice.png');
 9 I=im2double(I);
10 PSF=fspecial('gaussian', 8, 4); %產生PSF
11 J=imfilter(I, PSF, 'conv'); %圖像退化
12 figure;
13 subplot(121);  imshow(I);
14 subplot(122);  imshow(J);
15 v=0.02;
16 K=imnoise(J, 'gaussian', 0, v); %添加噪聲
17 NP=v*prod(size(I));
18 L=deconvreg(K, PSF, NP); %圖像復原
19 figure;
20 subplot(121);  imshow(K);
21 subplot(122);  imshow(L);

Lucy-Richardson復原

 1 J=deconvlucy(I, PSF);
 2 J=deconvlucy(I, PSF, NUMIT); %NUMIT為算法的重復次數
 3 J=deconvlucy(I, PSF, NUMIT, DAMPAR); %DAMPAR為偏差閾值
 4 
 5 clear all; close all;
 6 I=imread('rice.png');
 7 I=im2double(I);
 8 LEN=30;
 9 THETA=20;
10 PSF=fspecial('motion', LEN, THETA);
11 J=imfilter(I, PSF, 'circular', 'conv');
12 figure;
13 subplot(121);  imshow(I);
14 subplot(122);  imshow(J);
15 K=deconvlucy(J, PSF, 5); %復原,5次迭代
16 L=deconvlucy(J, PSF, 15); %復原,15次迭代
17 figure;
18 subplot(121);  imshow(K);
19 subplot(122);  imshow(L);

盲解卷積復原

不需要預先知道PSF,而且可以對PSF進行估計

優點:對退化圖像無先驗知識的情況下,仍然能進行復原

 1 [J, PSF]=deconvblind(I, INITPSF);%INITPSF為PSF的估計值,返回PSF為算法實際采用的PSF值
 2 [J, PSF]=deconvblind(I, INITPSF,NUMIT); %NUMIT為算法的重復次數,默認10
 3 [J, PSF]=deconvblind(I, INITPSF,NUMIT,DAMPAR); %DAMPAR為偏移閾值
 4 [J, PSF]=deconvblind(I, INITPSF,NUMIT,DAMPAR,WEIGHT); %WEIGHT為像素的加權值,默認為原始圖像的數值
 5 [J, PSF]=deconvblind(I, INITPSF,NUMIT,DAMPAR,WEIGHT,READOUT); %READOUT為噪聲矩陣
 6 
 7 %對運動模糊圖像采用盲解卷積算法進行復原
 8 clear all; close all;
 9 I=imread('cameraman.tif');
10 I=im2double(I);
11 LEN=20; %設置參數
12 THETA=20;
13 PSF=fspecial('motion', LEN, THETA); %產生PSF
14 J=imfilter(I, PSF, 'circular', 'conv'); %運動模糊
15 INITPSF=ones(size(PSF));
16 [K, PSF2]=deconvblind(J, INITPSF, 30); %圖像復原
17 figure;
18 subplot(121);  imshow(PSF, []); %顯示原PSF
19 subplot(122);  imshow(PSF2, []); %顯示估計PSF
20 axis auto;
21 figure;
22 subplot(121);  imshow(J); %顯示退化圖像
23 subplot(122);  imshow(K); %顯示復原圖像
24 
25 %對退化圖像采用盲解卷積算法進行復原
26 clear all; close all;
27 I=checkerboard(8); %產生圖像
28 PSF=fspecial('gaussian', 7, 10);
29 v=0.001;
30 J=imnoise(imfilter(I, PSF), 'gaussian', 0, v);
31 INITPSF=ones(size(PSF));
32 WT=zeros(size(I));
33 WT(5:end-4, 5:end-4)=1;
34 [K, PSF2]=deconvblind(J, INITPSF, 20, 10*sqrt(v), WT);
35 figure;
36 subplot(131);  imshow(I);
37 subplot(132);  imshow(J);
38 subplot(133);  imshow(K);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM