本发明主要涉及车载智能辅助驾驶和工业视觉表面检测领域,具体地说,涉及车载智能辅助驾驶视觉传感器和工业视觉表面检测相机硬件化的一种基于投影的图像连通域单次扫描方法及装置。
背景技术:
在车载智能辅助驾驶和工业视觉表面检测领域,都需要实现目标物跟踪检测算法,而连通区域标记CCL(Conneted Component Labeling)是该算法的核心技术。常见的CCL包括Two-Pass(两次扫描)和One-Pass(单次扫描)的方法。
Two-Pass方法常见于基于PC进行图像处理的软件实现算法中,对处理的实时性有一定的影响,具体是指先扫描一遍图像找到连通区域并标号,第二次扫描利用并查集算法合并不同的标号区域。
One-Pass方法有“基于区域生长”的方法和“基于轮廓跟踪”的方法。
“基于区域生长”的方法是指基于与扫描尺寸一致的标记矩阵、缓存队列以及标记计数机制,扫描一遍图像,基于八邻域像素点按照连通长度进行区域标记,最终得到标记矩阵和连通区域的个数。该方法只需要扫描一次图像,但需要标记矩阵,从而占用较大的存储区域,且没有很好的考虑线扫描方式获取的连续图像情况。
“基于轮廓跟踪”是指从种子点p开始对内轮廓和外轮廓进行搜寻,对轮廓进行跟踪标记,最终找到连通区域。该方法也只需要扫描一次图像,但进行轮廓搜寻过程中同样需要占用较大的存储空间,且采用硬件加速的方式比较困难。
由于算法处理实时性和有限存储的要求,如何找到能有效采用硬件加速实现流水化连通区域算法,已成为本领域技术人员亟待解决的技术问题。
技术实现要素:
有鉴于此,本发明的目的在于提供一种基于投影的图像连通域单次扫描方法,只需要对图像进行单次扫描就能完成连通域的标记和计算,将单个像素的所有处理步骤在一个时钟周期内完成,非常适合采用硬件环境的流水线实现。
本发明基于投影的图像连通域单次扫描方法,包括如下步骤:
步骤一:初始化扫描第一行,将此行的连通段进行标号,输出到标号行缓存,并将标号状态数据输入数据表队列缓存;
步骤二:将上一行的标号投影到当前行,进行连通段的连通判断、分析和计算;
步骤三:在当前像素点位置,进行当前标号是否有效的第一判断,以及上一行投影到当前行的标号是否有效的第二判断;若第一判断为无效,且第二判断也为无效,则返回步骤二;若第一判断为无效,第二判断为有效,则执行步骤四;若第一判断为有效,且第二判断也为有效,则执行步骤五;若第一判断为有效,第二判断为无效,则执行步骤六;
步骤四:取出上一行投影到当前行标号的数据表队列数据,将其作为当前标号,并扫描下一个像素;
步骤五:取出当前标号的数据表队列数据和上一行投影到当前行标号的数据表队列数据,将两个标号所代表的连通段进行合并,将合并后的状态数据存储到当前标号指示的数据表队列,并将上一行投影的标号状态设置为无效状态;
步骤六:判断当前标号的连通状态是否结束,若结束则将当前标号置为无效,重新开始新的像素点扫描;若没有结束则保持当前标号的状态数据,扫描下一个像素。
进一步地,所述步骤二还包括:如果所述图像的最后一行已经被扫描,则结束流程;所述步骤四、步骤五和步骤六中,在结束当前行的扫描处理后,返回步骤二。
进一步地,所述步骤二具体包括:将上一行的标号投影到当前行,采用标号行缓存存储上一行的标号投影,根据投影标号从数据表队列中读出标号数据状态。
进一步地,在所述步骤五和步骤六中,还包括:将设置为无效状态的标号,写入用于循环利用的标号空闲循环队列中。
进一步地,存储标号状态数据的数据表队列数据,与标号空闲循环队列设置的大小一致。
进一步地,所述数据表队列根据标号来存储和读取连通段的状态数据,根据图像的分辨率大小和连通长度来预设队列的长度。
进一步地,在标号循环队列中,由空闲标号的读出指针和失效标号的写回指针控制整个队列的运转;当连通段需要建立新的标号时,从读出指针读出空闲标号,而当连通段连通状态结束时或合并时,则将失效的标号从写回指针写回到循环队列中,用于循环利用。
进一步地,在所述步骤六中,当x方向连通长度达到设定要求时,当前标号的连通状态设置为结束;当x方向和y方向连通长度同时达到设定要求时,当前标号的连通状态设置为结束,并根据当前标号取出数据表中连通区域状态数据作为该连通段的最终状态数据。
进一步地,该方法还包括以下步骤:设定x方向和y方向的连通长度,控制连通域的连通范围。
本发明的另一个目的,还提供一种基于投影的图像连通域单次扫描装置,该装置包括:
初始化模块,用于初始化扫描第一行,将此行的连通段进行标号,输出到标号行缓存,并将标号状态数据输入数据表队列缓存;
投影模块,用于将上一行的标号投影到当前行,进行连通段的连通判断、分析和计算;
判断模块,用于在当前像素点位置,进行当前标号是否有效的第一判断,以及上一行投影到当前行的标号是否有效的第二判断;若第一判断为无效,且第二判断也为无效,则触发投影模块;若第一判断为无效,第二判断为有效,则触发第一执行模块;若第一判断为有效,且第二判断也为有效,则触发第二执行模块;若第一判断为有效,第二判断为无效,则触发第三执行模块;
第一执行模块,用于取出上一行投影到当前行标号的数据表队列数据,将其作为当前标号,并扫描下一个像素;
第二执行模块,用于取出当前标号的数据表队列数据和上一行投影到当前行标号的数据表队列数据,将两个标号所代表的连通段进行合并,将合并后的状态数据存储到当前标号指示的数据表队列,并将上一行投影的标号状态设置为无效状态;
第三执行模块,用于判断当前标号的连通状态是否结束,若结束则将当前标号置为无效,重新开始新的像素点扫描;若没有结束则保持当前标号的状态数据,扫描下一个像素。
本发明基于投影的图像连通域单次扫描方法及装置,只需要单次扫描就能够完成图像的连通处理,并且不需要存储完整的图像,也不需要对图像进行随机访问;此外,本发明可通过设置x、y方向的连通长度,控制连通域的连通范围,而不仅仅只适应于4连通或8连通域(即连通长度为1的情况);而且,在硬件环境中,由于采用了投影技术,本发明非常适合采用流水线方式实现,达到实时处理的效果。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为发明实施例提供的单次扫描方法的标号判定方法示意图;
图2为发明实施例提供的单次扫描连通方法的数据流图;
图3为发明一实施例基于投影的图像连通域单次扫描方法的流程图;
图4为本发明另一实施例基于投影的图像连通域单次扫描方法的流程图;
图5a和图5b为发明实施例提供的扫描连通长度示意图;
图6a和图6b为发明实施例提供的标号循环队列和数据表队列示意图;
图7为发明实施例提供的扫描过程的示意图;
图8为本发明一实施例基于投影的图像连通域单次扫描装置的结构框图。
具体实施方式
下面对本发明的具体实施方式作进一步的详细说明。对于所属技术领域的技术人员而言,从对本发明的详细说明中,本发明的上述和其他目的、特征和优点将显而易见。
本发明实现了一种可以在硬件环境中进行流水线设计运行的图像连通域单次扫描方法及装置。该方法及装置采用基于投影的技术,在每次扫描过程中将上一行的连通标号投影到下一行,并分析标号连通段的连通状态,从而不需要存储整幅的图像,大大节省了存储空间,并且只需要进行单次扫描就能将连通的区域合并,极大的提高算法在硬件中的运行效率,并达到实时处理的效果。
首先,先介绍该方法的标号判定方法和数据的流通过程。
图1为本发明实施例提供的单次扫描方法的标号判定方法示意图。如图1所示,箭头表示扫描图像的方向,I表示扫描到的当前像素点位置,A表示即将扫描到的下一个像素点的上一行的位置,B表示当前像素点的前一个像素点位置。在扫描过程中,需要根据前一个像素点位置标号的状态(此状态作为当前标号状态),当前扫描像素点的状态,即将扫描到的下一个像素点的上一行的位置标号的状态,这三个状态同时进行是否合并的判定。
图2为本发明实施例提供的单次扫描连通方法的数据流图。如图2所示,I、B、A表示的含义与图1一致,Q表示合并判定后的标号输出,Q输出后需要进行缓存,用于下一行的判定;合并控制通过判断I、B、A的标号和像素状态,进行是否合并的判定,以及数据表队列的缓存,而当需要建立新的连通段时,则由标号循环队列提供空闲标号,用于建立新连通段。
图3为本发明一实施例基于投影的图像连通域单次扫描方法的流程图,包括如下步骤:
步骤S1:初始化扫描第一行,将此行的连通段进行标号,输出到标号行缓存,并将标号状态数据输入数据表队列缓存;
步骤S2:将上一行的标号投影到当前行,进行连通段的连通判断、分析和计算;
进一步地,步骤S2还包括:如果所述图像的最后一行已经被扫描,则结束流程。此外,优选步骤S2具体包括:将上一行的标号投影到当前行,采用标号行缓存存储上一行的标号投影,根据投影标号从数据表队列中读出标号数据状态。
步骤S3:在当前像素点位置,进行当前标号是否有效的第一判断,以及上一行投影到当前行的标号是否有效的第二判断;若第一判断为无效,且第二判断也为无效,则返回步骤S2;若第一判断为无效,第二判断为有效,则执行步骤S4;若第一判断为有效,且第二判断也为有效,则执行步骤S5;若第一判断为有效,第二判断为无效,则执行步骤S6;
步骤S4:取出上一行投影到当前行标号的数据表队列数据,将其作为当前标号,并扫描下一个像素;
步骤S5:取出当前标号的数据表队列数据和上一行投影到当前行标号的数据表队列数据,将两个标号所代表的连通段进行合并,将合并后的状态数据存储到当前标号指示的数据表队列,并将上一行投影的标号状态设置为无效状态;
步骤S6:判断当前标号的连通状态是否结束,若结束则将当前标号置为无效,重新开始新的像素点扫描;若没有结束则保持当前标号的状态数据,扫描下一个像素。
前述步骤S4、步骤S5和步骤S6中,在结束当前行的扫描处理后,返回步骤S2。
需要说明的是,前述S1-S6只是为了更清楚简要地表达各步骤而标号,但并不能据此限定各步骤的顺序。在前述各步骤的顺序调换时,同样可以实现本发明的技术效果。
前述实施例只需要单次扫描就能够完成图像的连通处理,并且不需要存储完整的图像,也不需要对图像进行随机访问;而且,在硬件环境中,由于采用了投影技术,该实施例非常适合采用流水线方式实现,达到实时处理的效果。
此外,前述实施例还可以还包括以下步骤:设定x方向和y方向的连通长度,控制连通域的连通范围。通过设置x、y方向的连通长度,控制连通域的连通范围,而不仅仅只适应于4连通或8连通域(即连通长度为1的情况)。
图4为本发明另一实施例基于投影的图像连通域单次扫描方法的流程图,包括如下步骤:
步骤401,初始化扫描第一行,将此行的连通段进行标号,输出到标号行缓存,并将标号状态数据输入数据表队列缓存;
步骤402,将上一行的标号投影到当前行,从左到右进行连通段的连通判断、分析和计算;
步骤403,判断在当前像素点位置,当前标号是否有效,有效则执行步骤405,否则执行步骤404;
步骤404,在步骤403判定无效时,判断在当前像素点位置,上一行投影到当前行的标号是否有效,有效则执行步骤406,否则直接扫描下一个像素点;
步骤405,在步骤403判定有效时,判断在当前像素点位置,上一行投影到当前行的标号是否有效,有效则执行步骤407,否则执行步骤408;
步骤406,取出上一行投影到当前行标号的数据表队列数据,将其作为当前标号,并扫描下一个像素;
步骤407,取出当前标号的数据表队列数据和上一行投影到当前行标号的数据表队列数据,将两个标号所代表的连通段进行合并,将合并后的状态数据存储到当前标号指示的数据表队列,并将上一行投影的标号状态设置为无效状态,扫描下一个像素;
步骤408,判断当前标号的连通状态是否结束,若结束则将当前标号置为无效,重新开始新的像素点扫描;若没有结束则保持当前标号的状态数据,扫描下一个像素;
在步骤406、步骤407和步骤408中,当扫描到一行的最后一个像素,则返回步骤402,并且所述步骤402还包括:如果所述图像的最后一行已经被扫描,则结束流程。
图4所示的实施例也可以通过设置x、y方向各自的连通长度,来处理不同连通长度的连通段,而现有技术中其他连通域扫描方法只能处理4连通域或8连通域的连通扫描,即x、y方向连通长度只能为1。
图5a和图5b为本发明实施例提供的扫描连通长度示意图。如图5a和图5b所示,连通长度分为x方向和y方向,当连通段属于连通长度之内,则将两个连通块合并为一个连通段,当连通段超出了连通长度,则分为不同的连通段进行处理。在步骤S6或步骤408中,需要判断当前标号的连通状态是否结束,而当x方向连通长度达到设定要求时,当前标号的连通状态设置为结束;当x方向和y方向连通长度同时达到设定要求时,当前标号的连通状态设置为结束,并根据当前标号取出数据表中连通区域状态数据作为该连通段的最终状态数据,即图2中的连通区域输出。
本发明的方法需要一个用于存放标号的循环队列和存放连通段状态数据的数据表队列,如图6a和图6b所示,为发明实施例提供的标号循环队列和数据表队列示意图。在标号循环队列中,由空闲标号的读出指针和失效标号的写回指针控制整个队列的运转。当连通段需要建立新的标号时,从读出指针读出空闲标号,而当连通段连通状态结束时或合并时,则将失效的标号从写回指针写回到循环队列中,用于循环利用;数据表队列则根据标号来存储和读取连通段的状态数据。标号循环队列大小与数据表队列的大小一致,可根据图像的分辨率大小和连通长度来设定,由于采用了循环队列机制,且只存储连通段的状态数据,因此需要的存储空间不大。
图7为发明实施例提供的扫描过程的示意图,此示意说明设置的x、y连通长度都为4,具体的扫描过程如下:
扫描R1行:由于是第1行,因此没有上一行的投影,只需考虑本行的连通段,在C3列的位置,建立新的标号“1”,并在数据表队列的相应位置记录下当前连通段的状态数据;在C4列时,由于当前标号已经有效,则直接更新当前标号的连通段状态数据;扫描完R1行后,将此行的标号投影到下一行。
扫描R2行:由于上一个的标号已经投影到了本行,所以在C2列的位置,需要判断上一行投影到当前行的标号是否有效,在有效的情况下,将该标号的连通段的状态数据读出,并更新,然后写回到数据表队列;在该行的扫描中,C3、C4、C5列的数据都会更新到标号“1”的连通段状态数据中,而在C12列的位置,因已超出标号“1”的连通段的连通长度,所以新建标号“2”的连通段。
扫描R3、R4行:此两行都根据上一行的标号投影进行连通判断和状态数据更新,在第R4行结束后,形成了标号“1”和标号“2”的两个连通段。
扫描R5行:首先该行的扫描与上面描述的类似,在第C9列时,因为连通长度还在连通范围之内,因此将C9列的数据更新到标号“1”的连通段;在C10列的位置,此时出现了当前标号“1”的连通段有效,而上一行投影到此行的标号“2”的连通段也有效的情况,因此需要将两个连通段合并,将连通状态数据更新,合并到标号“1”的连通段中,存储到数据表队列,并设置标号“2”失效,写回到标号循环队列中。
扫描R6行:该行的扫描中,由上一行投影到该行的标号就变为合并后的标号“1”的连通段。而在后续行的扫描中,当x方向和y方向连通长度同时达到设定要求时,标号“1”的连通状态结束,可输出该连通段的最终状态数据。
图8为本发明一实施例基于投影的图像连通域单次扫描装置的结构框图,该装置包括:
初始化模块100,用于初始化扫描第一行,将此行的连通段进行标号,输出到标号行缓存,并将标号状态数据输入数据表队列缓存;
投影模块200,用于将上一行的标号投影到当前行,进行连通段的连通判断、分析和计算;
判断模块300,用于在当前像素点位置,进行当前标号是否有效的第一判断,以及上一行投影到当前行的标号是否有效的第二判断;若第一判断为无效,且第二判断也为无效,则触发投影模块;若第一判断为无效,第二判断为有效,则触发第一执行模块;若第一判断为有效,且第二判断也为有效,则触发第二执行模块;若第一判断为有效,第二判断为无效,则触发第三执行模块;
第一执行模块400,用于取出上一行投影到当前行标号的数据表队列数据,将其作为当前标号,并扫描下一个像素;
第二执行模块500,用于取出当前标号的数据表队列数据和上一行投影到当前行标号的数据表队列数据,将两个标号所代表的连通段进行合并,将合并后的状态数据存储到当前标号指示的数据表队列,并将上一行投影的标号状态设置为无效状态;
第三执行模块600,用于判断当前标号的连通状态是否结束,若结束则将当前标号置为无效,重新开始新的像素点扫描;若没有结束则保持当前标号的状态数据,扫描下一个像素。
前述实施例只需要单次扫描就能够完成图像的连通处理,并且不需要存储完整的图像,也不需要对图像进行随机访问;而且,在硬件环境中,由于采用了投影技术,该实施例非常适合采用流水线方式实现,达到实时处理的效果。
此外,前述实施例还可以包括设定模块,用于设定x方向和y方向的连通长度,控制连通域的连通范围。通过设置x、y方向的连通长度,控制连通域的连通范围,而不仅仅只适应于4连通或8连通域(即连通长度为1的情况)。
还应当理解,本发明虽然已通过以上实施例进行了清楚说明,然而在不背离本发明精神及其实质的情况下,所属技术领域的技术人员当可根据本发明作出各种变化和修正,均属于本发明的权利要求的保护范围。