当前位置: 首页 > news >正文

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>点击多选框&#xff0c;禁用列表复选框<el-table ref"multipleTable" :data"…...

Go语言集成开发环境(IDE):GoLand 2023中文

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

opencv c++ canny 实现 以及与halcon canny的对比

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

阿里云无影升级2.0 云电脑解决方案时代到来

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

【案例展示】多物理场仿真软件介绍

本期案例来自上海交通大学微波与射频研究中心团队&#xff0c;团队针对集成电路技术发展过程中面临的挑战&#xff0c;通过FastCAE平台对自研多物理场仿真求解器进行功能拓展与集成&#xff0c;使用户可基于不同的电、热、应力场景和仿真需求&#xff0c;灵活设定参数进行快速准…...

k8s的RBAC中,clusterrole, rolebinding 是什么关系谁先谁后

在Kubernetes中&#xff0c;Role-Based Access Control&#xff08;RBAC&#xff09;用于控制集群中不同用户、服务账号或组的访问权限。ClusterRole 和 RoleBinding 是两个关键的 RBAC 组件&#xff0c;它们之间的关系是 ClusterRole 定义了一组权限规则&#xff0c;而 RoleBi…...

myabtis流式查询

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

K8S的pod创建过程

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

java修仙传之海岛奇遇

昨日开会&#xff0c; 商量了一下接口返回数据&#xff0c; 要求统一&#xff0c; 之前也同意&#xff0c;直接抛异常&#xff0c; 现在觉得之前那个异常不好&#xff0c; 看着不美观&#xff0c;对客户不友好 要求重新做。 大概要求如下&#xff1a; 要求1&#xff1a;范…...

电子商务平台对接电商供应链,不得不说的开放平台电商API接口

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

【JAVA学习笔记】 57 - 本章作业

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter14/src/com/yinhai/homework 1. (1)封装个新闻类&#xff0c;包含标题和内容属性&#xff0c;提供get, set方法&#xff0c; 重写toString方法&#xff0c;打印对象时只打印标题; (2)只提供…...

【题解】[GenshinOI Round 3] P9816 少项式复合幂

题目链接 分析 首先这题给了很大的提示信息 注意 m 和 p 的范围 , 很自然的想到可以先把所有可能的 f ( x ) f(x) f(x) 算出来. 思维误区 有些人在算完 f ( x ) f(x) f(x) 之后可能就会去思考找环的问题&#xff0c;然后一些码力弱的大佬就会祭掉. 在经过仔细的观察之后…...

手写数字识别--神经网络实验

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

双11消费遇冷?如何让消费回归心智原点

近一年来&#xff0c;小红书话题「重新养育自己」引热议。直面成长缺憾&#xff0c;不少人探寻解决方案&#xff0c;即像对待新生命般&#xff0c;不论是衣食住行还是心灵&#xff0c;重新关照自己。 借此&#xff0c;本期千瓜将锁定小红书热门话题背后的消费观转变&#xff0…...

一分钟了解:什么是Image Matting?

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

微信小程序 跳转客服页面

前言 小程序 用户反馈 没有页面设计 可以直接跳转小程序指定客服页面 <button class"contactBtn"open-type"contact" contact"handleContact" session-from"sessionFrom">...

10个简单增删改查的免费Spring Boot源代码项目

此页面包含用于学习目的的免费 Spring boot 项目列表。每个 Spring boot 项目的源代码都托管在 GitHub 存储库上&#xff0c;因此您可以免费下载或克隆源代码并亲身体验 Spring boot 框架。 1.员工管理应用程序&#xff08;ReactJS Spring Boot CRUD全栈应用程序&#xff09; …...

mysql数据表设计

命名 mysql表名的命名规范为表名可以用 t_ 、tb_的前缀&#xff0c;或者是业务模块前缀。比如t_order。 有些项目也会使用 tt_、tm_、 ts_ 等前缀&#xff0c;根据项目的习惯命名就好了。 主键&#xff1a; AUTO_INCREMENT 表示自增&#xff0c;UNSIGNED 表示无符号&#xf…...

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开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

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