OpenCV 形态学相关函数详解及用法示例

embedded/2024/10/9 0:26:45/

        OpenCV形态学相关的运算包含腐蚀(MORPH_ERODE),膨胀(MORPH_DILATE),开运算(MORPH_OPEN),闭运算(MORPH_CLOSE),梯度运算(MORPH_GRADIENT),顶帽运算(MORPH_TOPHAT),黑帽运算(MORPH_BLACKHAT),击中击不中变换(MORPH_HITMISS)。

        erode()函数

        erode()函数执行的是腐蚀运算,其原型如下:

        erode()通过使用特定的结构元素(如矩形、圆形等)来处理图像。在某个像素上应用结构元素时,结构元素的锚点与该像素对齐,所有与结构元素相交的像素就包含在当前集合中,腐蚀就是把当前像素替换成所定义像素集合中的最小像素值。即:

因此,腐蚀可去除图像中小的噪点,用于图像滤波,腐蚀后物体尺寸会缩小。

        函数参数:

        src 输入图像;通道的数量可以是任意的,但深度应为CV_8UCV_16UCV_36SCV_32FCV_64F之一。

        dst 输出图像其大小与类型与源图像相同。

        kernel 用于腐蚀操作的结果元素(内核),如果element=Mat(),则使用3 x 3矩形结构元素。内核可以使用getStructuringElement创建。

        anchor 锚点在结构元素(kernel)内的位置;默认值(-1-1)表示锚点位于元素中

心。

        iteration 应用腐蚀操作的次数。

        borderType 像素外推方法,请参见边界类型。不支持BORDER_WRAP。边界类型如下:

        borderValue 恒定边界情况下的边界值。

       dilate()函数

       dilate()函数执行膨胀操作,其原型如下:

        dilate()也是通过使用特定的结构元素(如矩形、圆形等)来处理图像。在某个像素上应用结构元素时,结构元素的锚点与该像素对齐,所有与结构元素相交的像素就包含在当前集合中,腐蚀就是把当前像素替换成所定义像素集合中的最大像素值。即:

膨胀操作,物体尺寸会变大,可使物体中的小减小填满。

       函数参数:

        src 输入图像;通道的数量可以是任意的,但深度应为CV_8UCV_16UCV_36SCV_32FCV_64F之一。

        dst 输出图像其大小与类型与源图像相同。

        kernel 用于膨胀操作的结构元素(内核),如果element=Mat(),则使用3 x 3矩形结构元素。内核可以使用getStructuringElement创建。

        anchor 锚点在结构元素(kernel)内的位置;默认值(-1-1)表示锚点位于元素中心。

        iteration 应用膨胀操作的次数。

        borderType 像素外推方法,请参见边界类型。不支持BORDER_WRAP。边界类型如下:

        borderValue 恒定边界情况下的边界值。

        图像的开运算/闭运算

        开运算和闭运算的定义只与基本的腐蚀和膨胀运算有关:闭合的定义是对图像先膨胀后腐蚀,开启的定义是对图像先腐蚀后膨胀。要实现开运算/闭运算可分别调用腐蚀与膨胀函数,也可以调用OpenCV形态学函数morphologyEx()morphologyEx()的原型如下:

函数morphology Ex()使用侵蚀和膨胀作为基本操作来执行高级形态转换。

        函数参数:

        src 输入图像;通道的数量可以是任意的,但深度应为CV_8UCV_16UCV_36SCV_32FCV_64F之一。

        dst 输出图像其大小与类型与源图像相同。

        Op 形态学操作的类型,请参见MorphTypes

        kernel 用于膨胀操作的结构元素(内核),如果element=Mat(),则使用3 x 3矩形结构元素。内核可以使用getStructuringElement创建。

        anchor 锚点在结构元素(kernel)内的位置;默认值(-1-1)表示锚点位于元素中心。

        iteration 应用膨胀操作的次数。

        borderType 像素外推方法,请参见边界类型。不支持BORDER_WRAP。边界类型如下:

        borderValue 恒定边界情况下的边界值。

        梯度运算

        形态学梯度运算实质上是膨胀与腐蚀结果相减:

        顶帽/黑帽

        顶帽运算的实质是源图像与开运算结果相减:

黑帽运算实质是闭运算的结果减去与图像:

        示例:

        新建一个控制台应用程序Project,在源程序中加入如下代码:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;int main()
{Mat src = imread("2.bmp");if (src.empty()){cout << "Cann't open image!" << endl;return -1;}imshow("Src", src);Mat src1 = src;Mat src2 = src;Mat tem;Mat element(5, 5, CV_8U, Scalar(1));//erodeerode(src, tem, element,Point(-1,-1),1);imshow("Erode Result", tem);//dilatedilate(src, tem, element, Point(-1, -1), 1);imshow("Dilate Result", tem);//erode +dilateerode(src, tem, element, Point(-1, -1), 1);dilate(tem, tem, element, Point(-1, -1), 1);imshow("Erode + dilate Result", tem);//dilate + erodedilate(src1, tem, element, Point(-1, -1), 1);erode(tem, tem, element, Point(-1, -1), 1);imshow("Dilate + erode Result", tem);//openmorphologyEx(src1, tem, MORPH_OPEN, element);imshow("Open Result", tem);//closemorphologyEx(src1, tem, MORPH_CLOSE, element);imshow("CLOSE Result", tem);src2 = imread("3.bmp");if (src.empty()){cout << "Cann't open image!" << endl;return -1;}imshow("Src2", src2);//top hatmorphologyEx(src2, tem, MORPH_TOPHAT, element);imshow("Top hat", tem);//Black hatmorphologyEx(src2, tem, MORPH_BLACKHAT, element);imshow("Black hat", tem);waitKey(0);}

试运行,结果如下: 


http://www.ppmy.cn/embedded/123205.html

相关文章

springboot系列--web相关知识探索三

一、前言 web相关知识探索二中研究了请求是如何映射到具体接口&#xff08;方法&#xff09;中的&#xff0c;本次文章主要研究请求中所带的参数是如何映射到接口参数中的&#xff0c;也即请求参数如何与接口参数绑定。主要有四种、分别是注解方式、Servlet API方式、复杂参数、…

有开源的杀毒软件吗?

有开源的杀毒软件&#xff0c;其中较为知名和广泛使用的是ClamAV&#xff08;Clam AntiVirus&#xff09;。以下是对ClamAV的详细介绍&#xff1a; 一、软件概述 ClamAV是一款免费的、跨平台的开源防病毒软件工具包&#xff0c;用C和C编写&#xff0c;并在GNU通用公共许可证下…

使用Electron将vue项目改桌面程序

1&#xff0c;一个简单的实现案例 # 切换镜像&#xff0c;其他镜像&#xff1a;https://registry.npm.taobao.org/ npm config set registry https://registry.npmmirror.com/ # 推荐使用yarn来管理依赖包&#xff0c;相对于Node.js自带的npm包管理工具来说&#xff0c;它具有…

正则表达式的使用示例--Everything文件检索批量重命名工具

一、引言 Everything是一款非常实用的文件搜索工具&#xff0c;它可以帮助您快速定位并查找计算机中的文件和文件夹。Everything搜索文件资料之神速&#xff0c;有使用过的朋友们都深有体会&#xff0c;相对于Windows自带的搜索功能&#xff0c;使用Everything&#xff0c;可以…

YOLOv11改进 | Neck篇 | YOLOv11引入Gold-YOLO

1. Gold-YOLO介绍 1.1 摘要: 在过去的几年中,YOLO 系列模型已成为实时目标检测领域的领先方法。 许多研究通过修改架构、增加数据和设计新的损失,将基线提升到更高的水平。 然而,我们发现以前的模型仍然存在信息融合问题,尽管特征金字塔网络(FPN)和路径聚合网络(PANet)…

【python面试宝典3】遍历文件夹

题目013&#xff1a;写一个函数统计传入的列表中每个数字出现的次数并返回对应的字典。 点评&#xff1a;送人头的题目&#xff0c;不解释。 def count_letters(items):result {}for item in items:if isinstance(item, (int, float)):result[item] result.get(item, 0) 1re…

C++(string类的实现)

1. 迭代器、返回capacity、返回size、判空、c_str、重载[]和clear的实现 string类的迭代器的功能就类似于一个指针&#xff0c;所以我们可以直接使用一个指针来实现迭代器&#xff0c;但如下图可见迭代器有两个&#xff0c;一个是指向的内容可以被修改&#xff0c;另一个则是指…

新手小白在做副业时要注意哪些细节?

在当今社会&#xff0c;越来越多的人开始尝试通过副业来增加收入、拓展技能或实现自我价值。对于新手小白来说&#xff0c;进入副业领域可能充满了挑战和不确定性。然而&#xff0c;只要注意一些关键细节&#xff0c;就可以提高副业成功的几率&#xff0c;避免不必要的风险。 一…