概述:形态学的高级形态,往往都是建立在腐蚀和膨胀这两个基本操作之上的,所以本篇主角是OpenCV的morphologyEx函数,它利用基本的膨胀和腐蚀技术,来执行更加高级的形态学变换,如开运算、闭运算、形态学梯度、“顶帽”、“黑帽” 等。
为了下面对比和演示以及理解的方便,浅墨自己制作了一张毛笔字图,这里先上原图:
4.1 开运算
开运算(Opening Operation)其实就是先腐蚀后膨胀的过程
dst = open(src,element) = dilate(erode(src,element));
开运算用来消除小物体,在纤细处分离物体并且在平滑较大的物体的边界不明显改变其体积
4.2 闭运算
先膨胀后腐蚀的过程(Closing Operation)
dst = cleose(src,element) = erode(dilate(src,element))
闭运算能够排除小型黑洞(黑色区域),如下所示:
4.3 形态学梯度
膨胀图与腐蚀图之差
dst = morph-grad(src,element) = dilate(sec,element-) - erode(src,element)
对二值图像进行这一操作可以将团块(blob)的边缘突出来。我们可以用形态学梯度来保留物体的边缘轮廓,如下所示:
4.4 顶帽
Top Hat(礼帽),是原图与开运算的结果图之差
dst = tophat(src, element) = src - open(src, element)
-
因为开运算带来的结果是放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原型轮廓周围的区域更明亮的区域。且这一操作和选择的核的大小有关
-
顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的时候,可以用顶帽运算进行背景提取。
4.5 黑帽
Black Hat 是闭运算与原图像之差
dst = blackhat(src, element) = close(src,element) -src
用来分离比邻近点暗一些的斑点,效果图有着非常完美的轮廓
4.6 morphologyEx()
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());
-
第一个参数,输入图像
-
第二个参数,输出图像
-
第三个参数,使用的形态学方法即:
MORPH_OPEN – 开运算(Opening operation)
开运算是对图像先腐蚀再膨胀,可以排除小团的物体转换公式为:MORPH_CLOSE – 闭运算(Closing operation)
闭运算是对图像先膨胀再腐蚀,可以排除小型黑洞,变换的公式:
MORPH_GRADIENT -形态学梯度(Morphological gradient)
返回图片为膨胀图与腐蚀图之差,可以保留物体的边缘轮廓,变换公式为:
MORPH_TOPHAT - “顶帽”(“Top hat”)
返回图像为原图像与开运算结果图之差,变换公式:
MORPH_BLACKHAT - “黑帽”(“Black hat“)
返回图片为闭运算结果图与原图像之差,变换公式为:
-
第四个参数,InputArray类型的kernel,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。如果设置5*5的即:Mat(5, 5, CV_8U)
-
第五个参数,Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心。
-
第六个参数,int类型的iterations,迭代使用函数的次数,默认值为1。
-
第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_ CONSTANT。
-
第八个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue()