デジタル画像処理 - 画像劣化 (大気乱流モデルとモーション ブラー モデル) および画像復元 (逆フィルタリングとウィーナー フィルタリング)

1. 画像の劣化

一般に、画像の劣化モデルは次のように表すことができます。
ここに画像の説明を挿入

ここで、g(x,y) は劣化した画像を表し、h(x,y) は劣化したモデルを表し、f(x,y) は元の画像を表し、n(x,y) はノイズを表します。
周波数領域では次のように表すことができます。
ここに画像の説明を挿入

以下に、大気乱流の物理的特性に基づく大気乱流モデルとモーション ブラー モデルの 2 つの一般的な劣化モデルを紹介します。

1. 大気乱流モデル

劣化モデル:
ここに画像の説明を挿入

k 値が大きくなるにつれて、得られる画像はますますぼやけます (一般に、k=0.0025 激しい乱気流、k=0.001 中程度の乱気流、k=0.00025 低乱気流)。
疑似コード:
{ 画像を読み取り、double 型に変換し、周波数領域空間に変換し、スペクトルを中心に移動します。



モデルを使用して劣化を実行し、
劣化モデルと元の画像を乗算して劣化画像を取得し、
逆フーリエ変換を実行します。
}

コードは以下のように表示されます。

%% 读取图像
image=imread('demo-1.jpg');
subplot(231);
imshow(image);
title('原图像');
f=im2double(image);
 
%% 剧烈大气湍流退化模型
F=fft2(f);%换到频域,信号在低频,噪声在高频
F=fftshift(F);%频谱移到矩阵中心
%执行
[W,H]=size(F);
[u,v]=meshgrid(1:W,1:H);%生成矩阵
H_turbulence=exp(-0.0025* ( (u-W/2).^2+(v-H/2).^2).^(5/6) );
F=F.*H_turbulence;
%傅里叶反变换
X=ifftshift(F);
turimg=ifft2(X);
turimg=uint8(abs(turimg)*256);
subplot(232);
imshow(turimg);
title('退化图像');

2. モーションブラーモデル

劣化モデル:
ここに画像の説明を挿入

ここで、T=1、a=0.1、b=0.1。

加算ノイズ - ガウス ノイズ:

noise=imnoise(motion_blur,'gaussian',noise_mean,noise_var);
noise_mean=0,noise_var=0.01
代码如下:
pic=imread('demo-1.jpg'); 
figure('name','demo2');
subplot(231);imshow(pic);title('原图像');
pic=im2double(pic); 
[width,height]=size(pic);
%% 运动模糊(+噪声
H_motion = fspecial('motion', 28, 90);%运动长度为28,逆时针运动角度为90°
motion_blur = imfilter(pic, H_motion, 'conv', 'circular');%卷积滤波
noise_mean=0;  %添加均值为0
noise_var=0.001; %方差为0.001的高斯噪声
motion_blur_noise=imnoise(motion_blur,'gaussian',noise_mean,noise_var);
subplot(232);imshow(motion_blur,[]);title('运动模糊');
subplot(233);imshow(motion_blur_noise,[]);title('运动模糊加噪声');

2. 画像の修復

1. 逆フィルタリング

画像は劣化関数を使用して処理され、その後、フィルタリング実験を反転するために適切な追加ノイズが続きます。劣化関数が取得されたら、劣化した画像のフーリエ変換を劣化関数で割ることにより、元の画像のフーリエ変換の推定値が計算されます。
ここに画像の説明を挿入

劣化関数がわかっていても、劣化前の画像を正確に復元することはできず、劣化関数が0または小さい値であるとノイズが増幅されやすい

実装のアイデア:
通常、H(0,0) は周波数領域における H(u, v) の最大値であるため。
したがって、解析を原点付近の周波数に限定することで、ゼロ値が発生する確率が減少します。
疑似コード:
{ 信号スペクトルを低周波領域に集中させ、ノイズを高周波領域に集中させます。スペクトルを行列の中心に移動します。スペクトルの中心を中心とし、内部で直接逆フィルタします。コードは次のとおりです




%% 逆滤波复原
fourier_H=fft2(H_motion,width,height);  %统一大小
fourier_degrade_img1=fft2(motion_blur);    %G(u,v)=H(u,v)F(u,v),已知G(u,v),H(u,v),求F(u,v)
restore_one=ifft2(fourier_degrade_img1./fourier_H); h=fspecial('gaussian',width,5);
restore_three=imfilter(restore_one,h,'conv','circular');
subplot(234);imshow(im2uint8(restore_three),[]);title('逆滤波+运动模糊');
 
fourier_degrade_img2=fft2(motion_blur_noise); %G(u,v)=H(u,v)F(u,v)+N(u,v)
restore_two=ifft2(fourier_degrade_img2./fourier_H);
restore_four=imfilter(restore_two,h,'conv','circular');
subplot(235);imshow(im2uint8(restore_four),[]);title('逆滤波+运动模糊加噪声');

2. ウィーナーフィルタリング

ここに画像の説明を挿入
ここに画像の説明を挿入

焦点は信号対雑音比を見つけることにあります。

コードは以下のように表示されます。

%% 维纳滤波
fourier_H_motion=fft2(H_motion,width,height);  %H(u,v)
pow_H_motion=abs(fourier_H_motion).^2;   %|H(u,v)|^2
noise=motion_blur_noise-motion_blur;    %提取噪声分量
fourier_noise=fft2(noise);    % N(u,v)  噪声傅里叶变换
fourier_double_gray_pic=fft2(pic);  %F(u,v)为未经过退化的图片
nsr=abs(fourier_noise).^2./abs(fourier_double_gray_pic).^2;   %噪信比=|N(u,v)|^2/|F(u,v)|^2
H_w=1./fourier_H_motion.*pow_H_motion./(pow_H_motion+nsr); %H_w(u,v)=1/H(u,v)*|H(u,v)|^2/[|H(u,v)|^2+NSR] 
fourier_motion_blur_noise=fft2(motion_blur_noise);  %G(u,v)
restore_with_noise=ifft2(fourier_motion_blur_noise.*H_w);  %输出频域=G(u,v)H_w(u,v),时域为频域傅里叶逆变换
subplot(236);imshow(restore_with_noise,[]);title('维纳滤波')

3. 結果を実感する

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

4. 付録

1. 画像
デモ-1.jpg
画像の説明を追加してください
デモ-2.jpg
画像の説明を追加してください
myMatlab.m

clc;        
clear;       
close all;
%% 官方运动模糊+维纳滤波
I = im2double(imread('demo-1.jpg'));
figure,subplot(2,3,1),imshow(I);
title('原图');

%运动模糊
LEN = 28;
THETA = 90;
PSF = fspecial('motion', LEN, THETA);
blurred = imfilter(I, PSF, 'conv', 'circular');
subplot(2,3,2),imshow(blurred);
title('运动模糊退化');

wnr1 = deconvwnr(blurred, PSF, 0);
subplot(2,3,3),imshow(wnr1);
title('运动模糊复原');

%运动模糊+噪声
noise_mean = 0;
noise_var = 0.0001;
blurred_noisy = imnoise(blurred, 'gaussian', ...
                        noise_mean, noise_var);
subplot(2,3,4),imshow(blurred_noisy)
title('运动模糊+噪声')

wnr2 = deconvwnr(blurred_noisy, PSF, 0);
subplot(2,3,5),imshow(wnr2)
title('模糊+噪声 逆滤波');
signal_var = var(I(:));
wnr3 = deconvwnr(blurred_noisy, PSF, noise_var / signal_var);
subplot(2,3,6),imshow(wnr3)
title('模糊+噪声 维纳滤波');

mymotion.m

clc;         
clear;       
close all;   
pic=imread('demo-1.jpg'); 
figure('name','demo2');
subplot(231);imshow(pic);title('原图像');
pic=im2double(pic); 
[width,height]=size(pic);

%% 运动模糊(+噪声
H_motion = fspecial('motion', 28, 90);%运动长度为28,逆时针运动角度为90°
motion_blur = imfilter(pic, H_motion, 'conv', 'circular');%卷积滤波
noise_mean=0;  %添加均值为0
noise_var=0.001; %方差为0.001的高斯噪声
motion_blur_noise=imnoise(motion_blur,'gaussian',noise_mean,noise_var);
subplot(232);imshow(motion_blur,[]);title('运动模糊');
subplot(233);imshow(motion_blur_noise,[]);title('运动模糊加噪声');

%% 逆滤波复原
fourier_H=fft2(H_motion,width,height);  %变大小
fourier_degrade_img1=fft2(motion_blur);    % G(u,v)=H(u,v)F(u,v),已知G(u,v),H(u,v),求F(u,v)
restore_1=ifft2(fourier_degrade_img1./fourier_H);  % 
h=fspecial('gaussian',width,5);
restore_2=imfilter(restore_1,h,'conv','circular');
subplot(234);imshow(im2uint8(restore_2),[]);title('逆滤波+运动模糊');

fourier_degrade_img2=fft2(motion_blur_noise); %G(u,v)=H(u,v)F(u,v)+N(u,v)
restore_3=ifft2(fourier_degrade_img2./fourier_H);
restore_4=imfilter(restore_3,h,'conv','circular');
subplot(235);imshow(im2uint8(restore_4),[]);title('逆滤波+运动模糊加噪声');

%% 维纳滤波
fourier_H_motion=fft2(H_motion,width,height);  %H(u,v)
pow_H_motion=abs(fourier_H_motion).^2;   %|H(u,v)|^2
noise=motion_blur_noise-motion_blur;    %提取噪声分量
fourier_noise=fft2(noise);    % N(u,v)  噪声傅里叶变换
fourier_double_gray_pic=fft2(pic);  %F(u,v)为未经过退化的图片
nsr=abs(fourier_noise).^2./abs(fourier_double_gray_pic).^2;   %噪信比=|N(u,v)|^2/|F(u,v)|^2
H_w=1./fourier_H_motion.*pow_H_motion./(pow_H_motion+nsr); %H_w(u,v)=1/H(u,v)*|H(u,v)|^2/[|H(u,v)|^2+NSR] 
fourier_motion_blur_noise=fft2(motion_blur_noise);  %G(u,v)
restore_with_noise=ifft2(fourier_motion_blur_noise.*H_w);  %输出频域=G(u,v)H_w(u,v),时域为频域傅里叶逆变换
subplot(236);imshow(restore_with_noise,[]);title('维纳滤波')

myturbulence.m

clc;
clear;
close all;
%% 读取图像
image=imread('demo-2.jpg');
subplot(231);
imshow(image);
title('原图像');
f=im2double(image);

%% 剧烈大气湍流退化模型
F=fft2(f);%换到频域,信号在低频,噪声在高频
F=fftshift(F);%频谱移到矩阵中心
%执行
[W,H]=size(F);
[u,v]=meshgrid(1:W,1:H);%生成矩阵
H_turbulence=exp(-0.0025* ( (u-W/2).^2+(v-H/2).^2).^(5/6) );
F=F.*H_turbulence;
%傅里叶反变换
X=ifftshift(F);
turimg=ifft2(X);
turimg=uint8(abs(turimg)*256);
subplot(232);
imshow(turimg);
title('大气湍流退化');

%% 直接逆滤波
FDeblurred=F./H;
IDeblurred=real(ifft2(ifftshift(FDeblurred)));
subplot(233), imshow(uint8(255.*mat2gray(IDeblurred)));
title('直接逆滤波');

おすすめ

転載: blog.csdn.net/qq_46056318/article/details/124102669