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

news2024/11/27 6:20:31

前言

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

这两个都是博主在学习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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759897.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Ansible故障篇:ansible报错解决python依赖》

一、背景信息 如下报错:这个警告是提醒您当前的Ansible配置在目标主机上使用的是/usr/bin/python而不是建议的/usr/bin/python3,因为Ansible 2.9版本之前的某些版本默认使用早期的Python 2.x版本。然而,在将来的版本中,Ansible将会…

xpath下载安装——Python爬虫xpath插件下载安装(2023.7亲测可用!!)

目录 1.免费下载插件链接(若失效评论区留言发送最新链接)(2023.7亲测可用) 2.安装插件 (1)打开chrome浏览器页面,点击:右上角三个点 > 扩展程序 > 管理拓展程序 &#xff…

leedcode 1326. 灌溉花园的最少水龙头数目

在 x 轴上有一个一维的花园。花园长度为 n,从点 0 开始,到点 n 结束。 花园里总共有 n 1 个水龙头,分别位于 [0, 1, …, n] 。 给你一个整数 n 和一个长度为 n 1 的整数数组 ranges ,其中 ranges[i] (下标从 0 开始…

wsl2中安装docker

1、安装docker 执行以下脚本: 这个脚本在执行之前需要先执行chmod x install-docker.sh这个命令 # install docker curl -fsSL get.docker.com -o get-docker.sh sh get-docker.shif [ ! $(getent group docker) ]; thensudo groupadd docker; elseecho "doc…

暗图增强 小期刊/会议 论文阅读笔记

Y. Ueda, H. Misawa, T. Koga, N. Suetake and E. Uchino, “HUE-Preserving Color Contrast Enhancement Method Without Gamut Problem by Using Histogram Specification,” 2018 25th IEEE International Conference on Image Processing (ICIP), Athens, Greece, 2018, pp…

一种具有集成JFET区域的新型SiC沟道MOSFET,通过该区域改善了其短路容限能力

标题:A Novel SiC Trench MOSFET with Improved Short-circuit Capability through an Integrated JFET Region 阅读日期:2023.7.16 研究了什么 该文章研究了一种新型SiC沟槽栅MOSFET,其具有集成JFET区域(IJ-TMOS)&a…

天天刷题-->LeetCode(最长回文子串)

个人名片: 🐅作者简介:一名大二在校生,热爱生活,爱好敲码! \ 💅个人主页 🥇:holy-wangle ➡系列内容: 🖼️ tkinter前端窗口界面创建与优化 &…

【NLP】使用Word Embedding实现中文自动摘要

使用Word Embedding实现中文自动摘要 主要步骤中文语料库数据预处理生成词向量把文档的词转换为词向量生成各主题的关键词检查运行结果 参考资料 本文通过一个实例介绍如何使用Word Embedding实现中文自动摘要,使用 Gensim中的word2vec模型来生成Word Embedding。 …

揭秘乳腺癌预测黑科技:R语言和支持向量机的奇妙之旅!

一、引言 乳腺癌被认为是全球范围内最常见的癌症之一,对女性健康造成了重大威胁[1]。根据世界卫生组织的统计数据,乳腺癌是女性恶性肿瘤中的主要类型,并且是导致女性死亡的第二大原因[2]。这个事实凸显了乳腺癌在全球范围内的流行程度以及对公…

数据库架构演变过程

🚀 ShardingSphere 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜&…

ES系列--分析器

一、前言 ES进行文档分析就会涉及到分析器,无论是内置的分析器,还是自定义的分析器,都是由一个分词器(tokenizers) 、0或多个词项过滤器(token filters)、0或多个字符过滤器(charact…

随机数检测(四)

随机数检测(四)- 累加和检测、近似熵检测、线性复杂度检测、Maurer通用统计检测、离散傅里叶检测 3.12 累加和检测方法3.13 近似熵检测方法3.14 线性复杂度检测3.15 Maurer通用统计检测3.16 离散傅里叶检测方法 如果商用密码产品认证中遇到问题&#xff…

Python应用实例(二)数据可视化(四)

数据可视化(四)下载数据 1.CSV文件格式1.1 分析CSV文件头‘1.2 打印文件头及其位置1.3 提取并读取数据1.4 绘制温度图表1.5 在图表中添加日期 从网上下载数据,并对其进行可视化。网上的数据多得令人难以置信,大多未经仔细检查。如…

智能车打开usb相机和激光雷达录制数据包的过程记录

首先,智能车的遥控器启动之后,要解除驻车挡位(尾灯不亮红色才可以),然后右上角的那个拨杆是喇叭,对应的左上角的那个拨杆是控制挡位的,包括前进档,后退档。假如是前进,往…

【我们一起60天准备考研算法面试(大全)-第十五天 15/60】【摩尔投票法】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

CSAPP Lab入门探索

此为记录 虚拟机准备工作 下载VMware 直接在浏览器中搜索VMware Workstation即可 等待 安装就是直接下一步下一步即可,那个安装路径也改下,默认是装在系统盘中 许可证: 直接在百度中搜索VMware Workstation 17 Pro密钥大全即可 这里给出一个参考的&…

人体姿态估计动作识别调研报告

人体姿态估计&动作识别 视频演示 Refs: https://www.zhihu.com/zvideo/1227562268420235264 姿态估计与行为识别(行为检测、行为分类)的区别 Refs:姿态估计与行为识别(行为检测、行为分类)的区别 姿态估计 定…

两分钟倒计时 - 啊哈C语言 第4章第5节

题目要求&#xff1a; 尝试编写一个两分钟的倒计时&#xff0c;形如&#xff1a;2:00 1:59 1:58 … 1:00 0:59 0:58 … 0:02 0:01 0:00 代码&#xff1a; #include<stdio.h> #include<stdlib.h> #include<windows.h> int main(){int a2,b0;while(a>0 &…

SpringMVC的XML配置解析-spring18

SpringMVC的有很多组件&#xff1a;&#xff08;这些我们都可以用配件进行配置&#xff09; 1、充沛器 2、映射器 3、视图解析器 默认情况下他们要使用哪个组件&#xff0c;我们可以挖一下&#xff1a; 第一个重叠器映射器 第二个 重叠器适配器 第三个 视图适配器 打开看…

Vue生命周期详解学习笔记

生命周期 生命周期又名生命周期回调函数&#xff0c;生命周期函数&#xff0c;生命周期钩子。生命周期是Vue在关键时刻帮我们调用的一些特殊名称的函数。生命周期函数的名字不可更改&#xff0c;但函数的具体内容是程序员根据需求编写的。生命周期中的this指向vm或组件实例对象…