07OpenCV 图像模糊

news2024/12/22 23:06:32

文章目录

  • 图像掩膜操作
  • 模糊原理
  • 均值滤波
  • 高斯滤波
  • 中值滤波
  • 双边滤波
  • 算子
  • 代码

图像掩膜操作

图像掩膜操作

模糊原理

  • Smooth/Blur是图像处理中最简单和常用的操作之一
    使用操作的原因之一就是为了给图像预处理时候减低噪声

    图像噪声是指存在于图像数据中的不必要的或多余的干扰信息

  • Smooth/Blur操作原理是数学的卷积运算,根据不同卷积运算公式,划分了多种图像滤波方式
    图像滤波:指的是在尽量保留图像特征的条件下对目标图像得噪声进行抑制

均值滤波

均值模糊无法克服边缘像素信息丢失缺陷。原因是均值滤波是基于平均权重

在这里插入图片描述
6x6像素表中,3x3的卷积算子从图一所示的红色像素开始卷积,依次从左至右,从上至下。取黄色像素值之和的平均值赋给红色像素,则红色像素为卷积之后的新像素。由此每次移动一个像素。显然,计算平均值时,取值范围越大,"模糊效果"越强烈。

高斯滤波

高斯模糊部分克服了该缺陷,但是无法完全避免,因为没有考虑像素值的不同

一阶高斯算子
在这里插入图片描述> 二阶高斯算子
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这9个点的权重总和等于0.4787147,如果只计算这9个点的加权平均,还必须让它们的权重之和等于1,因此上面9个值还要分别除以0.4787147,得到最终的权重矩阵.
在这里插入图片描述在这里插入图片描述在这里插入图片描述
将这9个值加起来,就是中心点的高斯模糊的值。
对所有点重复这个过程,就得到了高斯模糊后的图像。如果原图是彩色图片,可以对RGB三个通道分别做高斯模糊。

中值滤波

去除椒盐噪声
在这里插入图片描述

双边滤波

高斯双边模糊 – 是边缘保留的滤波方法,避免了边缘信息丢失,保留了图像轮廓不变

双边滤波就是经典的常用的能够保留图像边缘信息的滤波算法之一。双边滤波是一种综合考虑滤波器内图像空域信息和滤波器内图像像素灰度值相似性的滤波算法,可以实现在保留区域信息的基础上实现对噪声的去除、对局部边缘的平滑。双边滤波对高频率的波动信号起到平滑的作用,同时保留大幅值的信号波动,进而实现对保留图像中边缘信息的作用。双边滤波器是两个滤波器的结合,分别考虑空域信息和值域信息,使得滤波器对边缘附近的像素进行滤波时,距离边缘较远的像素值不会对边缘上的像素值影响太多,进而保留了边缘的清晰性。
在这里插入图片描述
空域核:在窗口内每个位置都有权重(即每个位置的像素都考虑)。
在这里插入图片描述
i,j 为模板窗口的其他系数的坐标;

k,l为模板窗口的中心坐标点;

σ为高斯函数的标准差。

w空间域核由像素位置欧式距离决定的模板权值

值域核:一定像素差范围进行局部模糊,像素值高的在高的部分模糊,低的在低的那部分模糊,保留了边缘区分
在这里插入图片描述
i ,j为模板窗口的其他系数的坐标,

f(i,j)表示图像在点i,j处的像素值;

k,l为模板窗口的中心坐标点,对应的像素值为f(k,l)

σ为高斯函数的标准差。

w值域核是由像素值的差值决定的模板权值

双边滤波器的模板权值
在这里插入图片描述双边滤波器的数据公式
在这里插入图片描述 空域权重衡量的是 p,q两点之间的距离,距离越远权重越低
值域权重衡量的是 p,q两点之间的像素值相似程度,越相似权重越大

算子

blur 算子

void blur( InputArray src, OutputArray dst,Size ksize, Point anchor = Point(-1,-1),int borderType = BORDER_DEFAULT );
/*******************************************************************
*			src: 					输入图像
*			dst:					输出图像
*			ksize:					内核大小
*			anchor:				 	 锚点
*						默认Point(-1,-1):锚点在核中心
*			borderType:				 外部像素边界模式(一般不管)	   
*********************************************************************/

高斯算子

void GaussianBlur( InputArray src, OutputArray dst, Size ksize,double sigmaX, double sigmaY = 0,int borderType = BORDER_DEFAULT );
/*******************************************************************
*			src: 					输入图像
*			dst:					输出图像
*			ksize:					内核大小
*					x,y必须是整数,并且为奇数
*			sigmaX:				 	 X方向滤波系数
*			sigmaY:				     Y方向滤波系数
*			borderType:				 外部像素边界模式(一般不管)	   
*********************************************************************/

中值滤波

void medianBlur( InputArray src, OutputArray dst, int ksize );
/*******************************************************************
*			src: 					输入图像
*			dst:					输出图像
*			ksize:					内核大小
*				      大小必须是大于1而且必须是奇数
*********************************************************************/

双边滤波

void bilateralFilter( InputArray src, OutputArray dst, int d,double sigmaColor, double sigmaSpace,int borderType = BORDER_DEFAULT );
/*******************************************************************
*			src: 					输入图像
*			dst:					输出图像
*			d:						滤波过程中每个像素邻域的直径
*			sigmaColor:				 颜色空间滤波器的标准差值
*					参数越大表明该像素领域内有越多的颜色被混合到一起
*			sigmaSpace:				 空间间坐标中滤波器的标准差值
*			borderType:				 外部像素边界模式(一般不管)	   
*********************************************************************/

代码

#include <iostream>
#include <string>
#include <map>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
class Blur 
{
public:
	Blur() :img(imread("test.jpg")) 
	{
		result["原图"] = img;
	}
	void BlurByblur() 
	{
		blur(img, result["blur"], Size(9, 9));
	}
	void BlurByGaussianBlur() 
	{
		GaussianBlur(img, result["GaussianBlur"], Size(9, 9), 9, 9);
	}
	void BlurBymedianBlur() 
	{
		medianBlur(img, result["medianBlur"], 9);
	}
	void BlurBybilateralFilter() 
	{
		bilateralFilter(img, result["bilateralFilter"], 9, 9, 9);
	}
	void Show()
	{
		for (auto& v : result) 
		{
			imshow(v.first, v.second);
		}
		waitKey(0);
	}
private:
	Mat img;
	map<string, Mat> result;
};
int main() 
{
	Blur* p = new Blur;
	p->BlurByblur();
	p->BlurByGaussianBlur();
	p->BlurBymedianBlur();
	p->BlurBybilateralFilter();
	p->Show();
	return 0;
}

在这里插入图片描述

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

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

相关文章

docker基线安全修复和容器逃逸修复

一、docker安全基线存在的问题和修复建议 1、将容器的根文件系统挂载为只读 修复建议&#xff1a; 添加“ --read-only”标志&#xff0c;以允许将容器的根文件系统挂载为只读。 可以将其与卷结合使用&#xff0c;以强制容器的过程仅写入要保留的位置。 可以使用命令&#x…

C++笔试题(选择+编程)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 选择题 请找出下面程序中有哪些错误&#xff08;&#xff09; int main() {int i 10;int j 1;const int *p1;//(1)int const *p2 &i; //(2)p2 &j;//(3)int *const p3 &i;//(4)*p3 20;//(5)*p2 30;//(6…

uniapp和vue项目配置多语言,实现前端切换语言

在uniapp中配置多语言功能&#xff0c;实现前端切换语言&#xff0c;可以按照以下步骤进行&#xff1a; 1. 创建语言包 首先&#xff0c;创建一个名为 lang 的目录&#xff0c;并在该目录下为每种支持的语言创建对应的JSON或JS文件。例如&#xff1a; lang/en.js&#xff08…

Vue3和ElementPlus封装table组件

最近学习vue3.2并自己在写一个项目&#xff0c;然后发现好几个页面都是列表页&#xff0c;重复写table和column也是觉得累&#xff0c;学习的项目列表页不算多&#xff0c;要是公司项目就不一样了&#xff0c;所以就想着自己封装一个table组件&#xff0c;免去大量重复工作和co…

综合实验nginx+nfs+kpa

综合实验 实验目的&#xff1a; 静态资源和动态资源分别存放在远端存储NFS上&#xff0c;NFS上数据实现实时备份&#xff0c;用户通过负载访问后端的web服务。实现ngixn负载高可用&#xff0c;当keepalived master宕机&#xff0c;vip能自动跳转到备用节点 实验环境&#xff…

游戏引擎分层简介

游戏引擎分层架构&#xff08;自上而下&#xff09; 工具层&#xff08;Tool Layer&#xff09; 在一个现代游戏引擎中&#xff0c;我们最先看到的可能不是复杂的代码&#xff0c;而是各种各样的编辑器&#xff0c;利用这些编辑器&#xff0c;我们可以制作设计关卡、角色、动画…

多功能声学综合馆:塑造未来城市空间的先锋

现代城市需要多功能声学综合馆&#xff0c;这不仅是一座建筑&#xff0c;更是空间的变革者&#xff0c;为城市注入活力&#xff0c;展现着未来的发展方向。让我们一同探讨多功能声学综合馆的种种优势&#xff0c;它是如何为城市带来独特的价值。 1. 灵活性与多功能性的典范&am…

【RT-DETR有效改进】结合SOTA思想利用双主干网络改进RT-DETR(全网独家创新,重磅更新)

一、本文介绍 本文给大家带来的改进机制是结合目前SOTAYOLOv9的思想利用双主干网络来改进RT-DETR&#xff08;本专栏目前发布以来改进最大的内容&#xff0c;同时本文内容为我个人一手整理全网独家首发 | 就连V9官方不支持的模型宽度和深度修改我都均已提供&#xff0c;本文内…

RK3568平台开发系列讲解(基础篇)中断线程化

🚀返回专栏总目录 文章目录 一、什么是中断线程化二、中断线程化接口三、中断线程化案例沉淀、分享、成长,让自己和他人都能有所收获!😄 一、什么是中断线程化 中断线程化是一种优化技术, 用于提高多线程程序的性能。 中断线程化的核心思想是将中断处理和主线程的工作分…

paimon取消hive转filesystem

目录 概述实践关键配置spark sql 结束 概述 公司上一版本保留了 hive &#xff0c;此版优化升级后&#xff0c;取消 hive。 实践 关键配置 同步数据时&#xff0c;配置如下&#xff0c;将形成两个库 # ods库 CREATE CATALOG paimon WITH (type paimon,warehouse hdfs:///d…

ospf协议以及案例

OSPF协议网络类型 OSPF协议支持四种网络类型&#xff0c;分别是点到点网络&#xff0c;广播型网络&#xff0c;NBMA网络和点到多点网络。 1、点到点网络是指只把两台路由器直接相连的网络。一个运行PPP的64K串行线路就是一个点到点网络的例子。 2、广播型网络是指支持两台以上…

第二篇【传奇开心果系列】Python的自动化办公库技术点案例示例:深度解读Pandas金融数据分析

传奇开心果博文系列 系列博文目录Python的自动化办公库技术点案例示例系列 博文目录前言一、Pandas 在金融数据分析中的常见用途和功能介绍二、金融数据清洗和准备示例代码三、金融数据索引和选择示例代码四、金融数据时间序列分析示例代码五、金融数据可视化示例代码六、金融数…

第四届信息通信与软件工程国际会议(ICICSE 2024)即将召开!

2024年第四届信息通信与软件工程国际会议&#xff08;ICICSE 2024&#xff09;将于2024年5月10-12日在中国北京举办。本次会议由北京工业大学、IEEE以及Comsoc 联合主办。随着当今社会信息化的高速发展&#xff0c;电子信息技术的应用更是随处可见。其中&#xff0c;信息通信与…

虚拟化之CPU

一 cpu 1 如何查看内核版本&#xff1a;uname -r 2 如何查看操作系统的发行版本&#xff1a;cat /etc/redhat-release 3 计算机系统子的系统 cpu处理器memory内存storage存储network 网络Display显示 4 进程模式 用户模式&#xff08;user mode&#xff09;主要处理I/O的模…

TypeScript11:类型兼容性

类型的兼容性 B -> A&#xff0c;将 B 赋值给 A &#xff0c;如果能完成赋值&#xff0c;则 B 和 A 类型兼容。 鸭子辨型法&#xff08;子结构辨型法&#xff09;&#xff1a; 目标类型需要某一些特征&#xff0c;赋值的类型只要能满足该特征即可。 TS如何进行类型兼容…

SINAMICS V90 PN 指导手册 第7章 位置跟踪

位置跟踪 位置跟踪的主要作用有以下几点&#xff1a; 为单圈绝对值编码器设置一个虚拟多圈扩展位置区域使用齿轮箱时编码器可以重复负载位置 当位置跟踪功能使能后&#xff0c;那么实际位置值在驱动断电时会保存在驱动的掉电存储区中。当驱动器重新上电后&#xff0c;驱动可…

【计算机考研】408学到什么程度才能考130?

408考130要比考研数学考130难的多 我想大部分考过408的考生都是这么认为的。408的难点在于他涉及的范围太广了&#xff0c;首先如果你要备考408&#xff0c;你要准备四门课程&#xff0c;分别是数据结构&#xff0c;计算机组成原理&#xff0c;操作系统和计算机网络。 这四门…

RabbitMQ队列

RabbitMQ队列 1、死信的概念 ​ 先从概念解释上搞清楚这个定义&#xff0c;死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;字面意思可以这样理解&#xff0c;一般来说,producer将消息投递到broker或者直接到queue里了&#xff0c;consumer 从 queue取出消息进行消…

模型部署 - BevFusion - (1) - 思路总结

模型部署实践 - BevFusion 思路总结一、网络结构 - 总结1.1、代码1.2、网络流程图1.3、模块大致梳理 二、Onnx 的导出 -总体思路分析三、优化思路总结 学习 BevFusion 的部署&#xff0c;看了很多的资料&#xff0c;这篇博客进行总结和记录自己的实践 思路总结 对于一个模型我…

如何限制一个账号只在一处登陆

大家好&#xff0c;我是广漂程序员DevinRock&#xff01; 1. 需求分析 前阵子&#xff0c;和问答群里一个前端朋友&#xff0c;随便唠了唠。期间他问了我一个问题&#xff0c;让我印象深刻。 他问的是&#xff0c;限制同一账号只能在一处设备上登录&#xff0c;是如何实现的…