【拜小白opencv】38-形态学滤波3——开运算

常言道“温故而知新”,写此文章就是对自己目前学习内容的小小的总结与记录。

本文力求用最简洁的语言,详细的代码将此部分内容讲解清楚,但由于博主同样是刚刚接触OpenCV,或许表达上有些瑕疵,还望读者能够指教探讨,大家共同进步。

博主机器配置为:VS2013+opencv2.4.13+Win-64bit。

若本文能给读者带来一点点启示与帮助,我就很开心了。

====================分割线====================


1-开运算

形态学开运算操作能去除噪声及平滑目标边缘等功能,其数学表达式如下:




  • 开运算(Opening Operation),其实就是先腐蚀后膨胀的过程。
  • 结构元素各向同性的开运算操作主要用于消除图像中小于结构元素的细节部分,物体的局部形状不变。
  • 物体较背景明亮时能够排除小区域物体,消除高于邻近点的孤立点,到达去噪的用作。
  • 可以平滑物体轮廓,断开狭窄的连接,去掉了细小的突出部分。
======================分割线=====================

2-morphologyEx()函数

作用:该函数可以进行形态学滤波的操作,里面包含了 开运算、闭运算、形态学梯度、顶帽、黑帽、腐蚀、膨胀等。
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() );
参数解释:
  • 参数1:输入图像,即源图像,填Mat类的对象即可。图像位深应该为以下五种之一:CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F。
  • 参数2:OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。
  • 参数3:int类型的op,表示形态学运算的类型,可以是如下之一的标识符:
————MORPH_OPEN – 开运算(Opening operation)
————MORPH_CLOSE – 闭运算(Closing operation)
————MORPH_GRADIENT -形态学梯度(Morphological gradient)
————MORPH_TOPHAT - “顶帽”(“Top hat”)
————MORPH_BLACKHAT - “黑帽”(“Black hat“)
————MORPH_ERODE - “腐蚀”
————MORPH_DILATE - “膨胀”
————另有CV版本的标识符也可选择,如CV_MOP_CLOSE,CV_MOP_GRADIENT,CV_MOP_TOPHAT,CV_MOP_BLACKHAT等,这应该是OpenCV1.0系列版本遗留下来的标识符,和上面的“MORPH_OPEN”一样的效果。 
  • 参数4:InputArray类型的kernel,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement()配合这个参数的使用。getStructuringElement()函数会返回指定形状和尺寸的结构元素(内核矩阵)。关于getStructuringElement()函数,请见文章里有相关讲解:

【拜小白opencv】36-形态学滤波1——腐蚀

  • 参数5:Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心。
  • 参数6:int类型的iterations,迭代使用函数的次数,默认值为1。
  • 参数7:int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_ CONSTANT。
  • 参数8:const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般我们不用去管他。需要用到它时,可以看官方文档中的createMorphologyFilter()函数得到更详细的解释。

使用morphologyEx()函数,一般我们只需要填前面的四个参数,后面的四个参数都有默认值。
========================分割线====================

3-代码演示

/*
功能:形态学滤波:开运算。 本质就是先腐蚀后膨胀的过程。
*/

#include                 
#include                 
#include                
#include               
using namespace std;
using namespace cv;

int main()
{
	Mat srcImage, dstImage; //源图像,输出图像
	//---------【1】读取源图像并检查图像是否读取成功---------      
	srcImage = imread("D:\\OutPutResult\\ImageTest\\xing.jpg");
	if (!srcImage.data)
	{
		cout << "读取图片错误,请重新输入正确路径!\n";
		system("pause");
		return -1;
	}
	imshow("【源图像】", srcImage);
	//---------【2】获取自定义核---------
	Mat element = getStructuringElement(MORPH_RECT, Size(9, 9));
	//---------【3】进行开运算操作---------
	morphologyEx(srcImage, dstImage, MORPH_OPEN, element);
	//---------【4】显示效果图---------
	imshow("【效果图--开运算操作】", dstImage);
	waitKey(0);
	return 0;
}

====================分割线==============

4-显示结果

【拜小白opencv】38-形态学滤波3——开运算_第1张图片
====================分割线=================

5-代码解释

为了观察效果,本例中核的设置为9*9,该参数可以根据自己需要进行调节。
例子中,morphologyEx()函数的第三个参数,同学可以右键进行”查看定义“,看看都有什么,自己换个参数,看看会不会有什么效果。
【拜小白opencv】38-形态学滤波3——开运算_第2张图片

参考文章: 【OpenCV入门教程之十一】 形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑

=================END=======================

你可能感兴趣的:(【拜小白OpenCV】,一步步学习OpenCV2,opencv,opencv+vs,滤波,开运算,形态学)