形态学的开闭运算与字面上的“开”和“闭”的本来的意义有啥关系?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了形态学的开闭运算与字面上的“开”和“闭”的本来的意义有啥关系?相关的知识,希望对你有一定的参考价值。

我实在想象不出来 开运算 与“开门”的“开”有什么关联!非常不便于我记忆开闭算法,先腐蚀后膨胀,先膨胀后腐蚀,快把我整晕了!高手请支招!

这个很好记啊,开运算是先腐蚀后膨胀嘛,相当于先给图像缩水了,然后又像发面一样发开花了,我就是这么记的,呵呵 参考技术A 形态学分很多种呢,我也不知道你想要知道哪种?其实形态学的开闭运算并不能强加以字面的意义,很多人不能完全掌握形态学就是这样的原因。形态学中的开与闭其实是一种现象的逆反过程的代名词。与现实中的区别很大。学习的时候要忘记你现实的开与闭的意义。 参考技术B 闭运算:先膨胀、后腐蚀。它可以将两个有一点点连通的区域连通。
开运算:先腐蚀、后膨胀。它可以将两个有一点点连通的区域分开。

图像的形态学开操作(开运算)和闭操作(闭运算)的概念和作用,并用OpenCV的函数morphologyEx()实现对图像的开闭操作

大家看这篇博文前可以先看一看下面这篇博文,下面这篇博文是这篇博文的基础:
详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作

图像形态学腐蚀可以将细小的噪声区域去除,但是会将图像主要区域的面积缩小,造成主要区域的形状发生改变;图像形态学膨胀可以扩充每一个区域的面积,填充较小的空洞,但是会增加噪声的面积。
根据两者的特性将图像腐蚀和膨胀适当的结合,便可以既去除图像中的噪声,又不缩小图像中主要区域的面积;既填充了较小的空洞,又不增加噪声所占的面积。
将图像的腐蚀和膨胀结合产了以下这些运算:
图像的开运算、图像的闭运算、图像的形态学梯度运算、图像的顶帽运算、图像的黑帽运算、图像的击中击不中变换。

本篇博文先介绍图像的开运算和图像的闭运算。

形态学开运算操作的定义是先对图像进行腐蚀操作,然后再对图像进行膨胀操作。它先对图像进行腐蚀,消除图像中的噪声和较小的连通域,之后通过膨胀运算弥补较大的连通域中因腐蚀造成的面积减小。
形态学开运算的作用有以下这些:

  • 消除值高于邻近点的孤立点,达到去除图像中噪声的作用;
  • 消除较小的连通域,保留较大的连通域;
  • 断开较窄的狭颈,可以在两个物体纤细的连接处将它们分离;
  • 不明显改变较大连通域的面积的情况下平滑连通域的连界、轮廓;

形态学闭运算则刚好相反,先对图像进行膨胀操作,再对图像进行腐蚀操作。它先对图像进行膨胀以填充连通域内的小型空洞,扩大连通域的边界,连接邻近的两个连通域,之后通过腐蚀运算减少由膨胀运算引起的连通域边界的扩大及面积的增加。
形态学闭运算的作用有以下这些:

  • 消除值低于邻近点的孤立点,达到去除图像中噪声的作用;
  • 连接两个邻近的连通域;
  • 弥合较窄的间断和细长的沟壑;
  • 去除连通域内的小型空洞;
  • 和开运算一样也能够平滑物体的轮廓;

在OpenCV中,我们可以用函数morphologyEx()实现对图像的开闭运算,其函数原型如下:

void cv::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() 
						)		

参数意义与上篇博文(链接 https://blog.csdn.net/wenhao_ir/article/details/124763833)中的腐蚀和膨胀操作函数erode()、dilate()一样。只是多一个 op 参数,它的值用于确定作何种图像形态学运算,其可取值及意义如下图所示:

从上图可以看出,它可以取MORPH_OPEN、MORPH_CLOSE 、MORPH_GRADIENT、MORPH_TOPHAT 、MORPH_BLACKHAT这五个值,分别对应于图像形态学的开操作、闭操作、梯度运算、顶帽运算和黑帽运算。
本篇博文中我们用值MORPH_OPEN和MORPH_CLOS实现图像的开闭操作。

实现图像开运算操作的示例代码如下:
代码中用到的图片下载链接:https://pan.baidu.com/s/1J3aAurAH1w94Z4vhMg4xHA?pwd=v253

//博主微信/QQ 2487872782
//有问题可以联系博主交流
//有图像处理需求也可联系博主
//图像处理技术交流QQ群 271891601

//OpenCV版本:3.0
//VS版本:2013

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<opencv2/imgcodecs/imgcodecs.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;

int main()


	//载入原图   
	Mat image = imread("F:/material/images/P0047-开运算示例图片.jpg", 0);

	//显示原图  
	imshow("开运算原图", image);

	//获取结构
	cv::Mat element1 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(7, 7));

	Mat out1;
	//进行形态学开运算操作  
	morphologyEx(image, out1, MORPH_OPEN, element1);//形态学开运算


	//显示效果图  
	imshow("开运算效果图", out1);

	waitKey(0);

	return 0;

运行结果如下图所示:

从运行结果中我们可以看出,通过开运算,断开了较窄的狭颈,在两个目标的纤细的连接处将它们分离。

实现图像闭运算操作的示例代码如下:
代码中用到的图片下载链接:https://pan.baidu.com/s/1zUuLfy3IWWIjb2EhyKILNA?pwd=syn4

//博主微信/QQ 2487872782
//有问题可以联系博主交流
//有图像处理需求也可联系博主
//图像处理技术交流QQ群 271891601

//OpenCV版本:3.0
//VS版本:2013

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<opencv2/imgcodecs/imgcodecs.hpp>
#include <opencv2/imgproc/imgproc.hpp>


using namespace cv;


int main()


	//载入原图   
	Mat image = imread("F:/material/images/P0047-闭运算示例图片.jpg", 0);

	//显示原图  
	imshow("闭运算原图", image);

	//获取结构
	cv::Mat element1 = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(20, 20));

	Mat out1;
	//进行形态学闭运算操作  
	morphologyEx(image, out1, MORPH_CLOSE, element1);//形态学开运算


	//显示效果图  
	imshow("闭运算效果图", out1);

	waitKey(0);

	return 0;


从以上运行结果我们可以看出,通过形态学闭运算,连接了两个邻近的连通域。

以上是关于形态学的开闭运算与字面上的“开”和“闭”的本来的意义有啥关系?的主要内容,如果未能解决你的问题,请参考以下文章

同一幅图像可以即进行开运算又进行闭运算吗

python+opencv图像形态学处理详细解释(膨胀腐蚀开闭运算礼帽和黑猫)

形态学滤波:腐蚀与膨胀 开运算,闭运算,形态学梯度,顶帽,黑帽

OpenCV—python 形态学处理(腐蚀膨胀开闭运算边缘检测)

ITK 形态学中的开运算和闭运算 腐蚀 膨胀

图像开运算和闭运算