题外话:在比赛前看过很多篇国赛技术报告,一些强校在处理图像时都会简单讲解四邻域,八领域,种子填充法,博主作为一个第一年做车的小白,当时觉得这些算法十分的高级,虽然也想在巡线方面用到这些算法,但奈何当时自己的能力有限,且比赛留给我学习这些算法的时间太短,所以在比赛时就决定放弃这些,选择了另外的算法,虽然可以实现巡线目的,但内心还是对强校算法十分的好奇,最近在看完16届智能车的技术报告后,觉得对于一些元素的判断方面,基于连通域的算法有着一些得天独厚的优势,趁着还在暑期,将这个算法搞懂,文章若有错误或不足的地方,还望各位大佬不吝指出。

  在学习智能车八邻域的巡线前,我们需要知道一些东西,比如,什么是连通区域,什么是八邻域,什么是种子填充法,以及实现他们需要对数据结构有什么了解。

连通域:一般是指图像中具有相同像素值且位置相邻的前景像素点组成的图像区域。

以最简单的二值化图像为例,它显示的灰度值只有两个:黑(0),白(255)。如果有两个邻接的像素点都为白,那么可称这两个点连通。

在智能车显示的二值化的赛道中,两条边界便可成为连通域。

邻域:在图像中,最小的单位是像素,每一个像素的周围有8个邻接的像素点,其中最常见的邻接方式就是4邻接和八邻接。在视觉上看来,彼此连通的点形成了一个区域,而不连通的点形成了不同的区域。这样的一个所有的点彼此连通点构成的集合,我们称为一个连通区域。

四邻域:                                 八邻域:

                                 

种子填充法:

思路:选取一个前景像素点作为种子,然后根据连通区域的两个基本条件(像素值相同、位置相邻)将与种子相邻的前景像素合并到同一个像素集合中,最后得到的该像素集合则为一个连通区域。

下面给出基于种子填充法的连通区域分析方法:

1)扫描图像,直到当前像素点B(x,y) == 1:

a、将B(x,y)作为种子(像素位置),并赋予其一个label,然后将该种子相邻的所有前景像素(此为四邻域或八邻域)都压入栈中;

b、弹出栈顶像素,赋予其相同的label,然后再将与该栈顶像素相邻的所有前景像素都压入栈中;

c、重复b步骤,直到栈为空;

此时,便找到了图像B中的一个连通区域,该区域内的像素值被标记为label;

(2)重复第(1)步,直到扫描结束;

扫描结束后,就可以得到图像B中所有的连通区域;

好了,到目前为止,关于八邻域的一些基础概念想必大家应该有了大概的了解,如果还没懂得可以多看一些关于连通域的文章。我能力有限,一些算法思想也是看的网上的大佬的,如有错误,还望指正。下一章介绍处理八邻域所需要了解的一些数据结构。