1 概述

上一节中,我们重点了解了腐蚀和膨胀这两种最基本的形态学操作,而运用这两个基本操作,可以实现更高级的形态学变换。

所以,本节的主角是OpenCV中的morphologyEx函数,它利用基本的膨胀和腐蚀技术,来执行更加高级的形态学变换,如开闭运算、形态学梯度、“顶帽”、“黑帽”等。

首先,我们需要知道,形态学的高级形态,往往都是建立在腐蚀和膨胀这两个基本操作之上的。而关于腐蚀和膨胀,概念和细节以及相关代码请参考上一小节。对膨胀和腐蚀心中有数了,接下来的高级形态学操作,应该就不难理解。

2 开运算

开运算(Opening Operation),其实就是先腐蚀后膨胀的过程。其数学表达式如下:

dst = open (src, element) = dilate (erode(src, elelement));

开运算可以用来消除小物体,在纤细点处分离物体,并且在平滑较大物体的边界的同时不明显改变其面积。

形态学滤波3:开运算、闭运算、形态学梯度、顶帽、 黑帽_形态学滤波

3 闭运算

先膨胀后腐蚀的过程称为闭运算(Closing Operation),其数学表达式如下:

dst = clese(src, element)= erode (dilate(src, element);

闭运算能够排除小型黑洞(黑色区域)。

形态学滤波3:开运算、闭运算、形态学梯度、顶帽、 黑帽_OpenCV_02

4 形态学梯度

形态学梯度(orphological Gradient)是膨胀图与腐蚀图之差,数学表达式 如下:

dst = morph - grad(src, element) = dilate(src, element) - erode(src, element);

对二值图像进行这一操作可以将团块(blob)的边缘突出出来。

形态学滤波3:开运算、闭运算、形态学梯度、顶帽、 黑帽_开运算_03

5 顶帽

顶帽运算(Top Hat)又常常被译为”礼帽“运算,是原图像与上文刚刚介绍的“开运算”的结果图之差,数学表达式如下:

dst = tophat(src, element) = src - open(src, element);

因为开运算带来的结果是放大了裂缝或者局部低亮度的区域。因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作与选择的核的大小相关。

顶帽运算往往用来分离比邻近点亮一些的斑块。在一幅图像具有大幅的背景,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。

形态学滤波3:开运算、闭运算、形态学梯度、顶帽、 黑帽_形态学滤波_04

6 黑帽

黑帽(Black Hat)运算是闭运算的结果图与原图像之差。数学表达式为:

dst = black(src, element) = close(src, element) - src;

黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作和选择的核的大小相关。

所以,黑帽运算用来分离比邻近点暗一些的斑块,效果图有着非常完美的轮廓。

形态学滤波3:开运算、闭运算、形态学梯度、顶帽、 黑帽_开运算_05

7 效果图

开运算

形态学滤波3:开运算、闭运算、形态学梯度、顶帽、 黑帽_开运算_06

闭运算

形态学滤波3:开运算、闭运算、形态学梯度、顶帽、 黑帽_形态学滤波_07

形态学梯度

形态学滤波3:开运算、闭运算、形态学梯度、顶帽、 黑帽_OpenCV_08

顶帽

形态学滤波3:开运算、闭运算、形态学梯度、顶帽、 黑帽_开运算_09

黑帽

形态学滤波3:开运算、闭运算、形态学梯度、顶帽、 黑帽_闭运算_10