Opencv | 图像卷积与形态学变换操作

news2024/9/23 23:26:58

这里写目录标题

  • 一. 滤波 / 卷积操作
    • 1. 平滑均值滤波/卷积
    • 2. 平滑中值滤波/卷积
    • 3. 平滑高斯滤波/卷积
      • 3.1 关注区域
      • 3.2 分解特性
  • 二. 形态学变换
    • 1. 常用核
    • 2. cv.erode ( ) 腐蚀操作
    • 3. cv.dilate ( ) 膨胀操作
    • 4. Open 操作
    • 5. Close 操作
    • 6. Morphological Gradient 形态梯度操作
    • 7. Top Hat 获取非交叉点特征 操作
    • 8. Black Hat 获取交叉点特征 操作

一. 滤波 / 卷积操作

在每个图像位置(x,y)上进行基于邻域的函数计算,其中函数参数被称为卷积核 (kernel)

  • kernel核的尺寸通常为奇数,一般为: 3 ∗ 3 、 5 ∗ 5 、 7 ∗ 7 3*3、5*5、7*7 335577

不同功能需要定义不同的函数,其中功能可以有:

  1. 图像增强:
              平滑 / 去噪
              梯度 / 锐化

  2. 特征提取、检测:
              边缘 / 显著点
    在这里插入图片描述

    卷积语法
    	dst = cv.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
    	参数:
    		src:输入图像
    		ddepth:输出图像的深度,当其值为-1时,输出图像与输入图像具有相同的深度
    		kernel:卷积核,用于计算每个像素值的矩阵
    		dst:
    			输出图像(可选参数)
    			如果未提供,则会创建一个新的图像
    		anchor:
    			卷积核的锚点
    			默认值为(-1, -1),表示锚点位于卷积核的中心
    		delta:
    			在将结果存储到输出图像之前,将添加到每个像素的值(可选参数),默认为0
    		borderType:
    			像素外推方法(可选参数)
    			用于指定当卷积核超出图像边界时如何处理边界像素
    

1. 平滑均值滤波/卷积

kernel核中的参数和为1,所有参数值全部一样

	属于线性滤波技术
	适用场景:
		适合于去除图像中的随机噪声
		适用于消除高斯噪声和相机失真
		可用于提取较大目标前过滤掉较小的细节或将目标内的小间断连接起来
	作用:
		通过降低图像中的高频分量,减少噪声
		图像整体显得更加平滑
		可能会牺牲一些图像细节

2. 平滑中值滤波/卷积

kernel核有固定的大小,没有固定的值

	属于非线性滤波方法
	适用场景:
		有效去除椒盐噪声
	操作原理: 
		将卷积域内的所有像素值从小到大排序 
		获取中间值作为卷积的输出值
	作用:
		消除图像中的孤立噪声点
		去除噪声的同时保留图像的边缘特征:不依赖于像素点的具体数值,而是取决于它们的相对排序

在这里插入图片描述

	cv2.medianBlur(src, ksize[, dst])
	参数:
		src:输入图像,通常为一个二维的灰度图像
		ksize:一个奇数整数,表示滤波器的大小
		dst(可选):输出图像,与输入图像具有相同的大小和类型

3. 平滑高斯滤波/卷积

G σ = 1 2 π σ 2 e − ( x 2 + y 2 ) 2 σ 2 G_{\sigma}=\frac{1}{2 \pi \sigma^{2}} e^{-\frac{\left(x^{2}+y^{2}\right)}{2 \sigma^{2}}} Gσ=2πσ21e2σ2(x2+y2)

可以有效去除高斯噪声

	线性平滑技术
	cv2.GaussianBlur(src, ksize, sigmaX[, sigmaY[, borderType]])
	参数: 
		src:原始图像
		ksize:滤波核的大小,滤波核的值必须是奇数
		sigmaX:
			卷积核在水平方向上(X轴方向)的标准差,控制权重比例
		sigmaY:
			卷积核在垂直方向上(Y轴方向)的标准差,控制权重比例
				如果sigmaY参数未指定,则其值将默认与sigmaX相同
		borderType:边界类型,用于指定图像边界的处理方法

3.1 关注区域

平滑高斯滤波模拟人眼,关注中心区域
在这里插入图片描述

平滑高斯滤波/卷积
σ σ σ越小,关注区域越小
σ σ σ越大,图片整体越模糊

在这里插入图片描述

3.2 分解特性

G σ ( x , y ) = 1 2 π σ 2 exp ⁡ − x 2 + y 2 2 σ 2 = ( 1 2 π σ exp ⁡ − x 2 2 σ 2 ) ( 1 2 π σ exp ⁡ − y 2 2 σ 2 ) G_{\sigma}(x, y)=\frac{1}{2 \pi \sigma^{2}} \exp -\frac{x^{2}+y^{2}}{2 \sigma^{2}}=\left(\frac{1}{\sqrt{2 \pi} \sigma} \exp ^{-\frac{x^{2}}{2 \sigma^{2}}}\right)\left(\frac{1}{\sqrt{2 \pi} \sigma} \exp ^{-\frac{y^{2}}{2 \sigma^{2}}}\right) Gσ(x,y)=2πσ21exp2σ2x2+y2=(2π σ1exp2σ2x2)(2π σ1exp2σ2y2)

	分解特性(级联高斯) 
		2D卷积拆分为两个相同的1D卷积 
			列卷积 	
			行卷积 
		降低计算 
			2D卷积:K^2次计算 
			1D卷积:2K次计算

在这里插入图片描述

二. 形态学变换

	cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
	参数:
		src:源图像,必须是单通道的灰度图像
		op:形态学操作的类型,包括:
			cv2.MORPH_ERODE(腐蚀)
			cv2.MORPH_DILATE(膨胀)
			cv2.MORPH_OPEN(开运算)
			cv2.MORPH_CLOSE(闭运算)
			cv.MORPH_GRADIENT (形态梯度/边缘特征)
			cv.MORPH_TOPHAT(提取非交叉点的信息)
		kernel:结构元素,用于指定形态学操作的邻域形状和大小
					通常是一种特殊的形状,如线条、矩形、圆形等
		anchor:结构元素的锚点,默认值为Point(-1, -1),表示锚点位于结构元素的中心
		iterations:操作的迭代次数,默认值为1
		borderType:像素外推法的类型,默认为cv2.BORDER_CONSTANT
		borderValue:当使用cv2.BORDER_CONSTANT像素外推法时,此参数表示边界值,默认值为morphologyDefaultBorderValue()
	作用:
		根据指定的操作类型和结构元素对输入图像进行相应的形态学处理

1. 常用核

	cv2.getStructuringElement(shape, ksize[, anchor])
	参数:
		shape:
			结构元素的形状,可以是以下值之一
				cv2.MORPH_RECT(矩形)
				cv2.MORPH_ELLIPSE(椭圆)
				cv2.MORPH_CROSS(十字形)
		ksize:结构元素的大小,表示为一个元组
		anchor(可选):
			结构元素的锚点,表示为一个元组
	作用:
		生成指定形状和大小的结构元素,结构元素通常用于形态学操作,如腐蚀、膨胀、开运算和闭运算等

2. cv.erode ( ) 腐蚀操作

	cv.erode(src, kernel[, iterations])
	参数:
		src:表示输入图像;
				通道数不限
				深度必须是CV_8U,即8位无符号整数类型的单通道图像
		kernel:表示结构元素,通常是一个二维矩阵,用于确定腐蚀操作过程中邻域的形状
					腐蚀操作中,会选择卷积核中非0元素所覆盖区域中的最小值,作为输出图像(dst)中的像素值
		iterations:表示腐蚀操作的迭代次数,默认值为1
				    多次迭代会使得腐蚀效果更加显著。
	操作:在图像(x,y)像素点的邻域中,选择像素最小值作为像素点(x,y)的像素值,即最小值滤波/卷积
	作用:消除物体的边界点,使边界向内收缩,常用于去除小的物体或连接两个有细小连通的物体

3. cv.dilate ( ) 膨胀操作

	cv.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
	参数:
		src:输入图像,通常为二值图像
		kernel:膨胀操作所使用的结构元素
				可以使用cv2.getStructuringElement()函数生成
		dst:输出图像,与输入图像大小和类型相同
		anchor:
			结构元素的锚点
			默认值为(-1, -1),表示锚点位于结构元素的中心
		iterations:膨胀操作的迭代次数,默认值为1
		borderType:边界处理类型,默认值为cv2.BORDER_CONSTANT
		borderValue:边界处理时使用的常数值,默认值为0
	操作:
		在图像(x,y)像素点的邻域中,选择像素最大值作为像素点(x,y)的像素值,即最大值滤波/卷积
	作用:
		扩大图像中的白色区域(前景),从而消除一些小的黑色区域(背景)
		膨胀操作通常用于去除噪声、连接相邻物体等

4. Open 操作

	方式1:
		cv2.morphologyEx( )
	方式2:
		cv.erode( ) + cv.dilate( )
	作用:
		先腐蚀后膨胀

5. Close 操作

	方式1:
		cv2.morphologyEx( )
	方式2:
		cv.dilate( ) + cv.erode( ) 
	作用:
		先膨胀后腐蚀

6. Morphological Gradient 形态梯度操作

在这里插入图片描述
cv.morphologyEx(img, op=cv.MORPH_GRADIENT, kernel=kernel, iterations=1)cv.morphologyEx( )

7. Top Hat 获取非交叉点特征 操作

在这里插入图片描述

	cv.morphologyEx(img, op=cv.MORPH_TOPHAT, kernel=kernel, iterations=1)

8. Black Hat 获取交叉点特征 操作

在这里插入图片描述

	cv.morphologyEx(img, op=cv.MORPH_BLACKHAT, kernel=kernel, iterations=1)

感谢阅读🌼
如果喜欢这篇文章,记得点赞👍和转发🔄哦!
有任何想法或问题,欢迎留言交流💬,我们下次见!
本文相关代码存放位置
    【】

祝愉快🌟!


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

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

相关文章

为什么单片机控制电机需要加电机驱动

通常很多地方只是单纯的单片机MCU没有对电机的驱动能力,或者是介绍关于电机驱动的作用,如: 提高电机的效率和精度。驱动器采用先进的电子技术和控制算法,能够精准控制电机的参数和运行状态,提高了电机的效率和精度。拓…

vos3000外呼系统客户端无法安装如何解决?

如果 VOS3000 外呼系统客户端无法安装,可以尝试以下解决方法: 检查系统要求: 确保你的计算机满足 VOS3000 外呼系统客户端的系统要求,包括操作系统版本、内存、处理器等。如果系统不符合要求,可能会导致安装失败或者运…

[BT]BUUCTF刷题第20天(4.22)

第20天 Web [GWCTF 2019]我有一个数据库 打开网站发现乱码信息(查看其他题解发现显示的是:我有一个数据库,但里面什么也没有~ 不信你找) 但也不是明显信息,通过dirsearch扫描得到robots.txt,然后在里面得…

echarts 双堆叠柱状图(数据整理)

1.后台返回的数据格式 {"code": "0000","message": "","messageCode": "操作成功","sign": null,"detail": null,"data": {"pieChart": [{"key": "产品…

C++之写时复制(CopyOnWrite)

设计模式专栏:http://t.csdnimg.cn/4j9Cq 目录 1.简介 2.实现原理 3.QString的实现分析 3.1.内部结构 3.2.写入时复制 4.示例分析 5.使用场景 6.总结 1.简介 CopyOnWrite (COW) 是一种编程思想,用于优化内存使用和提高性能。COW 的基本思想是&am…

编译支持播放H265的cef控件

接着在上次编译的基础上增加h265支持编译支持视频播放的cef控件(h264) 测试页面,直接使用cef_enhancement,里边带着的那个html即可,h265视频去这个网站下载elecard,我修改的这个版本参考了里边的修改方式,不过我的这个…

Reactor 模式

目录 1. 实现代码 2. Reactor 模式 3. 分析服务器的实现具体细节 3.1. Connection 结构 3.2. 服务器的成员属性 3.2. 服务器的构造 3.3. 事件轮询 3.4. 事件派发 3.5. 连接事件 3.6. 读事件 3.7. 写事件 3.8. 异常事件 4. 服务器上层的处理 5. Reactor 总结 1…

开源啦!一键部署免费使用!Kubernetes上直接运行大数据平台!

市场上首个K8s上的大数据平台,开源啦! 智领云自主研发的首个 完全基于Kubernetes的容器化大数据平台 Kubernetes Data Platform (简称KDP) 开源啦🚀🚀 开发者只要准备好命令行工具,一键部署 Hadoop,Hi…

JavaScript(二)

JavaScript的语法 1.JavaScript的大小写 在JavaScript中,大小写是敏感的,这意味着大小写不同的标识符被视为不同的变量或函数。例如,myVariable 和 myvariable 被视为两个不同的变量。因此,在编写JavaScript代码时,必…

函数声明与调用:接口原型、参数传递顺序、返回值

示例&#xff1a; /*** brief how about function-declare-call? show you here.* author wenxuanpei* email 15873152445163.com(query for any question here)*/ #define _CRT_SECURE_NO_WARNINGS//support c-library in Microsoft-Visual-Studio #include <stdio.h&…

上位机图像处理和嵌入式模块部署(树莓派4b实现多进程通信)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 和mcu固件、上位机软件不太一样的地方&#xff0c;嵌入式设备上面上面的工业软件一般都是多进程的形式。相比较多线程而言&#xff0c;整个系统就不…

springcloudgateway集成knife4j

上篇我们聊聊springboot是怎么继承knife4j的。springboot3 集成knife4j-CSDN博客 本次我们一起学习springcloudgateway集成knife4j。 环境介绍 java&#xff1a;17 SpringBoot&#xff1a;3.2.0 SpringCloud&#xff1a;2023.0.0 knife4j &#xff1a; 4.4.0 引入maven配置…

# 从浅入深 学习 SpringCloud 微服务架构(四)Ribbon

从浅入深 学习 SpringCloud 微服务架构&#xff08;四&#xff09;Ribbon 段子手168 一、ribbon 概述以及基于 ribbon 的远程调用。 1、ribbon 概述&#xff1a; Ribbon 是 Netflixfa 发布的一个负载均衡器,有助于控制 HTTP 和 TCP客户端行为。 在 SpringCloud 中 Eureka …

就业班 第三阶段(负载均衡) 2401--4.19 day3 nginx3

二、企业 keepalived 高可用项目实战 1、Keepalived VRRP 介绍 keepalived是什么keepalived是集群管理中保证集群高可用的一个服务软件&#xff0c;用来防止单点故障。 ​ keepalived工作原理keepalived是以VRRP协议为实现基础的&#xff0c;VRRP全称Virtual Router Redundan…

用python selenium实现短视频一键推送

https://github.com/coolEphemeroptera/VIVI 效果如下 demo 支持youtube视频搬运

iPerf 3 测试UDP和TCP方法详解

文章目录 前言一、What is iPerf / iPerf3 ?二、功能1. TCP and SCTP2. UDP3. 其他 三、 Iperf的使用1.Iperf的工作模式2. 通用指令3. 服务端特有选项4. 客户端特有选项5. -t -n参数联系 四、Iperf使用实例1. 调整 TCP 连接1. 1TCP 窗口大小调节1. 2 最大传输单元 (MTU)调整 2…

【python项目推荐】键盘监控--统计打字频率

原文&#xff1a;https://greptime.com/blogs/2024-03-19-keyboard-monitoring 代码&#xff1a;https://github.com/GreptimeTeam/demo-scene/tree/main/keyboard-monitor 项目简介 该项目实现了打字频率统计及可视化功能。 主要使用的库 pynput&#xff1a;允许您控制和监…

kafka 命令行使用 消息的写入和读取 quickstart

文章目录 Intro命令日志zookeeper serverkafka servercreate topic && describe topic Intro Kafka在大型系统中可用作消息通道&#xff0c;一般是用程序语言作为客户端去调用kafka服务。 不过在这之前&#xff0c;可以先用下载kafka之后就包含的脚本文件等&#xff0…

在Spring Boot应用中实现阿里云短信功能的整合

1.程序员必备程序网站 天梦星服务平台 (tmxkj.top)https://tmxkj.top/#/ 2.导入坐标 <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.5.0</version></dependency><…

Spring IOC 和 DI详解

目录 一、IOC介绍 1、什么是IOC 2、通过案例来了解IoC 2.1 传统程序开发 2.2 问题分析 2.3 解决方案 2.4 IoC程序开发 2.5 IoC 优势 二、DI介绍 三、IOC 详解 3.1 Bean的存储 3.1.1 Controller&#xff08;控制器存储&#xff09; 3.1.2 Service&#xff08;服务存…