一.行程编码和Region
行程编码可以表示用来表示图像感兴趣区域,通过(y,x1,n)或者(y,x1,x2)方式,表示一行中连续的区域。在图像处理时Region是一个很常用的概念,在halcon中大量使用,通过将图像处理的范围限制在一个指定的区域(Region)内,容易求解问题和提高速度。
在halcon中经常会求两个Region的并集、差集和交集。一个容易想到的方法是将Region转换为黑白图像,然后求两个图像位运算,在opencv中很容易实现。这种方法有一个问题,如果Region区域比较小,如果是将其转换为图像求,会产生较大的计算量。本文介绍一种无需转换为图像,求Region差集的算法。
二.问题转化
行程编码的Region求差集最终可以转换为一行求差集问题。因此只需要解决行求差集即可。
所谓差集是指区域1中排除区域2所在的部分,如上图所示为行求差集。
三.问题分析
3.1 问题归纳
定义:一个段表示x连续的区域,即(x1,x2),x1为前端x,x2为后端x。段集表示多个段的集合。
上图中,假设绿色为减段集X,蓝色为被减段集X’,x1,x2为X的当前段的前端和后端,x’1,x’2为X’的前端和后端,结果为差段集D。
任何时候一个减段和被减段的关系存在6种,上图中从左到右。
(1)被减段完全在减段左边,即x’2<=x1;
(2)被减段部分在减段左边,即x’1 <= x1 && x1 <= x’2 && x’2 <= x2;
(3)被减段在减段中间,即x’1>=x1 && x’2<=x2;
(4)被减段部分在减段右边,即x1 <= x’1 && x’1 <= x2 && x2 <= x’2
(5)被减段完全在减段右边,即x’1>=x2
(6)减段完全在被减段中间,即x’1<=x1 && x’2>=x2
用index指向减段,初值为0, index’指向被减段,初值为0;将xp指向待求的差段前端,即第一个减段的前端。算法如下:
3.2 情况1
3.2 情况2
3.3 情况3
3.4 情况4
3.5 情况5
3.6 情况6
四.算法过程
- 用index指向减段,初值为0, index’指向被减段,初值为0;将xp指向待求的差段前端,即第一个减段的前端
- 判定当前减段和被减段的所属情况,根据上面情况1~情况6操作index、index'和差段集合
- 如果index<减段集合个数,则继续2操作,否则结束。