当前位置: 首页 > 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	击中击不中运算

四、总结

腐蚀和膨胀其实可以看成对图片进行了一次(多次)卷积操作。并且需要根据实际情况来选择使用哪种形态学操作,但通常来说,开运算(先腐蚀再膨胀)是比较常用的,因为其可以去除噪音和一些不相干的微小区域,并保留主要区域。(但感觉就像是滤波处理)

http://www.lryc.cn/news/215141.html

相关文章:

  • C++设计模式_24_Visitor 访问器
  • el-tabel表格加个多选框
  • Go语言集成开发环境(IDE):GoLand 2023中文
  • opencv c++ canny 实现 以及与halcon canny的对比
  • 阿里云无影升级2.0 云电脑解决方案时代到来
  • 【案例展示】多物理场仿真软件介绍
  • k8s的RBAC中,clusterrole, rolebinding 是什么关系谁先谁后
  • myabtis流式查询
  • K8S的pod创建过程
  • java修仙传之海岛奇遇
  • 电子商务平台对接电商供应链,不得不说的开放平台电商API接口
  • 【JAVA学习笔记】 57 - 本章作业
  • 【题解】[GenshinOI Round 3] P9816 少项式复合幂
  • 手写数字识别--神经网络实验
  • 双11消费遇冷?如何让消费回归心智原点
  • 一分钟了解:什么是Image Matting?
  • 微信小程序 跳转客服页面
  • 10个简单增删改查的免费Spring Boot源代码项目
  • mysql数据表设计
  • pytorch复现4_Resnet
  • 【数据库】形式化关系查询语言(一):关系代数Relational Algebra:基本运算、附加关系代数、扩展的关系代数
  • 【计算机网络】计算机网络和因特网
  • JAVA面经整理(9)
  • IPD(集成产品开发)模式下的产品研发流程
  • Flutter GetX的使用
  • 【Amazon】AWS实战 | 快速发布安全传输的静态页面
  • 前后端登录的密码加密和解密
  • 使用 Curl 和 DomCrawler 下载抖音视频链接并存储到指定文件夹
  • 取消Excel打开密码的两种方法
  • 多测师肖sir_高级金牌讲师_jmeter 反向代理录制脚本