导读:
来复习一下高中数学,不过这里勇哥不用纸和笔,而是用halcon做为平台来玩玩。 一切要与机器视觉联系起来才更有趣味。 因此,这个系列的数学课是专门给halcon平台的视觉程序员看的哦。
本篇讨论一下region的集合运算。
halcon中常见的对象有region和xld。前者是用行程编码表示的“区域”对象(不是像素)。
后者是工作在亚像素精度下的轮廓线对象。
两者都有对应的集合运算的算子。
(一)集合并集(union set) R∪S
定义:R∪S={x|x∈R V x∈S }
注意:数学中的几个符号说明如下: “且”的符号:∧ “或”的符号:∨ “非”的符号:┐
实现region的并集运算常见的有两个算子:
(1) union1(Region : RegionUnion : : )
用于把多个region合成一个region变量
看下面的演示:
注意代码中关键在于勇哥标注的三个count_obj的对象计数。
gen_empty_region(s1) gen_empty_region(s2) read_image(Image, 'printer_chip/printer_chip_01') threshold (Image, Regions, 151, 255) *1 count_obj(Regions, Number) connection(Regions, ConnectedRegions) *244 count_obj(ConnectedRegions, Number1) union1(ConnectedRegions, RegionUnion) *1 count_obj(RegionUnion, Number2)
2)union2(Region1, Region2 : RegionUnion : : )
把Region2的内容拼合到Region1中
其实两者要达到的目的是一致的(都是多个region合并在一起),只是函数参数表达的不同。
gen_empty_region(RegionUnion) read_image(Image, 'printer_chip/printer_chip_01') gen_rectangle1 (ROI_0, 9.36842, 105.382, 112, 1496.98) reduce_domain(Image, ROI_0, ImageReduced) threshold (ImageReduced, Regions, 151, 255) *1 count_obj(Regions, Number) connection(Regions, ConnectedRegions) *7 count_obj(ConnectedRegions, Number1) for i:=1 to Number1 by 1 select_obj(ConnectedRegions, obj, i) union2(obj, RegionUnion, RegionUnion) endfor *1 count_obj(RegionUnion, Number2) dev_display(Image) dev_display(RegionUnion)
(二)集合交集(intersection set) R∩S
定义: R∩S={x|x∈R^x∈S}
region交集使用算子intersection。
intersection(Region1, Region2 : RegionIntersection : : )
它返回的是两个region的共同拥有的那部分。
演示程序:
gen_ellipse (ROI_1, 228.853, 179.121, rad(4.76662), 68.715, 76.0748) gen_ellipse (ROI_2, 211.723, 211.78, rad(-87.4304), 140.989, 49.5784) dev_clear_window() dev_set_draw('margin') dev_display(ROI_1) dev_display(ROI_2) stop() intersection(ROI_1, ROI_2, RegionIntersection) dev_clear_window() dev_display(RegionIntersection)
(三)集合补集(complementary set) ∁UA
定义:∁UR={x|x∈U,且x∉R},其中U是全集。
也可以表示为:
region的补集用算子:complement
complement(Region : RegionComplement : : )
演示代码:
gen_rectangle1 (ROI_1, 94.6111, 76.0944, 332.833, 277.604) gen_ellipse (ROI_2, 229.722, 178.906, rad(-88.1073), 62.2562, 36.9919) dev_clear_window() dev_set_draw('margin') dev_display(ROI_1) dev_display(ROI_2) stop() complement(ROI_2, RegionComplement) dev_clear_window() dev_set_color('green') dev_display(RegionComplement)
由上面的定义:∁UR={x|x∈U,且x∉R},其中U是全集
我们看到算子complement只传入了一个圆的region,然后就计算出了补集结果(右图中绿色的部分)。
因此它是使用整个屏幕的范围做为U(全集)。
所以其实上面的例子并没有达到我们的目的。我们希望全集是左图那个矩形。
该怎么做呢?
勇哥改下代码:
gen_rectangle1 (ROI_1, 94.6111, 76.0944, 332.833, 277.604) gen_ellipse (ROI_2, 229.722, 178.906, rad(-88.1073), 62.2562, 36.9919) dev_clear_window() dev_set_color('red') dev_set_draw('margin') dev_display(ROI_1) dev_display(ROI_2) stop() difference(ROI_1, ROI_2, RegionDifference) dev_clear_window() dev_set_color('green') dev_display(RegionDifference)
达到我们的目的了!
因此其实算子difference是把R做为全集,求S的补集(参考下面的图片)。
算子complement的全集不能指定,只能是全屏幕。
原型: difference(Region, Sub : RegionDifference : : )
difference的定义可以是:
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

