勇哥大致看了一下halcon中有关region相关的官方例程,还是有一些很趣的东西。
因此有个想法是把它全部滤一遍,在这里记录一下以备查。
关闭边缘振幅图像的region边缘(close_edges)
region沿指定的点做镜像 (transpose_region)
region平移 (move_region )
使用结构元素来扩展输入区域(minkowski_add1)
使用结构化元素侵蚀区域(minkowski_sub1)
延伸内容(总结下形态学算法:腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)
(1) 关闭边缘振幅图像的region边缘
这个是没有关闭边缘的边,它是sobel_算子找到的边,经过threshold过滤后的结果。
下图这个是算子close_edges关闭边缘后的效果
感觉这个算子还蛮有用处的,有点补全region边界的意思。
(二)region沿指定的点做镜像
观察下面程序的效果,会发现这种镜像是同时做了上下左右的镜像。
dev_close_window () dev_open_window (0, 0, 512, 512, 'white', WindowID) dev_set_color ('black') * Draw with the mouse an arbitrary region into the window draw_region (Region, WindowID) transpose_region (Region, Transposed, 203,239) dev_clear_window () dev_set_draw ('margin') dev_set_color ('red') dev_display (Region) dev_set_color ('green') dev_display (Transposed)
下图是transpose_region算子的功能说明。
(三)region平移
move_region 用于平移Region,它很简单。有这种算子很好,避免了我们去做麻烦的仿射变换(它至少要3条指令)。
dev_close_window () dev_open_window (0, 0, 512, 512, 'white', WindowID) dev_set_color ('black') dev_set_draw ('margin') dev_clear_window () * Draw with the mouse an arbitrary region into the window draw_region (Region, WindowID) area_center (Region, Area, Row1, Column1) Button := 1 while (Button == 1) * Click to the position where the region should be placed * Use right mouse button to exit the loop get_mbutton (WindowID, Row, Column, Button) move_region (Region, RegionMoved, Row - Row1, Column - Column1) endwhile
(四)使用结构元素来扩展输入区域
minkowski_add1使用结构元素来扩展输入区域。通过将minkowski_add1应用于区域,其边界将变得平滑。在此过程中,该区域的面积会扩大。此外,断开的区域可以合并。但是,这些区域在逻辑上仍然是不同的区域。
如果期望的行为是将它们合并为一个区域,则必须首先调用算子 union1
dev_clear_window() dev_get_window(WindowHandle) dev_set_draw('margin') draw_region(Region1, WindowHandle) draw_region(Region2, WindowHandle) minkowski_add1(Region1, Region2, RegionMinkAdd, 1) connection(RegionMinkAdd, ConnectedRegions) count_obj(ConnectedRegions, n1)
下图中,鼠绘一个三角,再鼠绘了一个结构region。
下图是算子的效果
下图是minkowski_add1算子的原理示意:
(五)使用结构化元素侵蚀区域
minkowski_sub1使用结构化元素计算输入区域的Minkowski减法。通过将 minkowski_sub1应用于区域,其边界将变得平滑。在此过程中,该区域的面积减小了。此外,连接区域可以被分割。但是,这些区域在逻辑上保持为一个区域。
这个算子有点类似于erosion1
dev_clear_window() dev_get_window(WindowHandle) dev_set_draw('margin') draw_region(Region1, WindowHandle) draw_region(Region2, WindowHandle) minkowski_sub1(Region1, Region2, RegionMinkAdd, 1) connection(RegionMinkAdd, ConnectedRegions) count_obj(ConnectedRegions, n1) dev_set_color('blue') dev_display(RegionMinkAdd)
(六)延伸内容
上面介绍的minkowski_add1之类的算子,是属于形态学的算子。
常见的形态学算法有:腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度。
在halcon中,顶帽、黑帽、形态学梯度这些没有直接的算子,你可以按下面的说明通过几个算子组合而成。
*下面的代码都属于“腐蚀、膨胀、开运算、闭运算”类型的形态学算子 *开运算 opening(ConnectedRegions, ConnectedRegions, RegionOpening1) *闭运算 closing(RegionOpening1, RegionOpening1, RegionClosing1) *腐蚀 erosion1(RegionClosing1, RegionClosing1, RegionErosion1, 1) *膨胀 dilation1(RegionErosion1, RegionErosion1, RegionDilation1, 1) *圆形结构开运算 opening_circle(ConnectedRegions, RegionOpening, 3.5) *圆形结构闭运算 closing_circle(RegionOpening, RegionClosing, 3.5) *圆形结构腐蚀 erosion_circle(RegionClosing, RegionErosion, 3.5) *圆形结构膨胀 dilation_circle(RegionErosion, RegionDilation, 3.5) *结构膨胀 minkowski_add1(RegionDilation, RegionDilation, RegionMinkAdd1, 1) *结构腐蚀 minkowski_sub1(RegionMinkAdd1, RegionMinkAdd1, RegionMinkSub, 1)
开运算(open)
开运算是先腐蚀后膨胀的过程,可以用来消除小物体(下图白色),在纤细处分离物体,并在平滑较大物体边界的同时不明显的改变其面积。
闭运算(close)
闭运算是先膨胀后腐蚀的过程,可以用来消除小型黑洞(下图文字中黑色区域)
形态学梯度(Gradient)
形态学梯度是膨胀图与腐蚀图之差,对二值图可以将团块(blob)边缘凸显出来,可以用来保留对象边缘轮廓。
这个在halcon中没有直接的算子。
顶帽(Top Hat)
顶帽运算也称为“礼帽”,是闭运算结果和原图做差的结果,可以用来分离比邻近点亮一些的斑块。
黑帽(Black Hat)
黑帽运算是原图像和开运算做差的结果,可以用来分离比邻近点暗一些的斑块。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

