图像形态学处理:腐蚀、膨胀、开运算和闭运算等

前言:

常用的形态学处理的方法包括腐蚀,膨胀,开运算,闭运算,顶帽运算,底帽运算。腐蚀和膨胀是最基本的处理方法,其它方法都是腐蚀和膨胀方法相互组合产生的。

一、腐蚀和膨胀

1.腐蚀

图像的腐蚀操作类似于中值平滑,首先要取每个位置的一个邻域内的最小值(中值平滑是取中间值),将其作为该位置的输出像素值。这里的邻域不局限于矩形结构,还包括椭圆形结构和十字交叉形结构。它的具体定义为结构元,作用类似于平滑操作中的卷积核。

腐蚀的处理特点:因为取每个位置邻域内的最小值,所以腐蚀后的图像整体会变暗,图像中比较亮的区域的面积会变小甚至消失,而比较暗的区域会增大一些。图像元I和结构元S的腐蚀操作记为:图像形态学处理:腐蚀、膨胀、开运算和闭运算等

代码实现:结构元的定义,OpenCV提供了函数getStructureElement();

Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

 分别为结构元的形状,结构元的大小,以及锚点位置。

而腐蚀操作,OpenCV也提供了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() );

第三个参数即为结构元,第四个参数为锚点,第五个参数为腐蚀操作的迭代次数,后两个分别为边界的扩充类型与边界扩充值。

	Mat img = imread("Res/duck.jpg",CV_LOAD_IMAGE_GRAYSCALE);
	imshow("img",img);
	
	Mat s = getStructuringElement(MORPH_RECT,Size(3,3));
	Mat imgO;
	erode(img,imgO,s,Point(0,0),2);
	imshow("imgO", imgO);
	waitKey(0);
	return 0;

 效果图如下:

图像形态学处理:腐蚀、膨胀、开运算和闭运算等

2.膨胀

膨胀和腐蚀操作原理相似,膨胀是选取每个位置邻域内的最大值作为输出灰度值。膨胀后的图像的整体亮度会有提高,图形中较亮物体的尺寸变大,而较暗物体的尺寸会减小甚至消失。图像I和结构元的膨胀操作记为:图像形态学处理:腐蚀、膨胀、开运算和闭运算等

代码实现与腐蚀操作类似,只不过膨胀操作的函数为dilate()。

二、开运算和闭运算

1.先腐蚀后膨胀的运算称为开运算,如下:

图像形态学处理:腐蚀、膨胀、开运算和闭运算等

功能特点:它具有消除亮度较高的细小区域,在纤细点分离物体,对于较大物体,可以在不明显改变其面积的情况下平滑其边界等作用。

2.先膨胀后腐蚀的运算称为闭运算,如下:

图像形态学处理:腐蚀、膨胀、开运算和闭运算等

功能特点:它具有填充白色物体内细小黑色区域、连接临近物体的作用,也可以在不明显改变其面积的情况下平滑边界。

代码实现:由于开运算和闭运算是腐蚀和膨胀的组合,所以完全可以利用函数erode和dilate的组合来实现,而OpenCV则提供了函数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() );

enum MorphTypes{
    MORPH_ERODE    = 0, MORPH_DILATE  = 1,MORPH_OPEN  = 2, MORPH_CLOSE  = 3,
    MORPH_GRADIENT = 4, MORPH_TOPHAT   = 5,MORPH_BLACKHAT = 6
};

其中第三个参数,代表处理操作的类型,除了已经介绍到的腐蚀,膨胀,开运算和闭运算,还有顶帽运算,底帽运算以及形态梯度,其余参数均可参照erode和dilate函数的参数即可。

开闭运算相比较腐蚀和膨胀,它能够在不明显改变物体的形态大小的情况下进行腐蚀和膨胀操作。

三、顶帽运算和底帽运算以及形态学梯度

顶帽运算和底帽运算分别以开运算和闭运算为基础。

1.顶帽运算的定义是图像减去开运算结果:图像形态学处理:腐蚀、膨胀、开运算和闭运算等

开运算可以消除暗背景下的较亮区域,所以用原图减去开运算结果就可以得到原图中灰度较亮的区域,原图中暗背景下的较亮区域处理后被消除,相减之后可以得到这部分被消除的亮色。所以又称白顶帽变换,它还有一个重要作用就是校正不均匀光照。

2.底帽运算定义为闭运算结果减去原图像:图像形态学处理:腐蚀、膨胀、开运算和闭运算等

闭运算可以填充亮度较高背景下的较暗区域,原来的较亮背景中的较暗区域会被填充为亮色,如果用闭运算的结果减去原图,得到的就是原图中灰度较暗的区域。

3.形态学梯度

定义:图像形态学处理:腐蚀、膨胀、开运算和闭运算等

即膨胀结果减去腐蚀结果,因为膨胀是取邻域内的最大值,从而增大亮度高的区域的面积。而腐蚀是取邻域内的最小值,从而增加较暗区域的面积,所以两者相减得到的就是图像中物体的边界。

具体地代码实现就是使用上面已经介绍过的函数即可。