原文题目:TopologicalStructural Analysis of Digitized Binary Images by Border Following
原文作者:SATODHI SUZUK, KEIICHI ABE
Opencv源码中findContours()函数引用了该论文:
[Suzuki85] Suzuki, S. and Abe, K., TopologicalStructural Analysis of Digitized Binary Images by Border Following.CVGIP 30 1, pp32-46 (1985)
我写了一篇相关的源码分析。源码和论文结合起来看方便理解。
博文题目:Opencv轮廓跟踪算法源码分析(1)——icvFetchContour()
博文地址:http://blog.csdn.net/yiqiudream/article/details/75702407
我的联系方式:1035436476@qq.com
翻译是为了帮助自己理解论文中的算法。第一次翻译,水平有限,仅供参考。论文也没有全部理解,欢迎指正,共同学习。
///
基于边界跟踪方法的数字化二值图像拓扑结构分析
摘要:
针对数字化二值图像的拓扑结构分析,本文提出两种边界跟踪算法。第一种区分二值图像边界之间的包围关系(surroundness relations)。外边界(outer borders)和孔边界(hole borders)分别与像素值为1的连通域(1-pixels)和像素值为0的孔洞存在一对一的对应关系。本文提出的算法陈述了一种二值图像的表示方法,利用该方法可以提取出一些特征而无需重建图像。第二种算法,是第一种算法的修改版本,只跟踪最外层轮廓(也就是,该外边界之外无包围它的孔边界)。借助于时序数字计算机的使用,这些算法可被有效用于二值图像的区域计数,收缩,拓扑结构分析。
1 INTRODUCTION
在数字化二值图像处理中,边界跟踪是一种基础技术。它提取边界轮廓一系列坐标点或者链码,该边界是指一个1像素连通域(1-pixels;1-component)和一个0像素连通域(0-pixels)(背景或孔洞)之间的边界。边界跟踪技术已经被深入研究,因为它有着广泛的应用,包括图像识别,图像分析,和图像数据压缩[1-10]。
本文的目的是提出具有一种拓扑分析能力的边界跟踪算法。如果有人想要将一幅二值图像转换成边界描述,那他可以使用本方法并经过少量额外修改,来提取图像的拓扑结构。要提取的信息是两种边界的包围关系,这两种边界是:外层边界和孔洞边界。既然外层边界和1-连通域(1-component)之间、孔洞边界和0-连通域(0-component)之间存在一对一的对应关系,则给定二值图像的拓扑结构可以确定。
已有一些公开的研究,使用光栅扫描和标记的方法分析二值图像的拓扑结构[1,10,11].针对这类分析,一个可替代的方法是边界跟踪。如果某图像处理系统使用边界跟踪算法来达成某些目的,同时需要分析输入图像的拓扑结构,那么本文提出的方法具有吸引力。然而,少有研究投入到该项目中来。已经存在的方法[6,7],要么复杂要么耗时,所以它们与其他不使用边界跟踪的结构分析方法相比没有优势。
本文首先陈述一种算法,可以用来提取给定二值图片的拓扑结构。该算法是文献[1]的一种扩展版本,文献[1]是一种区分外边界和孔边界的边界跟踪算法。所说的扩展包括:(1)给每一个边界一个独特的标记而不是对每个边界进行相同的标记处理(边界标记);(2)增加一个额外的处理来获得当前跟踪边界的母边界(parent border)(参考定义4)。有了这种算法,我们可以提取边界的包围关系,这种关系与连通域的包围关系一致。如果一幅二值图像以边界的形式存储,并提取出了边界包围关系,一些简单的图像处理可以在此基础上完成而无需再次存储原始图像。因此,本方法提供了一种存储二值图像数据的有效方法。
下一步展示第一种算法的一个修改版本,该版本只跟踪二值图像的最外层边界(也就是,该外边界之外无包围它的孔边界)。当我们需要忽略那些1-连通域内部的1-连通域,这个修改的算法提供了快速的,顺序的方法,实现1-连通域计数或将每个1-连通域收缩到一个点。
2 BASIC CONCEPT AND NOTATIONS
本文只考虑哪些采样点按矩形网络分布的数字化二值图像。尽管我们将采用通用术语和符号,比如文献[1]中的那些,我们想要定义和声明一些并不那么通用的概念和符号。
最上面一行,最底下一行,最左边一列,和最右边一列组成了一张图的边框(frame)。像素的值为0和1分别被称为0-像素(0-pixel)和1-像素(1-pixel)。不失通用性,我们假设0-像素填充了二值图像的边框。我们假设在处理过程中我们可以给像素点赋任何整数值。位于第i行和第j列的像素点用(i,j)表示。我们采用以下坐标系:行序号i从上到下递增;列序号j从左到右递增。图像像素点(i,j)处的密度值fij由下式定义:F={fij}。
一个1-连通域和一个0-连通域是分别由1-像素点和0-像素点组成的连通域。如果一个0-连通域S包含图像边框,我们称S为背景(background);否则为孔洞(hole)。
众所周知,为了避免拓扑学矛盾,如果1-像素点被当做4-(8-)连通来处理,则0-像素点必须被当做是8-(4-)连通的。当我们将1-像素点当做4-(8-)连通处理,0-像素点当做8-(4-)连通处理的时候,我们会说“在4-(8-)连通的情况下”。当我们不额外指定连通性的类别时,我们指的是这两种类别都有效。
边界和连通域之间的包围定义如下:
DEFINITION 1 (border point).
在4-(8-)连通的情况下,一个1-像素点(i,j)在它的8-(4-)邻域内存在一个0-像素点(p,q),则称作一个边界点。如果(i,j)是1-连通域S1中的一个点,(p,q)是0-连通域S2中的一个点,则点(i,j)被称为S1和S2之间的一个边界点。
(译者注:假设有标记a的点是(i,j),属于S1(白色部分);有标记b的点是(p,q),属于S2(黑色部分)。按照以上定义,a点是边界。这就是4-连通的情况。)
DEFINITION 2 (surroundnessamong connected components).
给出二值图中两个连通域S1和S2,如果存在一个像素点属于S2,for any 4-path from a pixelin S1 to a pixel on the frame,我们称S2包围S1.如果S2包围S1,并且他们之间存在一个边界点,则称S2直接包围S1。
(译者注:按照FIG.1.来举例,S1直接包围S2,S2直接包围S3,S3直接包围S4,S1直接包围S5.)
DEFINITION 3 (outer borderand hole border).
一个外边界(outerborder)定义为:一个任意的1-连通域和直接包围它的0-连通域之间的边界点组成的集合。一个孔边界(hole border)定义为:一个孔和直接包围它的1-连通域之间的边界点的集合。我们使用术语“border”,要么指一个外边界,要么指一个孔边界。注意,孔边界被定义为1-pixels的集合(而不是0-pixels),外边界也是。
(译者注:按照FIG.1.来举例,B1,B3,B4都是外边界,B2是孔边界。)
以下特性针对连通域和边界。
PROPERTY 1.
二值图上,对任意一个1-连通域,它的外边界是1且是唯一的,对任意孔,它的孔边界(该hole和直接包围它的1-component之间的边界)也是唯一的。
Proof. 这个特性很显然,因为任意1-component 或者hole是直接被一个连通域包围的。
我们定义parentborder和边界之间的包围关系。
DEFINITION 4 (parent border).
一个outer border(outerborder指的是:一个1-componentS1和直接包围S1的这个0-component S2之间的边界)的parent border定义如下:- (1) 如果S2是一个孔的话,该outer border的母边界就是S2和直接包围S2的1-component之间的孔边界。
- (2) 如果S2是背景(background)的话,该outer border的母边界就是图片的边框。
(译者注:按照FIG.1.来举例,S4是一个1-component, S3是直接包围S4的0-component,也就是一个hole,它们之间的边界,即B3,是一个outer border,B3的母边界就是B2。 另外,S2是一个1-component, S1是一个0-component,S1同时也是这幅图的background,它们之间的边界,也就是B1,是一个outer border,B1的母边界就是frame.)
一个holeborder (holeborder指的是:一个hole S3 和直接包围它的1-component S4之间的边界)的 parent border定义如下: S4和直接包围S4的0-component.
(译者注:按照FIG.1.来举例,S3和S2之间的边界B2的母边界是B1.)
DEFINITION 5 (surroundnessamong borders).
二值图像中,两个给定的边界B0和Bn,我们说Bn包围B0是指,存在一系列边界B0,B1,…Bn,对所有的k,Bk是Bk-1的母边界。
从定义2到定义5,我们看到以下特征存在于连通域之间的包围关系和边界之间的包围关系(Fig.1)。
PROPERTY2. 对任意二值图,以上两个包围关系是同构的,有着以下映射:
一个1-component <-> 它的外边界;
一个hole <-> 它的孔边界:该孔和直接包围该孔的1-连通域之间的边界;
background <-> 边框。
3. 边界跟踪算法for拓扑分析
我们展示一个边界跟踪算法用于拓扑结构分析。提取二值图中边界之间的包围关系。首先我们给出该算法的非正式解释。
ALGORITHM1.
使用一个电视光栅扫描一张输入的二值图像,直到找到一个点(i,j)满足边界跟踪初始点的条件则终止扫描,该点要么是一个外边界(Fig.2a)要么是一个孔边界(Fig.2b).如果这个点(i,j)同时满足以上两个条件,(i,j)必须被当做是outer border的起始点。给最新发现的边界用一个独特的可辨识的数字赋值。让我们称它为边界序列号(number of the border),记做:NBD。
接下来确定最新发现的边界的母边界。在光栅扫描期间,我们也保存上一个遇到的(内/外)边界的顺序数LNBD。这个被存储起来的边界要么是当前边界的母边界,要么是和当前边界拥有同一个母边界。因此,我们可以根据这两个边界的类型确定当前边界的母边界的顺序数。规则是Table 1.
从起始点开始跟踪以发现的这个边界,对边界上的像素点做标记。边界跟踪流程是经典的那个[1-3]; 我们算法中的显著特征就是标记规则。
- (a) 如果当前跟踪的边界处于两个连通域之间:包含像素点(p,q+1)的0-连通域 和 包含像素点(p,q)的1-连通域,则修改(p,q)的值为 –NBD。 (译者注:一个外边界最右边的像素点被标记成-NBD。)
- (b) 否则,设置(p,q)的值为NBD,除非点(p,q)在一个已经跟踪过的边界上。
情况(a)和(b)分别阻止像素点(p,q)成为已经跟踪过的孔边界的跟踪初始点和外边界的跟踪初始点。正数NBD和负数-NBD,分别与文献[1]中的边界跟踪算法中的标记“l”和“r”对应。
跟踪并标记完整个边界后,重新开始光栅扫描。当扫描到图片的右下角,算法终止。
让我们通过Fig3.中的例子来解释算法过程。输入二值图如图(a).当光栅扫描到达圈出来的1-像素,我们发现它满足一个外边界的初始点的条件(Fig.2a).顺序数2被指派给该边界,因为数字1已经被分配给图像的边框。我们也从Table 1中发现,它的母边界就是边框。
然后边界跟踪开始,该边界上像素点的值都被修改为要么2,要么-2,如图(b)。跟踪完整个边界,光栅扫描重新开始。
下一次的边界跟踪开始于图(b)中圈出的像素点,该点满足一个孔边界的初始点的情况(Fig.2b)。注意,一个被标记为负值的点是不能作为边界跟踪的初始点的。此边界(标记为数字3)的母边界被发现是标记了数字2的外边界。边界跟踪期间,两个值为2的像素点被改成-3,根据标记规则(a)。并且两个值为1的像素点被改为3,根据规则(b).所有其他已经访问过的像素点(值为2)都不变。按照类似的方式继续下去,我们得到的最终的结果(e)。算法1的正式描述在附录I中。
以下特征说明了算法1的有效性。
PROPERTY 3.
任何1-连通域最上面一行的最左边像素点(i,j)满足图Fig.2a中的条件。从(i,j)点开始跟踪的边界B是个外边界(也就是说,包含(i,j-1)的0-连通域S2包围S1);该外边界跟踪结束后,同样的外边界不会重复跟踪。
Proof. 见附录II。
PROPERTY 4.
像素点(i,j)右手边的邻点(i,j+1)是任何孔S1最上面一行的最左边的像素点,点(i,j)满足Fig.2b.的情况;由点(i,j)开始跟踪的边界B是一个孔边界(也就是说,包含点(i,j)的1-连通域S2包围S1);这个边界跟踪结束后,相同的孔边界不会再次被跟踪。
Proof.证明类似于特性3的证明。
PROPERTY 5.
算法1中边界跟踪的起始点与1-连通域或孔之间是一一对应的。
Proof. 此性质由性质3和4直接推导出。
PROPERTY 6.
需要确定指定边界B的母边界的时候,变量LNBD包含的序列数,要么是B的母边界的序列数,要么是和B拥有相同母边界的那个边界的序列数。
Proof. 见附录III
本文提出的算法1,以及文献[1]提出的区分外边界和孔边界的边界跟踪算法,在应用中有以下优势(正如特征2到5所示):
- (1)我们能从二值图中对1-连通域和孔进行计数,并得出它的欧拉数(Euler number)。
- (2)我们可以将1-连通域或孔收缩到一个像素点,一个1-连通域用它的外边界的边界跟踪初始点来表示,一个孔用它的孔边界的跟踪初始点的右邻域点来表示。前一个和后一个分别位于1-连通域和孔的最上面一行的最左边一个。??
- (3)我们可以根据边界特征来执行(1)和(2):举个例子,我们可以只对周长大于给定阈值的1-连通域进行收缩,或者对包围矩形框面积大于指定值的边界进行收缩。
算法1还有如下优势(正如特征2到6所示):
- (4)我们可以从二值图中提取连通域的包围关系。可应用于从an image database 中进行 picture search.或者应用于图像特征提取。
- (5)由算法1推导出的用拓扑结构表示边界的方法可以应用于图像存储。这是因为利用拓扑结构可以做一些简单的图像处理而不需要重新存储原始图像。这些图像处理过程包括:从边界中提取一些特征,比如,连通域的周长和面积;分析拓扑结构,比如,是否一个1-连通域与背景毗邻,或者是否有超过n个hole;根据几何学或拓扑学特征提取或删除连通域或孔洞。
图4 展示了一个例子,从算法1中导出的边界拓扑结构表示方法。
4. 只提取最外边界(outermost borders)的边界跟踪算法
我们可以修改以上展示的算法,在二值图像中只跟踪最外层边界(也就是,背景与1-连通域之间的边界)。
ALGORITHM 2.
这里我们只解释与算法1不同的地方。(1)我们只在光栅扫描遇到以下点时开始边界跟踪:满足Fig.2a中外边界的起始点且LNBD≤0。(2)标记规则与算法1一样,除了数值“2”和“-2”分别由值“NBD”和“-NBD”替换。(3)在光栅扫描过程中我们保存最新遇到的非零点的“LNBD”值。每当我们开始扫描图像中新的一行,重置LNBD为零。
算法2的基本原理如下:最外层边界的母边界是图像的边框(Frame)。边界点(i,j)位于一个0-像素点直接相连的右边点的位置,当且仅当点(i,j)满足以下条件(1)或(2)的时候,点(i,j) 是最外层边界点。
- (1)所有的点(i,1),(i,2),…(i,j-1)都是0-pixels.
- (2)在光栅扫描过程中最新遇到的边界点(i,h)处于外边界上,点(i,h+1)属于背景(background)。
既然我们保存了光栅扫描过程中最新遇到的非零像素点的“LNBD”值,以上条件(1)和(2)可以分别通过条件“LNBD=0”和条件“LNBD= -2”来检验,除了最外层边界不跟踪其他外边界。
PROPERTY 7.
算法2只跟踪输入的二值图像中的最外层边界(outermost borders),每个最外层边界只跟踪一次。
当不存在1-连通域包围另一个1-连通域的情况下,算法2用于1-连通域计数或形状分析(shape analysis)时效率很高,因为不需要跟踪任何孔边界因此执行更快。当1-连通域内包围着的所有1-连通域都是噪声或者是不需要处理的元素的情况下,算法2也很有用。表2中对比了几种1-连通域收缩算法[1,12,13]的处理时间,使用的是通用的时序电子计算机。输入的二值图像,不存在一个1-连通域被其他1-连通域包围的情况,如图Fig.5所示:一个是斑点图其中有一些随机孔洞,另一个是线图案。算法2中的收缩算法几乎和连通域标记一样快。如果所有被其他1-连通域包围的1-连通域都忽略,这将是最合适的,连通域标记不能区分最外层边界和那些被忽略的边界。?
5. CONCLUSION
本文展示了通过边界跟踪分析二值图像拓扑结构的方法。是对之前的区分外边界和孔边界的跟踪算法的一种扩展。同时展示了一种方法:实现1-连通域计数以及跟踪二值图像中的最外层1-连通域 (outermost 1-components) 的边界而忽略其他边界。这是第一钟算饭的修改版。如果使用时序数字计算机这些方法快速有效。我们目前正在研究文档处理方向的应用,比如流程图识别。
附录I:算法1的正式描述
在此算法中,当我们说“theneighborhood”,我们指的是4-(8-)邻域,在4-(8-)连接的情况下。假设输入图像 F={fij}.设置最初的NBD=1(F的边框形成了一个特殊的孔边界,分配序列数1;NBD代表当前边界的序列数)。使用光栅扫描器扫描图像,对每一个满足fij≠0的像素点执行以下步骤。每当我们开始扫描新的一行,重置LNBD=1.
(1)选择下面的一条:
- (a)如果 fi,j= 1 且 fi,j-1= 0 则确定像素(i,j)是一个外边界的跟踪起始点,NBD自增,并且 (i2, j2)<-(i, j-1)。
- (b)否则如果fi,j ≥ 1 且 fi,j+1 = 0,则确定像素(i,j)是一个孔边界的跟踪起始点,NBD自增,(i2, j2)<-(i, j+1) ,当fij>1的情况下,LNBD<-fij。
- (c)否则,go to (4).
(2)根据最新找到的边界(newly found border)的类型以及带有序列号LNBD的边界(也就是,the last border met on thecurrent row)的类型,决定当前边界的母边界,判断规则如表1.
(3)从起始点 (i,j) 开始,跟踪已检测到的边界:这一步由以下步骤3.1到步骤3.5实现。
- (3.1) 从点(i2, j2)开始,顺时针旋转查找点(i,j)的邻域,寻找一个非零点,第一个找到的非零点记做(i1, j1)。如果没有找到非零点,另fij = -NBD,转到(4)。
- (3.2) (i2,j2)<- (i1,j1) 且 (i3, j3)<- (i, j)。
- (3.3) 寻找范围在当前点(i3, j3)的邻域中,方向为逆时针方向,出发点为(i2, j2)的下一个元素,查找一个非零点并将第一个找到的非零点设为(i4, j4)。(译者注:比如点(i3, j3)的0方向的点是(i2, j2),则按逆时针方向转一格就到了点(i3, j3)的1方向的点,从这个1方向点开始查找非零点,找到了就设置为(i4, j4))。
- (3.4) 根据下面的规则修改点(i3, j3)的值fi3,j3:
- (a)如果步骤(3.3)中检查到点(i3, j3+1)是一个0-pixel,则fi3, j3 <- ﹣NBD.
- (b) 如果步骤(3.3)中检查到点(i3, j3+1)不是一个0-pixel,且fi3, j3 = 1,则fi3, j3<- NBD.
- (c) 否则,不要改变fi3, j3 。
- (3.5) 如果(i4, j4)= (i,j) 且 (i3,j3) = (i1, j1) (回到了starting point),转到步骤(4);否则,(i2, j2)<- (i3, j3),(i3,j3)<- (i4,j4),且回到步骤(3.3)。
(4) 如果fi,j ≠ 1,则 LNBD <- | fi,j| 且 从点(i, j+1)重新开始扫描。当扫描器到达图片的右下角的点则算法终止。
(译者注:在这个算法中,(i3,j3)代表当前点,(i2,j2)代表当前点的上一个找到的点,(i4, j4)表示在当前点的邻域中最新找到的非零点。 当前点是不断变化的,这些点的名称是相对的。具体参考开头给出的博文。)