画像復元手法(MATLAB)

画像復元の一般的な方法には主に、逆フィルター復元、ウィーナー フィルター復元、制約付き最小二乗復元、ルーシー リチャードソン復元、ブラインド デコンボリューション復元などがあります。

逆フィルタ復元

f(x,y) は劣化のない理想的な画像である入力画像、g(x,y) は劣化後の観測画像、n(x,y) は加法性ノイズを表します。周波数領域へのフーリエ変換後: G(u,v) = F(u,v)H(u,v)+N(u,v)

画像復元の目的は、推定画像 F'(u,v) を取得し、画像を元の画像 F(u,v) にできるだけ近づけることです。画像を復元する最も簡単な方法は、F'(u,v) = G(u,v)/H(u,v) で、F'(u,v) の逆フーリエ変換を通じて画像を取得します。の推定値は逆フィルタリングと呼ばれます。逆フィルタリングは、制約のない復元方法です。制約のない復元とは、劣化した画像 G(u,v) の場合、劣化したモデル H(u,v) とノイズ N(u,v) の知識に従って、次の推定を行うことを意味します。元の画像 F'(u,v) は、口が小さいという所定のエラー基準になります。最小誤差を求めるプロセスには制約はありません。

直接逆フィルタリングの場合: ノイズの存在により、H を避けるために、劣化した画像の式 F'(u,v) = G(u,v)+N(u,v)/H(u,v) が計算されます。 (u,v) の値が小さすぎるため、逆フィルタリングにいくつかの制限を追加することができ、復元は原点に近いルートを持つ近傍でのみ実行されます。これは擬似逆フィルタリングと呼ばれます。

逆フィルタは画像を復元します。

%建立函数fftfilter()进行图像的频域滤波
function Z=fftifilter(X,H)
F=fft2(X,size(H,1),size(H,2));%傅里叶变换
Z = H.*F;%滤波
Z=ifftshift(Z);
Z=abs(ifft2(Z));%傅里叶反变换
Z=Z(1:size(X,1),1:size(X,2));
end

>> I = imread('E:\persional\matlab\images\cameraman.tif');
>> I = im2double(I);
>> [m,n] = size(I);
>> M=2*m;N=2*n;
>> u=-m/2:m/2-1;
>> v=-n/2:n/2-1;
>> [U,V] = meshgrid(u,v);
>> D=sqrt(U.^2+V.^2);
>> D0=130;%截止频率
>> H=exp(-(D.^2)./(2*(D0^2)));%高斯低通滤波器
>> N=0.01*ones(size(I,1),size(I,2));
>> N=imnoise(N,'gaussian',0,0.01);%添加噪声
>> J=fftifilter(I,H)+N;%频域滤波并加噪声
>> figure,
>> subplot(221),imshow(I);
>> subplot(222),imshow(J,[ ]);
>> HC=zeros(m,n);
>> M1=H>0.1;%频率范围
>> HC(M1)=1./H(M1);
>> K=fftifilter(J,HC);%逆滤波
>> HC=zeros(m,n);
>> M2=H>0.01;
>> HC(M2)=1./H(M2);
>> L=fftifilter(J,HC);
>> subplot(223),imshow(K,[ ]);
>> subplot(224),imshow(L,[ ]);

ここに画像の説明を挿入

ウィナーフィルター修復

J = deconvwnr(I,PSF,NSR)
PSF: 点像分布関数
NSR: 信号対雑音比、信号平均とバックグラウンド標準偏差の比

J = deconvwnr(I,PSF,NCORR,ICORR)
NCORR: ノイズの自己相関関数
ICORR: 元画像の自己相関関数

ウィーナーフィルタリングによるモーションブラー画像の復元:

>> I = imread('E:\persional\matlab\images\lena.bmp');
>> I = rgb2gray(I);
>> I = im2double(I);
>> LEN = 25;%运动位移像素
>> THETA = 20;%运动角度
>> PSF = fspecial('motion',LEN,THETA);%产生PSF
>> J = imfilter(I,PSF,'conv','circular');%运动模糊
>> NSR = 0;
>> K = deconvwnr(J,PSF,NSR);%维纳滤波复原
>> figure,
>> subplot(131),imshow(I);
>> subplot(132),imshow(J);
>> subplot(133),imshow(K);

ここに画像の説明を挿入

ウィーナーフィルタリングによるノイズの多いモーションブラー画像の復元:

>> I = imread('E:\persional\matlab\images\lena.bmp');
>> I = im2double(I);
>> LEN = 21;%运动位移像素
>> THETA = 11;%运动角度
>> PSF = fspecial('motion',LEN,THETA);
>> J = imfilter(I,PSF,'conv','circular');%通过卷积对图像进行滤波,产生模糊图像
>> noise_mean=0;%均值
>> noise_var=0.0001;%方差
>> K = imnoise(J,'gaussian',noise_mean,noise_var);%添加高斯噪声
>> NSR1=0;
>> L1 = deconvwnr(K,PSF,NSR1);%维纳滤波复原
>> NSR2=noise_var/var(I(:));
>> L2=deconvwnr(K,PSF,NSR2);%图像复原
>> figure,
>> subplot(221),imshow(I);
>> subplot(222),imshow(K);
>> subplot(223),imshow(L1);%NSR为0的复原图像
>> subplot(224),imshow(L2);%采用真实的NSR时得到复原的图像

ここに画像の説明を挿入

画像の自己相関情報からの復元:

>> I = imread('E:\persional\matlab\images\lena.bmp');
>> I = im2double(I);
>> LEN = 20;%运动位移像素
>> THETA=10;%运动角度
>> PSF=fspecial('motion',LEN,THETA);%产生PSF
>> J = imfilter(I,PSF,'conv','circular');%运动模糊
>> noise=0.03*randn(size(I));
>> K = imadd(J,noise);%添加噪声
>> NP = abs(fft2(noise)).^2;
>> NPPower=sum(NP(:))/prod(size(noise));
>> NCORR=fftshift(real(ifft2(NP)));%噪声自相关函数
>> IP=abs(fft2(I)).^2;
>> IPower=sum(IP(:))/prod(size(I));
>> ICORR=fftshift(real(ifft2(IP)));%函数自相关函数
>> L=deconvwnr(K,PSF,NCORR,ICORR);%图像复原
>> figure,
>> subplot(221),imshow(I);%原图
>> subplot(222),imshow(J);%退化图像
>> subplot(223),imshow(K);%噪声图像
>> subplot(224),imshow(L);%图像复原

ここに画像の説明を挿入

制約付き最小二乗法復元

J = deconvreg(I,PSF)
J = deconvreg(I,PSF,NOISEPOWER)
J = deconvregl(I,PSF,NOISEPOWER,LRANGE)
J = deconvregl(I,PSF,NOISEPOWER,LRANGE,REGOP)
[J,LAGRA] = deconvreg(IPSF,…)
PSF: 点像分布関数
NOISEPOWER: ノイズの強度、デフォルトは 0
LRANGE: ラグランジュ演算子の検索範囲、デフォルトは [10 -9 ,10 9 ]
REGOP: 制約演算子
LAGRA: LAGRA は最後のラグランジュ演算子

画像復元のための制約付き最小二乗法

>> I = imread('E:\persional\matlab\images\lena.bmp');
>> I = im2double(I);
>> PSF=fspecial('gaussian',8,4);
>> J = imfilter(I,PSF,'conv');%图像退化
>> v=0.04;
>> K = imnoise(J,'gaussian',0,v);%添加噪声
>> NP = v*prod(size(I));
>> L = deconvreg(K,PSF,NP);%图像复原
>> figure,
>> subplot(221),imshow(I);
>> subplot(222),imshow(J);%退化图像
>> subplot(223),imshow(K);%添加噪声
>> subplot(224),imshow(L);

ここに画像の説明を挿入

ラグランジュ演算子による画像復元:

>> I = imread('E:\persional\matlab\images\lena.bmp');
>> I = im2double(I);
>> PSF=fspecial('gaussian',12,6);
>> J = imfilter(I,PSF,'conv');
>> v=0.04;
>> K = imnoise(J,'gaussian',0,v);
>> NP = v*prod(size(I));
>> [L,LAGRA]=deconvreg(K,PSF,NP);%图像复原
>> edged=edgetaper(K,PSF);%提取边缘
>> M1=deconvreg(edged,PSF,[],LAGRA)%图像复原;
>> M2=deconvreg(edged,PSF,[],LAGRA*30);%增大拉格朗日算子
>> M3=deconvreg(edged,PSF,[],LAGRA/30);%减小拉格朗日算子
>> figure,
>> subplot(231),imshow(I);
>> subplot(232),imshow(K);
>> subplot(233),imshow(edged);
>> subplot(234),imshow(M1);
>> subplot(235),imshow(M2);
>> subplot(236),imshow(M3);

ここに画像の説明を挿入

ルーシー・リチャードソンの修復

deconvlucy() は、加速された収束 Lucy-Richardson アルゴリズムを使用して画像を復元します

J = deconvlucy(I,PSF)
J = deconvlucy(I,PSF,NUMIT)
J = deconvlucy(I,PSF,NUMIT,DAMPAR)
J = deconvlucy(I,PSF,NUMIT,DAMPAR,WEIGHT)
J = deconvlucy(I, PSF,NUMIT,DAMPAR,WEIGHT,READOUT)
J = deconvlucy(I,PSF,NUMIT,DAMPAR,WEIGHT,READOUT,SUBSMPL)
PSF: 拡張関数
NUMIT: アルゴリズムの繰り返し回数、デフォルト値は 10
DAMPAR: 偏差しきい値、デフォルト値0
WEIGHT: ピクセルの重み付けされた値、デフォルトは元の画像の初期値です
READOUT: ノイズ マトリックス、デフォルト値は 0
SUBSMPL: サンプリング時間、デフォルト値は 1

モーションブラー画像:

>> I = imread('E:\persional\matlab\images\lena.bmp');
>> I = im2double(I);
>> LEN = 30;
>> THETA = 20;
>> PSF = fspecial('motion',LEN,THETA);
>> J = imfilter(I,PSF,'circular','conv');%图像退化
>> K = deconvlucy(J,PSF,5);%复原,5次迭代
>> L = deconvlucy(J,PSF,15);%复原,15次迭代
>> figure,
>> subplot(221),imshow(I);
>> subplot(222),imshow(J);%图形退化
>> subplot(223),imshow(K);
>> subplot(224),imshow(L);

ここに画像の説明を挿入

ガウスノイズ:

>> I = imread('E:\persional\matlab\images\lena.bmp');
>> I = im2double(I);
>> PSF = fspecial('gaussian',7,10);
>> v = 0.0001>> J = imnoise(imfilter(I,PSF),'gaussian',0,v);%高斯噪声
>> WT = zeros(size(I));
>> WT(5:end-4,5,5:end-4);%像素权重
>> K = deconvlucy(J,PSF,20,sqrt(v));%图像复原
>> L = deconvlucy(J,PSF,20,sqrt(v),WT);
>> figure,
>> subplot(221),imshow(I);
>> subplot(222),imshow(J);
>> subplot(223),imshow(K);
>> subplot(224),imshow(L);

ここに画像の説明を挿入

ブラインドデコンボリューション復元

従来の画像復元法は劣化画像のPSFを事前に知る必要があるが、ブラインドデコンボリューション復元法はPSFを知る必要はなく、PSFを推定する。ブラインド デコンボリューション復元アルゴリズムの利点は、劣化した画像を事前に知らなくても復元できることです。

[J,PSF] = deconvblind(I,INITPSF)
[J,PSF] = deconvblind(I,INITPSF,NUMIT)
[J,PSF] = deconvblind(I,INITPSF,NUMIT,DAMPAR)
[J,PSF] = deconvblind( I,INITPSF,NUMIT,DAMPAR,WEIGHT)
[J,PSF] = deconvblind(I,INITPSF,NUMIT,DAMPAR,WEIGHT,READOUT)
INITPSF: PSF 入力パラメータの推定値 INITPSF
NUMIT: 繰り返し回数
DAMPAR: シフト閾値、デフォルト値は 0 です。
WEIGHT: ピクセルの重み付けされた値、デフォルトは元の画像の値です。
READOUT: ノイズ マトリックス

モーションブラー画像:

>> I = imread('E:\persional\matlab\images\lena.bmp');
>> I = im2double(I);
>> LEN=20;
>> THETA=20;
>> PSF=fspecial('motion',LEN,THETA);
>> J = imfilter(I,PSF,'circular','conv');%运动模糊
>> INITPSF=ones(size(PSF));%输入估计值
>> [K,PSF2] = deconvblind(J,INITPSF,30);%图像复原
>> figure,
>> subplot(221),imshow(PSF,[]);%显示PSF
>> subplot(222),imshow(PSF2,[]);%显示估计的PSF
>> subplot(223),imshow(J);%退化图像
>> subplot(224),imshow(K);%复原图像

ここに画像の説明を挿入

劣化したイメージを復元する:

>> I = checkerboard(8);
>> PSF = fspecial('gaussian',7,10);
>> v = 0.001;
>> J = imnoise(imfilter(I,PSF),'gaussian',0,v);%添加高斯噪声
>> INITPPSF = ones(size(PSF));%输入估计值
>> WT = zeros(size(I));
>> WT(5:end-4,5:end-4)=1;:
>> [K,PSF2] = deconvblind(J,INITPPSF,20,10*sqrt(v),WT);%图像复原
>> figure,
>> subplot(131),imshow(I);
>> subplot(132),imshow(J);
>> subplot(133),imshow(K);

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_56260304/article/details/127461594