专利名称:一种嵌入式复杂连通域搜索方法
技术领域:
本发明属于计算机视觉技术和机器视觉技术领域,涉及一种嵌入式复杂连通域搜索方法,具体是涉及一种新的可在嵌入式系统中使用的复杂连通域非递归搜索方法。
背景技术:
Blob检测(也被称为斑点检测)是计算机视觉中的一种重要技术,它为视觉系统提供图像中斑点的拓扑结构、大小、形状、位置和方向信息。Blob检测已经应用于OCR识别、钞票印刷中、电路板检测、机器人定位、芯片管脚检测、互动多媒体娱乐等许多计算视觉应用领域。在Blob检测中复杂连通域搜索是一个关键的处理流程,Blob检测处理必须进行连通域搜索,以便把图像中所有孤立区域标记出来,为后续判断识别提供必须的信息。因此连通域搜索的速度和程序复杂性对于提高计算视觉系统的处理性能非常重要。
随着微电子、传感器和计算机科学的发展带动了嵌入式电子设备的发展,嵌入式电子装置的体积小,消除了软硬件冗余,功耗低,使用灵活方便,应用范围广。工业上和消费电子的嵌入式电子产品对视觉处理软件的实时性、速度和系统资源提出了更高的要求,因此必须发展适合于嵌入式平台使用的视觉处理方法。当前大容量的存储器价格已经非常低廉,因此在嵌入式平台上可以使用空间换时间的连通域处理方法。目前常用的连通域搜索方法是使用递归或者链表实现,占用操作系统资源较多,程序复杂程度大,并且标记合并方法复杂,处理复杂物体连通域速度慢。文献《一种新的图像连通域快速标号算法》(宋斌.一种新的图像连通域快速标号算法.电子测量技术,2009. 9,32(9) :67-73)、《一种基于线的标号传播二值图象连通体快速检测方法》(张树生.一种基于线的标号传播二值图象连通体快速检测方法.计算机研究与发展,1994,31(10) 51-54)中提出了针对简单物体的快速连通域搜索方法,但对多级分叉的复杂物体连通域搜索效率比较低;专利《一种并行流水线实现的点目标连通域实时标记与识别方法》(专利号200910090766. 2,申请人周平,刘越,王涌天)中提出了针对简单小物体的快速连通域搜索方法,文献《快速连通域分析算法及其实现》(孔斌.快速连通域分析算法及其实现.模式识别与人工智能,2003,16 (I) :1102115.)中使用链式机制解决连通域搜索和计算问题,但在多个连通域搜索时,这两种方法效率会显著降低。
发明内容
为解决现有的连通域搜索方法中占用操作系统资源较多,程序复杂程度大,并且标记合并方法复杂,处理复杂物体连通域速度慢的不足,本发明提出了一种嵌入式复杂连通域搜索方法。本发明实现的连通域检测方法具有一种非递归的、代码量小、占用操作系统和处理器硬件资源少、扫描速度快的优点,可以很好的完成多级分叉的复杂连通域搜索,并且鲁棒性能好,搜索速度几乎不受物体形状和数目的影响,适合于各种嵌入式硬件平台使用。本发明解决其技术问题所采用的技术方案是一种嵌入式复杂连通域搜索方法,包含如下步骤(I)读入图像数据和二值化;(2 )创建flagmap标号图和LTRegion信息表建立一个和待搜索区域尺寸一致的标号图二维数组flagmap以及一个连通域信息表LTRegion,标号图二维数组flagmap用于标记不同的连通域,连通域信息表LTRegion用于存储所有连通域的左右边界端点位置、有效性标志和包围框信息,连通域信息表LTRegion的每个表项的类型是Region ;(3)自上而下,自左而右扫描一遍图像,将搜索到的连通域左右端点信息存储在连通域信息表LTRegion中,并在flagmap标号图中标记①自下而上,自左而右扫描一遍图像,通过行计数器i对扫描行计数,每扫描完一行,行计数器加1,如果行计数器大于图像行数退出行扫描处理;②在每一行扫描过程中,先读出当前像素点t、左方像素点td和与当前像素点的左下方tdl,正下方像素tdc和右下方像素tdr的灰度值,通过有限状态机控制扫描过程,整个行扫描过程包括初始化“init”,行扫描“linescan”,合并“Uniting”,背景扫描“Backscan”四个过程,在扫描中通过判断当前像素td和下方相邻像素的关系来完成连通域的创建、标记和合并操作。③每个行扫描开始,状态机先进入“init”状态,如果灰度在当前像素点处变为白色,也就是td和t灰度差大于设定值thresh,创建一个新的连通域,编号为ID,将当前点作为新连通域的左边界点,并存储到连通域信息表左端点变量中,然后状态机跳转到“linescan”状态;如果td和t灰度差小于设定值thresh,行计数器n加I状态机跳转到“Backscan”状态。在“linescan”状态,如果当前像素t灰度大于thresh并且下方像素小于thresh,使用t的行坐标更新区域ID的右边界端点计数器,并在标号图像上相应的像素位置标记新的连通域序号ID,然后行计数器加I ;在“1111^(^11”状态中,如果当前像素t和正下方像素tdown都大于thresh,将当前t下方相邻位置的标号图中数值赋给变量IDl,也就是使用IDl保存当前像素下方三个相邻像素(tdownr, tdownc, townl)的连通域标号。在合并状态“Uniting”,如果当前像素大于thresh,就将连通域IDl的右端点设置为当前像素,如果当前像素小于thresh,在标号图上将当前像素及左面的所有白色像素位置设置为ID1,也就是将当前行这些连续的白色像素合并到连通域IDl中,然后状态切换到“Backscan” ;在“Backscan”中如果当前像素是白色(灰度大于thresh),则状态重新切换到“linescan”,否责列计数器n加1,对图像的每一行执行②和③的扫描操作,直到扫描最后一行结束;(4)步骤(3)完成之后,根据记录的左右端点坐标,计算已经搜索到的连通域的包围框,存储在连通域信息表LTRegion中;(5)使用LTRegion信息表和LTRegion标号图合并多于的连通区域步骤(3) —遍扫描过程只能处理实心物体的连通搜索,对于有孔洞的连通域扫描后,还需要进行合并运算,对任意一个连通域K,先初始化一个变量combine为零,然后判断连通域有效性标志Regiondeleted是否等于零,如果Regiondeleted为零,则从连通域左端扫描到右端,在标号图flagmap上检查连通域上边界的每个像素上方相邻像素是否属于另外一个连通域,如果是属于另外一个连通区域ObjectID,同时设置combine为I ;连通域从左到右扫描完后,再判断combine是否等于1,如果等于1,则将连通区域K和连通区域ObjectID合并,更新连通区域ObjectID相应的信息表项(左右和上下边界),然后将标号图flagmap位置上所有标号值为K的单元均修改为ObjectID,最后设置当前连通区域K无效,即设置连通域信息表第K个单元的连通域有效性标志Regiondeleted为I ;重复执行本步骤2次,完成所有相邻连通区域的合并; (6)结束,输出结果。进一步地,步骤(2)中,使用Region类数据结构保存连通域信息,每个连通域信息存储在一个Region变量中,其成员包含左右端点信息,标号,有效性状态变量,包围框,旋转方向,填充率和标号图指针等。进一步地,步骤(5)中多余连通域的删除操作均通过Region类的Regiondeleted状态变量实现,当某个连通域因为合并或过滤操作被判断为不合法(不符合要求)时将 Regiondeleted变量设为I,表示删除,否则保持为0,表示保存。 与现有技术相比,本发明的有益效果是(I)搜索速度快,对图像使用一次扫描和一至两次区域合并即可获得图像中的所有连通区域;(2)适用范围广,可以完成多孔洞和各种凹凸多边形的连通域搜索,可以用于标志识别,动作识别,特征点检测,机器人弓I导,字符识别等许多机器视觉领域;(3)占用处理器资源少,使用非递归的标号图和连通域信息表标记编程策略,避免了大量的费时的堆栈操作,适用于嵌入式系统;(4)便于移植,使用标准C语言开发而成,程序和硬件平台无关,可以方便地用于ARM、DSP和x86等硬件平台。
图I是本发明的标号图flagmap示意图。图2是本发明的步骤流程图。图3是本发明的第一次扫描流程图。图4是本发明的Init状态处理流程图。图5是本发明的Linescan状态处理流程图。图6是本发明的Uniting状态处理流程图。图7是本发明的Backscan状态处理流程图。图8是本发明的相邻连通域最后合并处理流程图。图9是使用本方法处理二值图像的结果。图10是使用Blob粒度分析方法定位电路板基准点示例。图11是使用Blob粒度分析方法定位具有复杂背景的一个零件中心。图12是使用Blob粒度分析方法检测零件孔加工缺陷。
具体实施例方式下面结合附图和实施例对本发明进一步说明。参见图I,本发明使用的使用的标号图flagmap用于标记不同的连通域,图中” I”和” 2”是两个聚集在一起的连通区域,LTRegion表用于存储所有连通域的左右边界端点位置、有效性标志和包围框等信息。LTRegion表的每个表项的类型是Region,使用Region类数据结构保存连通域信息,对连通域信息进行封闭式管理,使得本方法便于平台移植。每个连通域信息存储在一个Region变量中,其成员包含左右端点信息,标号,有效性状态变量,包围框,旋转方向,填充率和标号图指针等,以便快速完成连通域搜索,面积过滤,填充率过滤,连通域方向和形状特征计算等操作,为后续的快速Blob分析,提供必需的参数信息。Region类定义如下
typedef struct {
int IeftPOINT[N]; //区域每行左端点 int rightPOINT[N] ; //区域每行右端点
int RegionNum; //区域数目,LTRegion
. RegionNum 有效区域数目
CRect Surround—Rect; //包围框
int LTRegion^ID; // 区域 ID 号 LTRegion
LTRegion—ID'区
域总数目
' int Region_shape; Il 区域形状代码
int Regiondeleted; Il区域形状有效性代码,0,有效区域,I无
用区域
int Angle—IongAxis; //区域角度double Fill_rate;//填充率
int *f Iagmap; //区域标志图
RegionSurround RegionRect;//区域的最小包围框
} Region;进入第一遍扫描图像前,首先对标号图和连通域信息表进行初始化,将flagmap清零,设置LTRegion表中每个Region类型变量的左IeftPOINT [ ]和右端点值rightPOINT[.]为-I。参见图2,本发明包含如下步骤
(I)读入图像数据和二值化;(2)创建flagmap标号图和LTRegion信息表(3)自上而下,自左而右扫描一遍图像,将搜索到的连通域左右端点信息存储在连通域信息表LTRegion中,并在flagmap上标记。参见图3第一次扫描流程图,图3中的C、D、E、F是四种状态处理,i表示行坐标变量,n表示列坐标变量,Height表示图像高度,Width表示图像宽度,Lstate表示状态变量,Img表示图像矩阵数组,Img坐标表示为(n, i),行扫描初始化中,t = Img (n,i) ;td = Img (n_l,i);tdownc = Img (n,i_l) ;tdownr = Img (n_l,i_l);t down I = Img (n+1, i_l);
计算下方像素值总和tdown = tdownr+tdownc+tdownl ;右下方像素索引pindexr = (m_l) *Width+n+l ;左下方像素索引pindexl = (m_l) *Width+n_l ;在图3-7中,本步骤的实现方式如下①自下而上,自左而右扫描一遍图像,通过行计数器i对扫描行计数,每扫描完一行,行计数器加1,如果行计数器大于图像行数退出行扫描处理;②在每一行扫描过程中,先读出当前像素点t、左方像素点td和与当前像素点的左下方tdl,正下方像素tdc和右下方像素tdr的灰度值,通过有限状态机控制扫描过程,整个行扫描过程包括初始化“init”,行扫描“linescan”,合并“Uniting”,背景扫描“Backscan”四个过程,在扫描中通过判断当前像素td和下方相邻像素的关系来完成连通域的创建、标记和合并操作。③每个行扫描开始,状态机先进入“init”状态,如果灰度在当前像素点处变为白色,也就是td和t灰度差大于设定值thresh,创建一个新的连通域,编号为ID,将当前点作为新连通域的左边界点,并存储到连通域信息表左端点变量中,然后状态机跳转到“linescan”状态;如果td和t灰度差小于设定值thresh,行计数器n加I状态机跳转到“Backscan”状态。在“linescan”状态,如果当前像素t灰度大于thresh并且下方像素小于thresh,使用t的行坐标更新区域ID的右边界端点计数器,并在标号图像上相应的像素位置标记新的连通域序号ID,然后行计数器加I ;在“1111^(^11”状态中,如果当前像素t和正下方像素tdown都大于thresh,将当前t下方相邻位置的标号图中数值赋给变量IDl,也就是使用IDl保存当前像素下方三个相邻像素(tdownr, tdownc, townl)的连通域标号。在合并状态“Uniting”,如果当前像素大于thresh,就将连通域IDl的右端点设置为当前像素,如果当前像素小于thresh,在标号图上将当前像素及左面的所有白色像素位置设置为ID1,也就是将当前行这些连续的白色像素合并到连通域IDl中,然后状态切换到“Backscan” ;在“Backscan”中如果当前像素是白色(灰度大于thresh),则状态重新切换到“linescan”,否责列计数器n加1,对图像的每一行执行②和③的扫描操作,直到扫描最后一行结束;(4)步骤(3)完成之后,根据记录的左右端点坐标,计算已经搜索到的连通域的包围框,存储在连通域信息表LTRegion中;(5)使用LTRegion信息表和LTRegion标号图合并多于的连通区域
参见图8,步骤(3) —遍扫描过程只能处理实心物体的连通搜索,对于有孔洞的连通域扫描后,还需要进行合并运算,对任意一个连通域K,先初始化一个变量combine为零,然后判断连通域有效性标志Regiondeleted是否等于零,如果Regiondeleted为零,则从连通域左端扫描到右端,在标号图flagmap上检查连通域上边界的每个像素上方相邻像素是否属于另外一个连通域,如果是属于另外一个连通区域ObjectID,同时设置combine为I ;连通域从左到右扫描完后,再判断combine是否等于1,如果等于1,则将连通区域K和连通区域ObjectID合并,更新连通区域ObjectID相应的信息表项(左右和上下边界),然后将标号图flagmap位置上所有标号值为K的单元均修改为ObjectID,最后设置当前连通区域K无效,即设置连通域信息表第K个单元的连通域有效性标志Regiondeleted为I ;重复执行本步骤2次,完成所有相邻连通区域的合并。本发明具体实施时,计算机从硬盘存储器或外部采集设备获得一幅图像,将其按照BMP位图格式放入计算机内部随机存储器中RAM,如果这幅图像是彩色图像,先将其转换位Sbits灰度图像格式,然后对此图像进行二值化,对于Sbits灰度图像则直接进行二值化。二值化后最好进行一次腐蚀和膨胀操作,以便消除图像上的杂点。然后由应用程序创 建如下大小和处理图像相同的标号图flagmap和LTRegion连通域信息表。本发明的算法封装在RegionSearch (void*proc_img, int Width, int Height,int*f lagmap, Region*LTRegions)函数中,proc_img 是图像指针,Width 是图像宽度,Height是图像高度,flagmap是标号图指针,LTRegions参数返回搜索到的连通域信息。系统软件在调用RegionSearch之前静态分配好标号图flagmap和连通域信息表LTRegions的内存。LTRegions表的条目总数是maxNum。使用RegionSearch函数时,向函数传入处理图像指针参数proc_img,标号图内存指针flagmap和连通域指针LTRegions。当函数执行完后,flagmap将在图像对应像素坐标位置存放连通域的唯一标识号,LTRegions返回所有连通域的边界、包围框、有效性信息,它们被后续的Blob分析函数使用,以便用来计算填充率,物体大小和物体重心等特征。本发明的算法在CPU频率2. 4GHz的x86平台验证运行时,对于640*480图像连通搜索时间为8ms,1280*1024大小图像搜索时间为32ms。本算法在嵌入式DSP平台运行时,已经被应用于马达零件在线检测、工件尺寸视觉测量等视觉系统中,DSP的频率是600MHz,图10和图11是使用本算法定位工件和特征图片,图象大小720*576,定位速度在小于0. I秒。本算法也应用于ARM9嵌入式处理器内,运行频率400MHz,图象大小640*480,物体识别速度0.2s左右。图9是使用本方法处理二值图像的结果,红色包围框用于标识搜索到物体,检测到物体后将物体显示成绿色,可以看出,采用本方法,可以同时检测到同一幅图像里的所有的连通域,对于右上角复杂线条图案也能检测到。图10是使用Blob粒度分析方法定位电路板基准点示例,先使用图像分割算法对图10左方图像进行分割,然后使用本文方法搜索出来所有连通的白色区域,然后根据连通区域的面积和大小识别出来的基准点的连通区域,最后算出基准点区域的中心作为初始定位点,图10的右图是Blob定位的结果。使用Blob定位电路板技术,已经应用在电路板自动冲孔设备和电路板光学检查仪器设备中。图11是使用Blob粒度分析方法定位具有复杂背景的一个零件中心,先使用图像分割算法对图11左方图像进行分割,然后使用本文方法搜索出来所有连通的白色区域,然后根据连通区域的大小识别出来的零件区域,最后算出零件的中心,图11的右图是Blob定位的结果。图12是使用Blob粒度分析方法检测零件孔加工缺陷,先对图12右方图像进行分割和反色,然后使用本文方法搜索出来孔区域,然后根据孔区域的面积是否符合要求来判断产品质量好坏,因为每次钻孔,孔的形状都不一致,并且零件角度是随机的,所以采用固定模板匹配方法错判率高,并且处理速度慢。·
权利要求
1.一种嵌入式复杂连通域搜索方法,其特征是包含如下步骤 (1)读入图像数据和二值化; (2)创建fIagmap标号图和LTRegion信息表 建立一个和待搜索区域尺寸一致的标号图二维数组fIagmap以及一个连通域信息表LTRegion,标号图二维数组flagmap用于标记不同的连通域,连通域信息表LTRegion用于存储所有连通域的左右边界端点位置、有效性标志和包围框信息,连通域信息表LTRegion的每个表项的类型是Region ; (3)自上而下,自左而右扫描一遍图像,将搜索到的连通域左右端点信息存储在连通域信息表LTRegion中,并在flagmap标号图中标记 ①自下而上,自左而右扫描一遍图像,通过行计数器i对扫描行计数,每扫描完一行,行计数器加1,如果行计数器大于图像行数退出行扫描处理; ②在每一行扫描过程中,先读出当前像素点t、左方像素点td和与当前像素点的左下方tdl,正下方像素tdc和右下方像素tdr的灰度值,通过有限状态机控制扫描过程,整个行扫描过程包括初始化“init”,行扫描“linescan”,合并“Uniting”,背景扫描“Backscan”四个过程,在扫描中通过判断当前像素td和下方相邻像素的关系来完成连通域的创建、标记和合并操作; ③每个行扫描开始,状态机先进入“init”状态,如果灰度在当前像素点处变为白色,也就是td和t灰度差大于设定值thresh,创建一个新的连通域,编号为ID,将当前点作为新连通域的左边界点,并存储到连通域信息表左端点变量中,然后状态机跳转到“linescan”状态;如果td和t灰度差小于设定值thresh,行计数器n加I状态机跳转到“Backscan”状态,在“linescan”状态,如果当前像素t灰度大于thresh并且下方像素小于thresh,使用t的行坐标更新区域ID的右边界端点计数器,并在标号图像上相应的像素位置标记新的连通域序号ID,然后行计数器加I ;在“1111680&11”状态中,如果当前像素t和正下方像素tdown都大于thresh,将当前t下方相邻位置的标号图中数值赋给变量ID1,也就是使用IDl保存当前像素下方三个相邻像素(tdownr, tdownc, townl)的连通域标号,在合并状态“Uniting”,如果当前像素大于thresh,就将连通域IDl的右端点设置为当前像素,如果当前像素小于thresh,在标号图上将当前像素及左面的所有白色像素位置设置为ID1,也就是将当前行这些连续的白色像素合并到连通域IDl中,然后状态切换到“Backscan”;在“Backscan”中如果当前像素是白色(灰度大于thresh),则状态重新切换到“linescan”,否责列计数器n加1,对图像的每一行执行②和③的扫描操作,直到扫描最后一行结束; (4)步骤(3)完成之后,根据记录的左右端点坐标,计算已经搜索到的连通域的包围框,存储在连通域信息表LTRegion中; (5)使用LTRegion信息表和LTRegion标号图合并多于的连通区域 步骤(3) —遍扫描过程只能处理实心物体的连通搜索,对于有孔洞的连通域扫描后,还需要进行合并运算,对任意一个连通域K,先初始化一个变量combine为零,然后判断连通域有效性标志Regiondeleted是否等于零,如果Regiondeleted为零,则从连通域左端扫描到右端,在标号图flagmap上检查连通域上边界的每个像素上方相邻像素是否属于另外一个连通域,如果是属于另外一个连通区域ObjectID,同时设置combine为I ;连通域从左到右扫描完后,再判断combine是否等于1,如果等于1,则将连通区域K和连通区域ObjectID合并,更新连通区域ObjectID相应的信息表项(左右和上下边界),然后将标号图flagmap位置上所有标号值为K的单元均修改为Ob jectID,最后设置当前连通区域K无效,即设置连通域信息表第K个单元的连通域有效性标志Regiondeleted为I ;重复执行本步骤2次,完成所有相邻连通区域的合并; (6)结束,输出结果。
2.根据权利要求I所述的一种嵌入式复杂连通域搜索方法,其特征是步骤(2)中,使用Region类数据结构保存连通域信息,每个连通域信息存储在一个Region变量中,其成员包含左右端点信息,标号,有效性状态变量,包围框,旋转方向,填充率和标号图指针。
3.根据权利要求I所述的一种嵌入式复杂连通域搜索方法,其特征是步骤(5)中多余连通域的删除操作均通过Region类的Regiondeleted状态变量实现,当某个连通域因为合并或过滤操作被判断为不合法(不符合要求)时将Regiondeleted变量设为1,表示删除,否则保持为0,表示保存。
全文摘要
本发明涉及一种嵌入式复杂连通域搜索方法,本发明的步骤包括先读入图像数据和二值化,再创建flagmap标号图和LTRegion信息表,然后自上而下,自左而右扫描一遍图像,将搜索到的连通域左右端点信息存储在连通域信息表LTRegion中,并在flagmap上标记,再使用LTRegion信息表和LTRegion标号图合并多于的连通区域,最后输出结果。本发明实现的连通域检测方法具有一种非递归的,代码量小,占用操作系统和处理器硬件资源少,扫描速度快的优点,并且可以很好的完成多级分叉的复杂连通域搜索,并且鲁棒性能好,搜索速度几乎不受物体形状和数目的影响,具有很好的应用价值,适合于各种嵌入式硬件平台使用。
文档编号G06T7/00GK102760289SQ20111010925
公开日2012年10月31日 申请日期2011年4月29日 优先权日2011年4月29日
发明者王晓东 申请人:王晓东