前言:
一直以来,对于blob分析勇哥没有做系列贴子,现在把它补上。
在halcon中经常听到两个概念,一是blob分析,二是形态学,它们之间是什么关系呢? 答案是:后者是前者的一个子集,或者说是前者的一个步骤。 形态学在blob分析中常见的用于去除噪声影响,常见的算法有:腐蚀、膨胀、开运算、闭运算、 顶帽、黑帽、形态学梯度等等。 详见:http://47.98.154.65/?id=1643 blob分析主要内容如下: 1、图像分割:如全局阈值、局部阈值、二值化等。 2、形态学操作:如开运算、闭运算、腐蚀、膨胀等。 3、连通性分析:如connect算子 4、特征值计算:如面积、周长、质心坐标等特征 5、场景描述:对场景中目标之间的拓扑关系进行描述。
(一)解释下两种算子
先说说算子fill_up
fill_up(Region:RegionFillUp::)
fill_up填充区域中的孔。区域数量保持不变
而闭运算(close)是指的一个系列的形态学算子,常见的有下面这些:
closing(Region, StructElement : RegionClosing : : )
closing_circle(Region : RegionClosing : Radius : )
closing_rectangle1(Region : RegionClosing : Width, Height : )
closing这个算子需要你自己指定任意结构元素(StructElemnet)。
而后面两个算子指定好了结构元素的类型。
闭运算是总得来讲是先膨胀后腐蚀的过程,可以用于消除一些region内部孔洞并对边缘进行整形。区域的数量保持不变。
但如果是closing算子的话,根据你指定的结构元素(StructElemnet)不同,对region边缘也会有一定影响。
那么结构元素是什么鬼呢?
就如下图所示。
如果不清楚的话,再看下面的代码与动图演示:
dev_clear_window() dev_get_window(WindowHandle) dev_set_draw('margin') draw_region(Region1, WindowHandle) draw_circle(WindowHandle, Row, Column, Radius) gen_circle(Circle, Row, Column, Radius) difference(Region1, Circle, Region1) *Region2是结构元素 draw_region(Region2, WindowHandle) closing(Region1, Region2, RegionClosing) connection(RegionClosing, ConnectedRegions) count_obj(ConnectedRegions, n1) fill_up(Region1, RegionFillUp)
(二)举个实际栗子
我们来做个实验,来领会一下两者的区别。
代码:
threshold(ImageSub, Region,0,40) closing_circle(Region, RegionClosing1, 5.5) fill_up(RegionClosing1, RegionFillUp)
原图
(图1)
阈值后
(图2)
仅仅做fill_up后
(图3)
做 closing_circle(Region, RegionClosing1, 5.5) 后的效果
(图4)
(三)结论
通过上面理论与实践,我们知道了fill_up这种算子实际上填充的是连通区域孔,对于边缘非封闭的地方就无能为力了。
这一点对比一下图2、图3就可以知道了。
而闭运算(close)之类的算子会作用到整个region的边界上面(就像是对边缘整形一样),并且内部的孔也可以一并填充。对边界的影响根据结构元素不同而不同。
如果你的目的是想region整个被填充,则用 闭运算 + fill_up二合一 更靠谱(至少不会让情况变坏)。
下图是经过闭运算(close)
再经过一次fill_up的效果
当然,设置适当参数或者是结构元素的话,第一张图不经fill_up也是可以完全封闭填充的(但矛盾是我们不容易确定参数的上限)。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

