OpenCV4(C++)——形态学(腐蚀、膨胀)


一、腐蚀(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) —— 矩形结构元素,所有元素都为1
	MORPH_CROSS(简记:1)—— 十字结构元素,中间的列和行元素为1
	MORPH_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	击中击不中运算

四、总结

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

猜你喜欢

转载自blog.csdn.net/qq_43199575/article/details/133852776