运动模糊还原|维纳滤波|图像处理

前言

那么这里博主先安利一些干货满满的专栏了!

这两个都是博主在学习Linux操作系统过程中的记录,希望对大家的学习有帮助!

操作系统Operating Syshttps://blog.csdn.net/yu_cblog/category_12165502.html?spm=1001.2014.3001.5482Linux Syshttps://blog.csdn.net/yu_cblog/category_11786077.html?spm=1001.2014.3001.5482这两个是博主学习数据结构的同时,手撕模拟STL标准模版库各种容器的专栏。

STL源码剖析https://blog.csdn.net/yu_cblog/category_11983210.html?spm=1001.2014.3001.5482手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html


一、摘要 

本报告通过Matlab实现维纳滤波,还原模糊图像。

二、实验内容及目的

理解运动模糊和噪声的原理,学习运动模糊还原维纳滤波的原理。于此同时,通过Matlab代码实现对模糊图片的还原。

三、实验相关原理描述

实验步骤

流程如下所示:

  • 对原图进行运动模糊(灰度图)

  • 对原图添加高斯噪声

  • 构建维纳滤波器

运动模糊

运动模糊是指由于相机或物体运动而导致图像模糊的现象。其原理可以用模拟函数来描述。假设在一段时间内,物体或相机从位置x_0移动到位置 x_1,则该时间段内的模糊可以描述为公式。
h(t)=\left\{\begin{array}{ll} \frac{1}{t_{\text {exposure }}}, & 0 \leq t \leq t_{\text {exposure }} \\ 0, & \text { otherwise } \end{array}\right.

其中t_\text{exposure}是曝光时间,即相机镜头打开的时间长度。该函数表示了在运动物体或相机曝光时间内,物体的图像会在图像平面内产生一定的偏移,从而导致图像模糊。在空域中,该函数可以表示公式。
h(x, y)=\left\{\begin{array}{ll} \frac{1}{t_{\text {exposure }}}, & \text { if } a x+b y+c \leq 0 \\ 0, & \text { otherwise } \end{array}\right.
其中 a,b,c 是描述运动方向和速度的参数。可以看到,该函数在图像平面上表示为一个线性函数,表示了在相机曝光时间内,物体图像在图像平面上的运动方向和速度。

通过对运动模糊函数进行卷积操作,可以得到模糊后的图像。假设 f(x,y) 是原始图像,g(x,y) 是模糊后的图像,h(x,y) 是运动模糊函数,则图像计算如公式所示。

g(x, y)=h(x, y) * f(x, y)=\iint_{-\infty}^{\infty} h(\xi, \eta) f(x-\xi, y-\eta) d \xi d \eta

其中\ast表示卷积操作。可以看到,卷积操作表示了原始图像在模糊函数下的加权平均,得到了模糊后的图像。

在Matlab中,我们可以直接调用fspecial函数的'motion'选项来完成运动模糊的变换,部分代码如下所示:

%% 步骤1:添加运动模糊
img = imread('图像路径'); % 读入图像
img = rgb2gray(img);
motion_kernel_size = 31; % 运动模糊核大小
motion_angle = 30; % 运动方向(角度)
motion_distance = 15; % 运动距离(像素)
motion_kernel = fspecial('motion', motion_distance, motion_angle); % 生成运动模糊核
blurred_img = imfilter(img, motion_kernel, 'conv', 'circular'); % 对原始图像进行运动模糊
figure;
imshow(blurred_img);

高斯噪声

高斯噪声是一种连续性随机信号,它的概率密度函数符合正态分布。正态分布是一种常见的概率分布,也被称为高斯分布,其概率密度函数如公式所示。
f(x)=\frac{1}{\sigma \sqrt{2 \pi}} e^{-\frac{(x-\mu)^{2}}{2 \sigma^{2}}}

其中,\mu是分布的均值,\sigma是标准差,x表示随机变量。

%% 步骤2:添加高斯噪声
noise_mean = 0; % 噪声均值
noise_var = 0.01; % 噪声方差
blurred_img = imnoise(blurred_img, 'gaussian', noise_mean, noise_var); % 添加高斯噪声
% figure;
% imshow(blurred_img);

构建维纳滤波器

构建维纳滤波器的步骤中,矩阵变换均在频域上运行。

获取运动模糊滤波器的傅里叶变换

原理如公式所示。
H(u,v) = \mathcal{F} (MotionKernel)

其中 \mathcal{F}表示傅里叶变换,H(u,v)表示运动模糊滤波器的频域矩阵,MotionKernel代表上面步骤生成运动模糊核。

提取噪声分量

原理如公式所示。
N(u,v) = \mathcal{F}(img_{noise}-img_{original})

其中\mathcal{F}表示傅里叶变换,N(u,v)表示频域上的噪声分量,img_{noise}表示经过高斯噪声处理后的噪声图像矩阵,img_{original}表示原矩阵。

获取未退化图片

原理如公式所示。
F(u,v) = \mathcal{F}(img_{original})

搭建维纳斯滤波器

滤波器原理如下公式所示。

其中信噪比K计算方法如公式所示。

K = \frac{|N(u,v)|^{2}}{|F(u,v)|^{2}}
获取模糊图片

原理如公式所示。
G(u,v) = \mathcal{F}(img_{vague})
其中\mathcal{F}表示傅里叶变换,img_{vague}代表经过运动模糊后的图像,G(u,v)代表模糊图片的频域表示。

还原图片

原理如公式所示。

F'(u,v) = G(u,v)\cdot \hat{F}(u,v)
构建维纳滤波器部分Matlab代码如下所示:

%% 步骤2:添加高斯噪声
noise_mean = 0; % 噪声均值
noise_var = 0.01; % 噪声方差
blurred_img = imnoise(blurred_img, 'gaussian', noise_mean, noise_var); % 添加高斯噪声
% figure;
% imshow(blurred_img);
%% 步骤3:构建维纳滤波器
% 1. 构建运动模糊滤波器的傅里叶变化
[m,n] = size(img);
H = fft2(motion_kernel,m,n);
% 2. 提取噪声分量
N = fft2(blurred_img - img);
% 3. 获取未退化图片
F = fft2(img);
% 4. 计算信噪比NSR
K = (abs(N).^2)./(abs(F).^2);
% 5. 搭建维纳滤波器
H_square = abs(H).*abs(H);
F_hat = (1./H).*(H_square./(H_square+K));
% 6. 获取模糊图片
G = fft2(blurred_img);
% 7. 还原图片
F_img = G .* F_hat;

四、实验结果

五、整体代码 
 

%% 步骤1:添加运动模糊
img_o = imread('图片路径'); % 读入图像
img = rgb2gray(img_o);
motion_kernel_size = 31; % 运动模糊核大小
motion_angle = 30; % 运动方向(角度)
motion_distance = 15; % 运动距离(像素)
motion_kernel = fspecial('motion', motion_distance, motion_angle); % 生成运动模糊核
G_img = imfilter(img, motion_kernel, 'conv', 'circular'); % 对原始图像进行运动模糊
% figure;
% imshow(blurred_img);
%% 步骤2:添加高斯噪声
noise_mean = 0; % 噪声均值
noise_var = 0.01; % 噪声方差
blurred_img = imnoise(img, 'gaussian', noise_mean, noise_var); % 添加高斯噪声
% figure;
% imshow(blurred_img);
%% 步骤3:构建维纳滤波器
% 1. 构建运动模糊滤波器的傅里叶变化
[m,n] = size(img);
H = fft2(motion_kernel,m,n);
% 2. 提取噪声分量
N = fft2(blurred_img - img);
% 3. 获取未退化图片
F = fft2(img);
% 4. 计算信噪比NSR
K = (abs(N).^2)./(abs(F).^2);
% 5. 搭建维纳滤波器
H_square = abs(H).*abs(H);
F_hat = (1./H).*(H_square./(H_square+K));
% 6. 获取模糊图片
G = fft2(G_img);
% 7. 还原图片
F_img = G .* F_hat;
%% 步骤4:应用维纳滤波器并还原图像
f_img = uint8(ifft2(F_img));
figure;
hold on;
% title('原图');
% imshow(img_o);
% title('灰度图');
% imshow(img);
% title('运动模糊后的图像');
% imshow(G_img);
% title('还原后的图像');
imshow(f_img);
posted @ 2023-07-16 16:12  背包Yu  阅读(128)  评论(0编辑  收藏  举报  来源