OpenCV morphologyEx、erode、dilate、getStructuringElement (形态学算子)

::返回OpenCV算子速查表

1. 函数

1.1 getStructuringElement

OpenCV官方文档getStructuringElement链接

  • getStructuringElement 是为了给形态学操作算子返回指定大小和形状的结构元素。
  • 当然你也可以自己构造一个任意的二进制掩码,并将其用作形态学处理函数的结构元素。
	Mat getStructuringElement(
		int shape,  //形状
		Size ksize, //尺寸
		Point anchor = Point(-1, -1) //锚点
		);

1.2 morphologyEx

OpenCV官方文档morphologyEx链接

  • 这其实是一个非常强大的函数,它可以通过调整参数 op 完成八种操作:腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、梯度、击中击不中。
	void morphologyEx(
		InputArray src, 
		OutputArray dst,
		int op, 
		InputArray kernel,
		Point anchor = Point(-1, -1),
		int iterations = 1,
		int borderType = BORDER_CONSTANT,
		const Scalar& borderValue = morphologyDefaultBorderValue()
		);
  • 参数 op 是枚举变量 enum cv::MorphTypes

    在这里插入图片描述
  • 对于腐蚀和膨胀,OpenCV还有专门的函数 erodedialte,它们和 morphologyEx 使用 MORPH_ERODEMORPH_DILATE 是完全相同的。
  • 所有操作都支持就地调用。对于多通道图像,每个通道是被独立处理的。
  • borderType :不支持BORDER_WRAP
  • 《学习OpenCV3》有这样的描述:尽管开和闭操作的效果与腐蚀相近,但这些新操作在保持连通域的精度上更加可靠。

1.3 erode

	void erode(
		InputArray src, 
		OutputArray dst, 
		InputArray kernel,
		Point anchor = Point(-1, -1), 
		int iterations = 1,
		int borderType = BORDER_CONSTANT,
		const Scalar& borderValue = morphologyDefaultBorderValue()
		);

1.4 dilate

	void dilate(
		InputArray src, 
		OutputArray dst, 
		InputArray kernel,
		Point anchor = Point(-1, -1),
		int iterations = 1,
		int borderType = BORDER_CONSTANT,
		const Scalar& borderValue = morphologyDefaultBorderValue()
		);

2. 例程

2.1 图像处理效果

原图

在这里插入图片描述

二值化图像

在这里插入图片描述

对二值化图像进行腐蚀、膨胀、开操作、闭操作

  • 开操作和闭操作实际上就是腐蚀和膨胀的简单组合。
  • 开操作是先腐蚀后膨胀,常用于对二值图像中的区域进行计数。
  • 闭操作是先膨胀后腐蚀,作用于复杂连通分支算法中减少无用或噪声驱动的片段。对于连通分支,通常先进行腐蚀或闭操作消除噪声,然后通过开操作连接相互靠近的大型区域。
  • 尽管开和闭操作的效果与腐蚀相近,但这些新操作在保持连通域的精度上更加可靠。
    在这里插入图片描述

梯度图

  • 形态学梯度 是 膨胀操作的结果(扩张亮域)减 腐蚀操作的结果(缩减亮域) ,这就是边缘。
  • 对于灰度图,其结果就是计算明暗变换的趋势。形态学梯度通常用于显示明亮区域的边界,然后便可以将他们看做目标或者目标的部分。用扩张的图像减去了收缩的图像,如此一来就找出了完整的边界。这与计算梯度不同,它不会关注某一个物体的周围。
    在这里插入图片描述

顶帽和黑帽

  • 这两种操作分别用于显示与其邻域相比更亮或更暗的部分。当试图根据物体的亮度变化分离依附于物体的某些部分时,就会用到这些方法。
  • 顶帽作用源图像减去其开操作后的图像。开操作的效果是放大裂缝和局部小洞。因此用源图像减去开操作后的图像得到了比源图像更亮的环绕部分。
  • 黑帽操作显示的是比源图像更暗的环绕部分。
    在这里插入图片描述

击中击不中

在这里插入图片描述

2.2 代码

#include "stdafx.h"
#include <opencv.hpp>
using namespace cv;
int main()
{
	Mat m_SrcImg = imread("./1.jpg", IMREAD_GRAYSCALE);
	imshow("原图", m_SrcImg);

	//阈值化操作
	Mat m_SrcImg2;
	threshold(m_SrcImg, m_SrcImg2, 100, 255, THRESH_BINARY_INV);
	imshow("原图2", m_SrcImg2);

	Mat m_DstImg;
	Mat elementRect = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
	Mat elementEllipse = getStructuringElement(MORPH_ELLIPSE, Size(5, 5), Point(-1, -1));
	int m_nIterations = 1;

	//腐蚀
	morphologyEx(m_SrcImg2, m_DstImg, MORPH_ERODE, elementEllipse, Point(-1, -1), m_nIterations);
	imshow("MORPH_ERODE", m_DstImg);

	//膨胀
	morphologyEx(m_SrcImg2, m_DstImg, MORPH_DILATE, elementEllipse, Point(-1, -1), m_nIterations);
	imshow("MORPH_DILATE", m_DstImg);

	//开操作
	morphologyEx(m_SrcImg2, m_DstImg, MORPH_OPEN, elementEllipse, Point(-1, -1), m_nIterations);
	imshow("MORPH_OPEN", m_DstImg);

	//闭操作 
	morphologyEx(m_SrcImg2, m_DstImg, MORPH_CLOSE, elementEllipse, Point(-1, -1), m_nIterations);
	imshow("MORPH_CLOSE", m_DstImg);

	//梯度 如果是空的Mat,则会被默认为是3×3的核
	morphologyEx(m_SrcImg2, m_DstImg, MORPH_GRADIENT, Mat(), Point(-1, -1), m_nIterations);
	imshow("MORPH_GRADIENT", m_DstImg);

	//顶帽 这里我使用了一个Mat的构造函数,自行创建了掩码,同样也可以作为形态学操作函数的结构化元素来使用	
	morphologyEx(m_SrcImg, m_DstImg, MORPH_TOPHAT, Mat(Size(11, 11), m_SrcImg.type()), Point(-1, -1), m_nIterations);
	imshow("MORPH_TOPHAT", m_DstImg);

	//黑帽 
	morphologyEx(m_SrcImg, m_DstImg, MORPH_BLACKHAT, Mat(Size(11, 11), m_SrcImg.type()), Point(-1, -1), m_nIterations);
	imshow("MORPH_BLACKHAT", m_DstImg);

	//击中击不中
	morphologyEx(m_SrcImg2, m_DstImg, MORPH_HITMISS, elementEllipse, Point(-1, -1), 1);
	imshow("MORPH_HITMISS", m_DstImg);

	waitKey(0);
    return 0;
}
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: OpenCV中的morphologyEx是一种形态学操作,可以用于图像处理中的形态学变换,包括膨胀、腐蚀、开运算、闭运算等。这些操作可以用于去除噪声、填充空洞、分离物体等。morphologyEx函数可以根据用户指定的内核大小和形状对图像进行形态学操作。 ### 回答2: OpenCV是一款广泛应用于计算机视觉领域的开源计算机视觉库。其中的morphologyex函数主要用于图像形态学操作。 图像形态学操作分为腐蚀和膨胀两种。腐蚀操作可以消除图像上的小块,使图像变得更加清晰;膨胀操作可以填补图像上的孔洞,使图像更加连续。morphologyex函数可以对图像进行这两种操作,并且可以自定义操作的迭代次数、核大小、边界模式等参数。 OpenCV中的morphologyex函数有多种操作,包括膨胀、腐蚀、开、闭、梯度、顶帽和黑帽等。这些操作可以用于不同的场景,例如检测算法中的图像去噪、特征提取和图像分割等。 在使用morphologyex函数时,需要注意以下几个方面: 1. 选择合适的核大小和形状。核的大小和形状会影响腐蚀和膨胀的程度,因此需要根据实际情况进行调整。 2. 确定操作的迭代次数。通常情况下,迭代次数越多,图像上的噪点就会越少。 3. 选择合适的边界模式。边界模式可以控制图像边界的处理方式,例如复制、恒定和反射等模式可以应对不同的情况。 总之,OpenCVmorphologyex函数是一种强大的图像处理工具,可以应用于图像分割、去噪、特征提取和形态学分析等多种领域。但是在使用时需要注意参数的选择和调整,以获得最佳的效果。 ### 回答3: OpenCV中的morphologyex指的是形态学操作,是一种基于图像形状的图像处理方法。形态学操作可以用于去噪、边缘检测、二值化、图像分割、物体检测等方面。 morphologyex函数在图像上应用具有预先定义的形状和大小的结构元素。这个结构元素被移动到图像上的每个像素位置,然后计算结构元素内像素的值和形状。结构元素的形状和大小决定了在原始图像上执行的操作的类型和效果。 OpenCV提供了多种形态学操作,包括腐蚀(erode)、膨胀(dilate)、开运算(morphologyex-opening)、闭运算(morphologyex-closing)、形态学梯度(morphologyex-gradient)等。 腐蚀操作可以用于去噪、分离物体等方面,它会将图像中较小的白色(前景)区域缩小,而黑色区域保持不变。膨胀操作可以用于填补空洞、连接物体等方面,它会将较小的白色区域扩大,而黑色区域保持不变。开运算和闭运算可以用于平滑边缘、去除孔洞等方面。形态学梯度可以用于检测物体边缘、找到对象的轮廓等方面。 总之,morphologyex函数是一种强大的图像处理方法,可以应用于各种领域,例如机器视觉、计算机图形学、医学图像处理等,可以帮助我们更好地理解图像和数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MechMaster

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值