halcon版高中数学(2)集合在region中的应用1

导读:

C#
来复习一下高中数学,不过这里勇哥不用纸和笔,而是用halcon做为平台来玩玩。
一切要与机器视觉联系起来才更有趣味。
因此,这个系列的数学课是专门给halcon平台的视觉程序员看的哦。


本篇讨论一下region的集合运算
halcon中常见的对象有region和xld。前者是用行程编码表示的“区域”对象(不是像素)。
后者是工作在亚像素精度下的轮廓线对象。
两者都有对应的集合运算的算子。

(一)集合并集(union set)  R∪S

定义:R∪S={x|x∈R V x∈S }

image.png

注意:数学中的几个符号说明如下:
“且”的符号:∧ 
“或”的符号:∨
“非”的符号:┐

实现region的并集运算常见的有两个算子:

(1)  union1(Region : RegionUnion : : )   
用于把多个region合成一个region变量

看下面的演示:

image.png

注意代码中关键在于勇哥标注的三个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中

image.png

其实两者要达到的目的是一致的(都是多个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) RS

定义: R∩S={x|x∈R^x∈S}

image.png

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)

image.pngimage.png

(三)集合补集(complementary set  ∁UA

定义:∁UR={x|x∈U,且xR},其中U是全集。

也可以表示为:image.png

image.png

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,且xR},其中U是全集
我们看到算子complement只传入了一个圆的region,然后就计算出了补集结果(右图中绿色的部分)。
因此它是使用整个屏幕的范围做为U(全集)
所以其实上面的例子并没有达到我们的目的。我们希望全集是左图那个矩形。

该怎么做呢?

image.pngimage.png

勇哥改下代码:

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)

达到我们的目的了!

image.png

因此其实算子difference是把R做为全集,求S的补集(参考下面的图片)。
算子complement的全集不能指定,只能是全屏幕。

原型: difference(Region, Sub : RegionDifference : : )

difference的定义可以是:

image.png

image.png


--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864