前言

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

这两个都是博主在学习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代码实现对模糊图片的还原。

三、实验相关原理描述

实验步骤

流程如下所示:

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

  • 对原图添加高斯噪声

  • 构建维纳滤波器

运动模糊

运动模糊是指由于相机或物体运动而导致图像模糊的现象。其原理可以用模拟函数来描述。假设在一段时间内,物体或相机从位置移动到位置 ,则该时间段内的模糊可以描述为公式。

其中是曝光时间,即相机镜头打开的时间长度。该函数表示了在运动物体或相机曝光时间内,物体的图像会在图像平面内产生一定的偏移,从而导致图像模糊。在空域中,该函数可以表示公式。

其中 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. 计算信噪比NSRK = (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. 计算信噪比NSRK = (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);