OpenCV4(C++)——形态学(腐蚀、膨胀)
文章目录
- 一、腐蚀(erode)
- 二、膨胀(dilate)
- 三、形态学操作
- 四、总结
一、腐蚀(erode)
OpenCV 4提供了用于图像腐蚀的erode()函数。
void cv::erode(src, dst, kernel, anchor, iterations, borderType, borderValue)src:输入图像。
dst:输出图像,与输入图像具有相同的大小和类型。
kernel:腐蚀操作的结构元素。可以自己定义,也可以用getStructuringElement()函数生成。
anchor:结构元素的锚点位置,默认为 (-1, -1),表示位于结构元素的中心。
iterations:指定腐蚀操作的迭代次数,默认为 1。
borderType:图像边框的处理方式,默认为 BORDER_DEFAULT。
borderValue:默认使用边界不变外推法时的边界值。当边框类型为 BORDER_CONSTANT 时,指定边框的固定值,默认为 0。cv::Mat cv::getStructuringElement(int shape,Size ksize, // 结构元素的尺寸大小Point anchor = Point(-1,-1) // 中心点的位置,默认参数为结构元素的几何中心点)
shape:结构元素的种类: MORPH_RECT(简记:0) —— 矩形结构元素,所有元素都为1MORPH_CROSS(简记:1)—— 十字结构元素,中间的列和行元素为1MORPH_ELLIPSE(简记:2) —— 椭圆结构元素,矩形的椭圆内接元素为1
代码如下(示例):
//cv::Mat image = cv::imread("C:/Users/Opencv/temp/wz.png",cv::IMREAD_GRAYSCALE);cv::Mat image = cv::imread("C:/Users/Opencv/temp/black.png", cv::IMREAD_GRAYSCALE);cv::Mat erodeImage;cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));cv::erode(image, erodeImage, kernel);
注意:腐蚀从字面意思上不难理解是缩小轮廓的意思,但erode函数只针对图像中的非0像素。因此,如果图像是以0像素为背景,那么腐蚀操作后会看到图像中的内容变得更瘦小;如果图像是以255像素为背景,那么腐蚀操作后会看到图像中的内容变得更粗大。
二、膨胀(dilate)
图像的膨胀与图像腐蚀是一对相反的过程,OpenCV 4提供了用于图像膨胀的dilate()函数,函数原型和erode是一样的。
同样注意,如果图像是以0像素为背景,那么膨胀操作后会看到图像中的内容变得更粗大;如果图像是以255像素为背景,那么膨胀操作后会看到图像中的内容变得更细小。
总结:常规理念中的腐蚀和膨胀是在0像素(黑色)背景下的。
三、形态学操作
腐蚀和膨胀都是图像形态学操作的其中一种,两者还可以有多种组合方式。如常见的开运算和闭运算:
(1)腐蚀可以将细小的噪声区域去除,但也会将图像主要区域的面积缩小;所以可以在腐蚀操作后,再进行膨胀操作,来弥补较大连通域因腐蚀而造成的面积减小。这种操作称为开运算。
(2)膨胀可以扩充每一个区域的面积,填充较小的空洞,连接两个临近的连通域,但是同样会增加噪声的面积;所以可以在膨胀操作只会,再进行腐蚀操作减少由膨胀运算引起的连通域边界和面积的扩大。这种操作被成为闭运算。
此外,形态学操作还有梯度(描述目标边界)、顶帽运算(原图像与开运算结果之间的差值,用来分离比邻近点亮一些的斑块)、黑帽运算(原图像与闭运算结果之间的差值,往往用来分离比邻近点暗一些的斑块)、击中击不中变换(找出与结构元素一模一样的结构)。
OpenCV 4提供了morphologyEx()函数来囊括这些形态学操作
void cv::morphologyEx(InputArray src, OutputArray dst,int op, // 形态学操作类型的标志InputArray kernel, // 结构元素,可以自己生成,也可以用getStructuringElement()函数生成anchor = Point(-1,-1), // 中心点在结构元素中的位置,默认参数为结构元素的几何中心点int iterations = 1,int borderType = BORDER_CONSTANT,const Scalar & borderValue = morphologyDefaultBorderValue() 其中第三个参数形态学操作类型的标志:
标志参数 简记 作用
MORPH_ERODE 0 图像腐蚀
MORPH_DILATE 1 图像膨胀
MORPH_OPEN 2 开运算
MORPH_CLOSE 3 闭运算
MORPH_GRADIENT 4 形态学梯度
MORPH_TOPHAT 5 顶帽运算
MORPH_BLACKHAT 6 黑帽运算
MORPH_HITMISS 7 击中击不中运算
四、总结
腐蚀和膨胀其实可以看成对图片进行了一次(多次)卷积操作。并且需要根据实际情况来选择使用哪种形态学操作,但通常来说,开运算(先腐蚀再膨胀)是比较常用的,因为其可以去除噪音和一些不相干的微小区域,并保留主要区域。(但感觉就像是滤波处理)
相关文章:

OpenCV4(C++)——形态学(腐蚀、膨胀)
文章目录 一、腐蚀(erode)二、膨胀(dilate)三、形态学操作四、总结 一、腐蚀(erode) OpenCV 4提供了用于图像腐蚀的erode()函数。 void cv::erode(src, dst, kernel, anchor, iterations, borderType, bo…...
C++设计模式_24_Visitor 访问器
Visitor 访问器也是属于“行为变化”模式。 文章目录 1. 动机( Motivation)2. 代码演示Visitor 访问器3. 模式定义4. 结构(Structure)5. 要点总结6. 其他参考1. 动机( Motivation) 在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基…...

el-tabel表格加个多选框
<template><div><el-checkbox v-model"checked" :disabled"checkedDis" change"onAllSelectChange">多选框</el-checkbox>点击多选框,禁用列表复选框<el-table ref"multipleTable" :data"…...

Go语言集成开发环境(IDE):GoLand 2023中文
GoLand 2023是一款由JetBrains开发的现代化、功能丰富的Go语言集成开发环境(IDE)。它提供了智能代码提示和自动完成、强大的内置调试器以及代码重构工具,帮助开发者提高编码效率并确保代码质量。GoLand 2023还支持多种版本控制系统࿰…...

opencv c++ canny 实现 以及与halcon canny的对比
Opencv和C实现canny边缘检测_opencv边缘增强-CSDN博客 一、canny实现步骤 1、图像必须是单通道的,也就是说必须是灰度图像 2、图像进行高斯滤波,去掉噪点 3、sobel 算子过程的实现,计算x y方向 、梯度(用不到,但是…...

阿里云无影升级2.0 云电脑解决方案时代到来
10月31日,杭州云栖大会上,阿里云宣布无影全新升级2.0:从云电脑到云上解决方案,帮助中小企业更便捷地构建云上办公,并开放无影产品及解决方案能力,为生态合作伙伴提供企业云平台,帮助其打造定制化…...

【案例展示】多物理场仿真软件介绍
本期案例来自上海交通大学微波与射频研究中心团队,团队针对集成电路技术发展过程中面临的挑战,通过FastCAE平台对自研多物理场仿真求解器进行功能拓展与集成,使用户可基于不同的电、热、应力场景和仿真需求,灵活设定参数进行快速准…...
k8s的RBAC中,clusterrole, rolebinding 是什么关系谁先谁后
在Kubernetes中,Role-Based Access Control(RBAC)用于控制集群中不同用户、服务账号或组的访问权限。ClusterRole 和 RoleBinding 是两个关键的 RBAC 组件,它们之间的关系是 ClusterRole 定义了一组权限规则,而 RoleBi…...

myabtis流式查询
1、流式查询简介 流式处理在大数据方面应用比较广泛。随着数据的爆发式增长,流式处理的方式也被应用到日常的工具中,如JDK的对于集合处理的Stream流、Redis5.0新增的数据结构Stream专门来处理消息等。 流式查询指的是查询成功后不是返回一个集合而是返回…...

K8S的pod创建过程
创建流程图 用户发起请求创建deployment;apiserver收到创建资源的请求,apiserver对客户端操作进行身份认证,认证完成后接受该请求,并把相关的信息保存到etcd中,然后返回确认信息给客户端;apiserver向etcd…...

java修仙传之海岛奇遇
昨日开会, 商量了一下接口返回数据, 要求统一, 之前也同意,直接抛异常, 现在觉得之前那个异常不好, 看着不美观,对客户不友好 要求重新做。 大概要求如下: 要求1:范…...

电子商务平台对接电商供应链,不得不说的开放平台电商API接口
B2B电商开放平台的设计需要从以下几面去思考: 开放平台API接口的设计,主要是从功能需求的角度,设计满足业务需求的接口及对应的字段; 平台与商家之间信息的对接,对接的方法有哪些?对接过程中需要可能会遇到…...

【JAVA学习笔记】 57 - 本章作业
项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter14/src/com/yinhai/homework 1. (1)封装个新闻类,包含标题和内容属性,提供get, set方法, 重写toString方法,打印对象时只打印标题; (2)只提供…...
【题解】[GenshinOI Round 3] P9816 少项式复合幂
题目链接 分析 首先这题给了很大的提示信息 注意 m 和 p 的范围 , 很自然的想到可以先把所有可能的 f ( x ) f(x) f(x) 算出来. 思维误区 有些人在算完 f ( x ) f(x) f(x) 之后可能就会去思考找环的问题,然后一些码力弱的大佬就会祭掉. 在经过仔细的观察之后…...

手写数字识别--神经网络实验
实验源码自取: 神经网络实验报告源码.zip - 蓝奏云 上深度学习的课程,老师布置了一个经典的实验报告,我做了好久才搞懂,所以把实验报告放到CSDN保存,自己忘了方便查阅,也为其他人提供借鉴 由于本人是小白…...

双11消费遇冷?如何让消费回归心智原点
近一年来,小红书话题「重新养育自己」引热议。直面成长缺憾,不少人探寻解决方案,即像对待新生命般,不论是衣食住行还是心灵,重新关照自己。 借此,本期千瓜将锁定小红书热门话题背后的消费观转变࿰…...

一分钟了解:什么是Image Matting?
1. 基本概念 Image Matting是图像处理领域的一个基本任务,意为“图像背景抠出”或者“抠图”。这项任务在图像处理、影视制作领域广泛应用。比如,拍电影时常用的扣绿,就是演员在绿幕前面表演,后期再把人物抠出来放到一个新的背景…...

微信小程序 跳转客服页面
前言 小程序 用户反馈 没有页面设计 可以直接跳转小程序指定客服页面 <button class"contactBtn"open-type"contact" contact"handleContact" session-from"sessionFrom">...
10个简单增删改查的免费Spring Boot源代码项目
此页面包含用于学习目的的免费 Spring boot 项目列表。每个 Spring boot 项目的源代码都托管在 GitHub 存储库上,因此您可以免费下载或克隆源代码并亲身体验 Spring boot 框架。 1.员工管理应用程序(ReactJS Spring Boot CRUD全栈应用程序) …...
mysql数据表设计
命名 mysql表名的命名规范为表名可以用 t_ 、tb_的前缀,或者是业务模块前缀。比如t_order。 有些项目也会使用 tt_、tm_、 ts_ 等前缀,根据项目的习惯命名就好了。 主键: AUTO_INCREMENT 表示自增,UNSIGNED 表示无符号…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...