运动模糊还原|维纳滤波|图像处理
前言
那么这里博主先安利一些干货满满的专栏了!
这两个都是博主在学习Linux操作系统过程中的记录,希望对大家的学习有帮助!
Linux Syshttps://blog.csdn.net/yu_cblog/category_11786077.html?spm=1001.2014.3001.5482这两个是博主学习数据结构的同时,手撕模拟STL标准模版库各种容器的专栏。操作系统Operating Syshttps://blog.csdn.net/yu_cblog/category_12165502.html?spm=1001.2014.3001.5482
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代码实现对模糊图片的还原。
三、实验相关原理描述
实验步骤
流程如下所示:
-
对原图进行运动模糊(灰度图)
-
对原图添加高斯噪声
-
构建维纳滤波器
运动模糊
运动模糊是指由于相机或物体运动而导致图像模糊的现象。其原理可以用模拟函数来描述。假设在一段时间内,物体或相机从位置移动到位置 ,则该时间段内的模糊可以描述为公式。
其中是曝光时间,即相机镜头打开的时间长度。该函数表示了在运动物体或相机曝光时间内,物体的图像会在图像平面内产生一定的偏移,从而导致图像模糊。在空域中,该函数可以表示公式。
其中 a,b,c 是描述运动方向和速度的参数。可以看到,该函数在图像平面上表示为一个线性函数,表示了在相机曝光时间内,物体图像在图像平面上的运动方向和速度。
通过对运动模糊函数进行卷积操作,可以得到模糊后的图像。假设 f(x,y) 是原始图像,g(x,y) 是模糊后的图像,h(x,y) 是运动模糊函数,则图像计算如公式所示。
其中表示卷积操作。可以看到,卷积操作表示了原始图像在模糊函数下的加权平均,得到了模糊后的图像。
在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);
高斯噪声
高斯噪声是一种连续性随机信号,它的概率密度函数符合正态分布。正态分布是一种常见的概率分布,也被称为高斯分布,其概率密度函数如公式所示。
其中,是分布的均值,是标准差,表示随机变量。
%% 步骤2:添加高斯噪声
noise_mean = 0; % 噪声均值
noise_var = 0.01; % 噪声方差
blurred_img = imnoise(blurred_img, 'gaussian', noise_mean, noise_var); % 添加高斯噪声
% figure;
% imshow(blurred_img);
构建维纳滤波器
构建维纳滤波器的步骤中,矩阵变换均在频域上运行。
获取运动模糊滤波器的傅里叶变换
原理如公式所示。
其中 表示傅里叶变换,表示运动模糊滤波器的频域矩阵,代表上面步骤生成运动模糊核。
提取噪声分量
原理如公式所示。
其中表示傅里叶变换,表示频域上的噪声分量,表示经过高斯噪声处理后的噪声图像矩阵,表示原矩阵。
获取未退化图片
原理如公式所示。
搭建维纳斯滤波器
滤波器原理如下公式所示。
其中信噪比K计算方法如公式所示。
获取模糊图片
原理如公式所示。
其中表示傅里叶变换,代表经过运动模糊后的图像,代表模糊图片的频域表示。
还原图片
原理如公式所示。
构建维纳滤波器部分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);