前言:
一直以来,对于blob分析勇哥没有做系列贴子,现在把它补上。
在halcon中经常听到两个概念,一是blob分析,二是形态学,它们之间是什么关系呢? 答案是:后者是前者的一个子集,或者说是前者的一个步骤。 形态学在blob分析中常见的用于去除噪声影响,常见的算法有:腐蚀、膨胀、开运算、闭运算、 顶帽、黑帽、形态学梯度等等。 详见:https://www.skcircle.com/?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
版权声明:本文为博主原创文章,转载请附上博文链接!