基于硬件电路的SIFT算法图像边界扩充方法和处理方法
技术领域
本发明涉及视觉处理技术领域,具体涉及一种基于硬件电路的SIFT算法图像边界扩充方法和处理方法。
背景技术
SIFT算法尺度空间生成方法是在图像多尺度空间理论上发展出来的,SIFT算法为鲁棒性较好的一种图像特征检测方法。该算法不仅具有尺度、旋转、仿射、视角、光照等不变性,对目标的运动、遮挡、噪声等因素影响也能保持较好的匹配效果,广泛应用于视频跟踪、移动机器人定位与地图创建、物体识别、图像全景拼接、人脸识别等领域。SIFT算法生成尺度空间需要建立高斯金字塔,高斯金字塔的生成需要进行大量高斯卷积运算。对于高斯卷积操作,边界的像素点一般无法处理,因为高斯卷积核中心到不了最边缘像素点,这时如果先将边界扩充,再进行高斯卷积操作,最后将扩充的边界去掉,则原图像每个像素点都进行了高斯卷积。SIFT算法在对图像进行高斯卷积处理的时候,如果卷积模板(高斯卷积核长度)过大,且不对原图的边界进行扩充,会导致处理之后的图像尺寸变小,SIFT算法得到的匹配特征点数量减少,进而影响算法的稳定性。
图像边界扩充一般采用以下几种方法:1)使用常数填充;2)复制边缘的一行或一列像素并一直延伸至添加边缘的宽度或高度;3)以边缘像素为中心,将邻近像素进行镜像映射。SIFT算法的目的是找到特征点,特征点一般为极大值或极小值点。由于前两种图像边界扩充方法填充的像素点都一样,不利于产生极大值或极小值点,因此,SIFT算法图像边界扩充更适合采用第三种方法。目前采用第三种方法实现图像边界扩充主要是以软件运算的方式,这种方式需要耗费较多的运算资源,并且效率相对较低。
发明内容
为解决上述问题,本发明提供了一种基于硬件电路的SIFT算法图像边界扩充方法和处理方法,能够提高图像边界像素点的像素扩充效率和高斯卷积处理效率。
一种基于硬件电路的SIFT算法图像边界扩充方法,包括对邻近图像的左边界的像素点进行像素扩充,对邻近图像的右边界的像素点进行像素扩充,对邻近图像的上边界的像素点进行像素扩充,以及对邻近图像的下边界的像素点进行像素扩充,其中:所述对邻近图像的左边界的像素点进行像素扩充,具体包括如下步骤:读取行像素点时,从每行的第1个像素点开始向右移入第一寄存器,直到移入第一寄存器的像素点个数达到(R+K)为止,同时,从每行的第2个像素点开始向左移入第二寄存器,直到移入第二寄存器的像素点个数达到R为止,然后把第二寄存器中左端的(R+1-K)个像素点拼接至第一寄存器的右端,使得第一寄存器中存储的像素点个数达到(2R+1);所述对邻近图像的右边界的像素点进行像素扩充,具体包括如下步骤:读取行像素点时,从每行的倒数第(R+K)个像素点开始向右移入第一寄存器,直到移入第一寄存器的像素点个数达到(R+K)为止,同时,从每行的倒数第(R+1)个像素点开始向左移入第二寄存器,直到移入第二寄存器的像素点个数达到R为止,然后把第二寄存器中右端的(R+1-K)个像素点向右移入第一寄存器,使得第一寄存器中存储的像素点个数达到(2R+1);所述对邻近图像的上边界的像素点进行像素扩充,具体包括如下步骤:读取列像素点时,从每列的第1个像素点开始向右移入第一寄存器,直到移入第一寄存器的像素点个数达到(R+K)为止,同时,从每列的第2个像素点开始向左移入第二寄存器,直到移入第二寄存器的像素点个数达到R为止,然后把第二寄存器中左端的(R+1-K)个像素点拼接至第一寄存器的右端,使得第一寄存器中存储的像素点个数达到(2R+1);所述对邻近图像的下边界的像素点进行像素扩充,具体包括如下步骤:读取列像素点时,从每列的倒数第(R+K)个像素点开始向右移入第一寄存器,直到移入第一寄存器的像素点个数达到(R+K)为止,同时,从每列的倒数第(R+1)个像素点开始向左移入第二寄存器,直到移入第二寄存器的像素点个数达到R为止,然后把第二寄存器中右端的(R+1-K)个像素点向右移入第一寄存器,使得第一寄存器中存储的像素点个数达到(2R+1);所述邻近是指在距边界的行距离或者列距离为R个像素点的范围内;所述第一寄存器和第二寄存器为双向移位寄存器;所述R为高斯卷积核的半径长度;所述K为待进行高斯卷积运算的像素点在其所在行像素点或者列像素点中距离邻近的边界排列的位置,K为大于或等于1且小于或等于R的自然数。
进一步地,所述第一寄存器最多能够存储2R+1个像素点的数据,所述第二寄存器最多能够存储R个像素点的数据。
进一步地,所述R的值为16。
一种基于硬件电路的SIFT算法图像边界处理方法,包括对邻近图像的左边界的像素点进行高斯卷积处理,对邻近图像的右边界的像素点进行高斯卷积处理,对邻近图像的上边界的像素点进行高斯卷积处理,以及对邻近图像的下边界的像素点进行高斯卷积处理,其中:所述对邻近图像的左边界的像素点进行行高斯卷积处理,具体包括如下步骤:依次确定距左边界的行距离为R个像素点的范围内的像素点为待处理点;读取所述待处理点所在行的行像素点时,从该行的第1个像素点开始向右移入第一寄存器,直到移入第一寄存器的像素点个数达到(R+K)为止,同时,从该行的第2个像素点开始向左移入第二寄存器,直到移入第二寄存器的像素点个数达到R为止,然后把第二寄存器中左端的(R+1-K)个像素点拼接至第一寄存器的右端,使得第一寄存器中存储的像素点个数达到(2R+1);基于第一寄存器中存储的像素点,对所述待处理点进行行高斯卷积运算;所述对邻近图像的右边界的像素点进行高斯卷积处理,具体包括如下步骤:依次确定距右边界的行距离为R个像素点的范围内的像素点为待处理点;读取所述待处理点所在行的行像素点时,从该行的倒数第(R+K)个像素点开始向右移入第一寄存器,直到移入第一寄存器的像素点个数达到(R+K)为止,同时,从该行的倒数第(R+1)个像素点开始向左移入第二寄存器,直到移入第二寄存器的像素点个数达到R为止,然后把第二寄存器中右端的(R+1-K)个像素点向右移入第一寄存器,使得第一寄存器中存储的像素点个数达到(2R+1);基于第一寄存器中存储的像素点,对所述待处理点进行行高斯卷积运算;所述对邻近图像的上边界的像素点进行高斯卷积处理,具体包括如下步骤:依次确定距上边界的列距离为R个像素点的范围内的像素点为待处理点;读取所述待处理点所在列的列像素点时,从该列的第1个像素点开始向右移入第一寄存器,直到移入第一寄存器的像素点个数达到(R+K)为止,同时,从该列的第2个像素点开始向左移入第二寄存器,直到移入第二寄存器的像素点个数达到R为止,然后把第二寄存器中左端的(R+1-K)个像素点拼接至第一寄存器的右端,使得第一寄存器中存储的像素点个数达到(2R+1);基于第一寄存器中存储的像素点,对所述待处理点进行列高斯卷积运算;所述对邻近图像的下边界的像素点进行高斯卷积处理,具体包括如下步骤:依次确定距下边界的列距离为R个像素点的范围内的像素点为待处理点;读取所述待处理点所在列的列像素点时,从该列的倒数第(R+K)个像素点开始向右移入第一寄存器,直到移入第一寄存器的像素点个数达到(R+K)为止,同时,从该列的倒数第(R+1)个像素点开始向左移入第二寄存器,直到移入第二寄存器的像素点个数达到R为止,然后把第二寄存器中右端的(R+1-K)个像素点向右移入第一寄存器,使得第一寄存器中存储的像素点个数达到(2R+1);基于第一寄存器中存储的像素点,对所述待处理点进行列高斯卷积运算;所述第一寄存器和第二寄存器为双向移位寄存器;所述R为高斯卷积核的半径长度;所述K为待处理点在其所在行像素点或者所在列像素点中距离邻近的边界排列的位置,K为大于或等于1且小于或等于R的自然数。
进一步地,所述第一寄存器最多能够存储2R+1个像素点的数据,所述第二寄存器最多能够存储R个像素点的数据。
进一步地,所述R的值为16。
本发明的有益效果在于:把一个二维高斯卷积函数分解为两个一维高斯卷积函数乘积,即采用行高斯卷积和列高斯卷积级联来达到滤波目的,这样做有利于硬件电路并行架构实现,节省硬件资源。在做行高斯卷积时需要用到左、右边界扩充像素,在做列高斯卷积时需要用到上、下边界扩充像素。而硬件电路实现图像边界扩充的技术关键点在于,如何在计算高斯卷积时获取所需的边界扩充镜像映射像素。本发明在对图像边界的像素点做高斯卷积时,通过采用反向双移位寄存器法,把需要填充到边界的像素点同时分别反方向移入到2个移位寄存器,由于移入的方向不同,第二寄存器中存放的像素点顺序为第一寄存器的逆序,即获得以图像边界像素点为中心的镜像映射像素。其中,第一寄存器可存放L=2R+1个像素,即可以存放计算一个像素点高斯卷积时用到的所有像素点。第二寄存器可存放R个像素,即可以存放一个像素点边界扩充所需的所有像素点。整个处理过程只需要读取一次数据,就可以获取到所需要的镜像数据,数据读取效率很高,并且整个镜像过程只需要进行寄存器数据的存取,相比现有的软件计算方式,不仅节省了运算资源,而且数据处理效率也大大提升。
附图说明
图1为本发明所述基于硬件电路的SIFT算法图像边界扩充方法中对邻近图像的左边界的像素点进行像素扩充方法的流程示意图。
图2为本发明实施例所述图像边界扩充的扩充效果示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行详细描述。应当理解,下面所描述的具体实施例仅用于解释本发明,并不用于限定本发明。本领域的普通技术人员可以在没有一些具体细节的情况下实施实施例。例如,某些电路可以采用电路框图表示,避免实施例方案在不必要的细节描述中变得冗余和繁杂。为了不混淆实施例,可以不详细显示公知的电路、结构和技术细节。
一种基于硬件电路的SIFT算法图像边界扩充方法,该方法可以由视觉机器人中的主控芯片或者专用图像处理芯片执行。为了便于描述,后续实施例中会直接将该图像边界扩充方法的执行主体表述为机器人。所述SIFT算法是现有图像处理技术中已公开的算法,SIFT即指尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。所述图像是由很多的像素点构成的,按排列方式可以分为行像素点和列像素点。一幅图像中包含像素点的多少,取决于图像的分辨率,图像分辨率越大,包含的像素点越多,而图像分辨率的大小则由机器人的图像传感器的配置决定的,一般为640*480 pt、1024*768 pt或者1920*1080 pt,等等。其中,640、1024和1920就表示图像分辨率的宽度值,即一行像素点中包含的像素点个数,简单理解就是图像的水平方向的长度;480、768和1080就表示图像分辨率的高度值,即一列像素点中包含的像素点个数,简单理解就是图像的竖直方向的长度。
所述图像边界扩充方法包括对邻近图像的左边界的像素点进行像素扩充,对邻近图像的右边界的像素点进行像素扩充,对邻近图像的上边界的像素点进行像素扩充,以及对邻近图像的下边界的像素点进行像素扩充。这些步骤可以同时进行,也可以分步进行,具体根据处理器的系统结构和所采用的图像处理技术进行选择。如图2所示,位于图2中部的图像的分辨率为M*N,M为图像中每行像素点中所包含的像素点的个数,N为每列像素点中所包含的像素点的个数,每个小方格表示一个像素点,比如Y1,1标示的小方格表示图像中位于第1行第1列的像素点,Y1,2标示的小方格表示图像中位于第1行第2列的像素点,Y1,3标示的小方格表示图像中位于第1行第3列的像素点,Y1,M-1标示的小方格表示图像中位于第1行第M-1列的像素点,Y1,M标示的小方格表示图像中位于第1行第M列的像素点,Y2,1标示的小方格表示图像中位于第2行第1列的像素点,YN,1标示的小方格表示图像中位于第N行第1列的像素点,等等。其中,Y1,1至YN,1一共N个像素点,为最接近图像左边界的像素点。Y1,1至YN,1、Y1,2至YN,2、Y1,3至YN,3……Y1,1至YN,R,一共R列像素点,作为邻近图像的左边界的像素点,针对这些像素点进行行高斯卷积运算时,需要进行像素扩充。位于所述图像的第1列像素点(即像素点Y1,1至YN,1)左侧的一共N行R列的像素点就是进行像素扩充后的像素分布示意图。这些扩充的像素点是以镜像对称的方式排布的,即以图像的第1列像素点为对称轴,其左侧第一列的像素点与其右侧第一列的像素点相同,其左侧第二列的像素点与其右侧第二列的像素点相同,其左侧第R列的像素点与其右侧第R列的像素点相同。所述对邻近图像的右边界的像素点进行像素扩充,所述对邻近图像的上边界的像素点进行像素扩充,以及所述对邻近图像的下边界的像素点进行像素扩充,其具体的原理和效果与上述对邻近图像的左边界的像素点进行像素扩充的原理和效果近似,此处不再赘述。需要说明的是,图2所示状态只是为了便于说明图像扩充的效果,并不是体现具体的扩充过程或者扩充方法。
具体的,如图1所示,所述对邻近图像的左边界的像素点进行像素扩充,具体包括如下步骤:机器人在读取图像的行像素点时,一边读取,一边把像素点存入第一寄存器,从每行的第1个像素点开始向右移入第一寄存器,直到移入第一寄存器的像素点个数达到(R+K)为止。所述R为高斯卷积核的半径长度;所述K为待进行高斯卷积运算的像素点在其所在行像素点中距离邻近的边界排列的位置,也就是从左边界的每行的第1个像素点开始算起,第K个像素点需要进行高斯卷积运算。在把读取的像素点存入第一寄存器的同时,机器人还把读取的像素点中,从每行的第2个像素点开始的像素点,向左移入第二寄存器,直到移入第二寄存器的像素点个数达到R为止。由于像素点移入第一寄存器的方向与移入第二寄存器的方向相反,所以,第二寄存器中像素点为第一寄存器的逆序。然后把第二寄存器中左端的(R+1-K)个像素点拼接至第一寄存器的右端,该拼接是把第二寄存器中左端的(R+1-K)个像素点向左移入第一寄存器,移入的过程不影响第一寄存器中已存储的向右移入的像素点。拼接完成后,第一寄存器中存储的像素点的个数为(R+K)+(R+1-K)=(2R+1)=L(L为高斯卷积核长度)。此时,根据第一寄存器中存储的像素点,就可以进行该第K个像素点的行高斯卷积运算。通过采用这种方式,就可以实现对每个邻近图像的左边界的像素点进行像素扩充,以获得该像素点进行高斯卷积运算所需的其它像素数据。
以图2中的像素点Y1,3为例,该像素点是图像中第1行第3列的像素点,也就是第K=3个像素点,是邻近图像左边界的像素点,对其进行高斯卷积运算时,需要进行像素扩充。假设R的值为8。首先,机器人读取第1行的像素点,依次读取Y1,1、Y1,2、Y1,3、Y1,4、Y1,5、Y1,6、Y1,7、Y1,8、Y1,9、Y1,10和Y1,11,并一边读取一边向右移入第一寄存器,则存入第一寄存器的像素点从左至右的顺序为Y1,11、Y1,10、Y1,9、Y1,8、Y1,7、Y1,6、Y1,5、Y1,4、Y1,3、Y1,2、Y1,1。同时,机器人将读取的Y1,2、Y1,3、Y1,4、Y1,5、Y1,6、Y1,7、Y1,8、Y1,9向左移入第二寄存器。然后,机器人将第二寄存器中的左端的8+1-3=6个像素点拼接至第一寄存器的右端,最后得到第一寄存器的像素点从左至右的顺序为Y1,11、Y1,10、Y1,9、Y1,8、Y1,7、Y1,6、Y1,5、Y1,4、Y1,3、Y1,2、Y1,1、Y1,2、Y1,3、Y1,4、Y1,5、Y1,6、Y1,7,此时,就可以采用这些像素点进行Y1,3的行高斯卷积运算。
具体的,与上述左边界的像素扩充近似,所述对邻近图像的右边界的像素点进行像素扩充,具体包括如下步骤:机器人在读取图像的行像素点时,一边读取,一边把像素点存入第一寄存器。当机器人读取到邻近图像的右边界的像素点时,从每行的倒数第(R+K)个像素点开始向右移入第一寄存器,直到移入第一寄存器的像素点个数达到(R+K)为止。所述R为高斯卷积核的半径长度;所述K为待进行高斯卷积运算的像素点在其所在行像素点中距离邻近的边界排列的位置,也就是从每行的倒数第1个像素点开始算起,倒数第K个像素点需要进行高斯卷积运算。在把读取的像素点存入第一寄存器的同时,机器人还把读取的像素点中,从每行的倒数第(R+1)个像素点开始向左移入第二寄存器,直到移入第二寄存器的像素点个数达到R为止。由于像素点移入第一寄存器的方向与移入第二寄存器的方向相反,所以,第二寄存器中像素点为第一寄存器的逆序。然后把第二寄存器中右端的(R+1-K)个像素点向右移入第一寄存器,使得第一寄存器中存储的像素点个数为(R+K)+(R+1-K)=(2R+1)=L(L为高斯卷积核长度)。此时,根据第一寄存器中存储的像素点,就可以进行该倒数第K个像素点的行高斯卷积运算。通过采用这种方式,就可以实现对每个邻近图像的右边界的像素点进行像素扩充,以获得该像素点进行高斯卷积运算所需的其它像素数据。
以图2中的像素点Y2,M为例,假设M=100,则Y2,M= Y2,100,该像素点是图像中第2行第100列的像素点,是靠近图像右边界的倒数第1个像素点,也就是倒数第K=1个像素点,机器人对其进行高斯卷积运算时,需要进行像素扩充。假设R的值为8。首先,机器人依次读取第2行的像素点,并一边读取一边向右移入第一寄存器,当机器人读取到倒数第R+K=8+1=9个像素点Y2,92时,机器人继续将读取的像素点向右移入第一寄存器,直到像素点Y2,100也移入第一寄存器,则存入第一寄存器的像素点从左至右的顺序为Y2,100、Y2,99、Y2,98、Y2,97、Y2,96、Y2,95、Y2,94、Y2,93、Y2,92。同时,机器人将读取的倒数第R+1=9个像素点开始向左移入第二寄存器,则存入第二寄存器的像素点从左至右的顺序为Y2,92、Y2,93、Y2,94、Y2,95、Y2,96、Y2,97、Y2,98、Y2,99。然后,机器人将第二寄存器中的右端的R+1-K =8+1-1=8个像素点向右移入第一寄存器,最后得到第一寄存器的像素点从左至右的顺序为Y2,92、Y2,93、Y2,94、Y2,95、Y2,96、Y2,97、Y2,98、Y2,99、Y2,100、Y2,99、Y2,98、Y2,97、Y2,96、Y2,95、Y2,94、Y2,93、Y2,92,此时,就可以采用这些像素点进行Y2,100的行高斯卷积运算。
具体的,所述对邻近图像的上边界的像素点进行像素扩充,具体包括如下步骤:机器人进行列高斯卷积运算时,需要以列顺序读取像素点。在读取列像素点时,机器人从每列的第1个像素点开始向右移入第一寄存器,直到移入第一寄存器的像素点个数达到(R+K)为止。同时,机器人还会在读取的像素点中,从每列的第2个像素点开始向左移入第二寄存器,直到移入第二寄存器的像素点个数达到R为止。由于像素点移入第一寄存器的方向与移入第二寄存器的方向相反,所以,第二寄存器中像素点为第一寄存器的逆序。然后把第二寄存器中左端的(R+1-K)个像素点拼接至第一寄存器的右端,该拼接是把第二寄存器中左端的(R+1-K)个像素点向左移入第一寄存器,移入的过程不影响第一寄存器中已存储的向右移入的像素点。拼接完成后,第一寄存器中存储的像素点的个数为(R+K)+(R+1-K)=(2R+1)=L(L为高斯卷积核长度)。此时,根据第一寄存器中存储的像素点,就可以进行该第K个像素点的列高斯卷积运算。通过采用这种方式,就可以实现对每个邻近图像的上边界的像素点进行像素扩充,以获得该像素点进行列高斯卷积运算所需的其它像素数据。
以图2中的像素点Y2,2为例(图中未示出该像素点),该像素点是图像中第2行第2列的像素点,也就是第K=2个像素点,是邻近图像上边界的像素点,对其进行列高斯卷积运算时,需要进行像素扩充。假设R的值为8。首先,机器人读取第2列的像素点,依次读取Y1,2、Y2,2、Y3,2、Y4,2、Y5,2、Y6,2、Y7,2、Y8,2、Y9,2和Y10,2,并一边读取一边向右移入第一寄存器,则存入第一寄存器的像素点从左至右的顺序为Y10,2、Y9,2、Y8,2、Y7,2、Y6,2、Y5,2、Y4,2、Y3,2、Y2,2、Y1,2。同时,机器人将读取的Y2,2、Y3,2、Y4,2、Y5,2、Y6,2、Y7,2、Y8,2、Y9,2向左移入第二寄存器,则第二寄存器中的像素点从左至右的顺序为Y2,2、Y3,2、Y4,2、Y5,2、Y6,2、Y7,2、Y8,2、Y9,2。然后,机器人将第二寄存器中的左端的8+1-2=7个像素点拼接至第一寄存器的右端,最后得到第一寄存器的像素点从左至右的顺序为Y10,2、Y9,2、Y8,2、Y7,2、Y6,2、Y5,2、Y4,2、Y3,2、Y2,2、Y1,2、Y2,2、Y3,2、Y4,2、Y5,2、Y6,2、Y7,2、Y8,2,此时,就可以采用这些像素点进行Y2,2的列高斯卷积运算。
具体的,所述对邻近图像的下边界的像素点进行像素扩充,具体包括如下步骤:机器人读取列像素点,当需要对邻近下边界的像素点进行像素扩充时,从每列的倒数第(R+K)个像素点开始向右移入第一寄存器,直到移入第一寄存器的像素点个数达到(R+K)为止,同时,从每列的倒数第(R+1)个像素点开始向左移入第二寄存器,直到移入第二寄存器的像素点个数达到R为止,然后把第二寄存器中右端的(R+1-K)个像素点向右移入第一寄存器,使得第一寄存器中存储的像素点个数达到(2R+1)。
以图2中的像素点YN,1为例,假设N=100,则YN,1= Y100,1,该像素点是图像中第100行第1列的像素点,是靠近图像下边界的倒数第1个像素点,也就是倒数第K=1个像素点,机器人对其进行列高斯卷积运算时,需要进行像素扩充。假设R的值为8。首先,机器人依次读取第1列的像素点,并一边读取一边向右移入第一寄存器,当机器人读取到倒数第R+K=8+1=9个像素点Y92,1时,机器人继续将读取的像素点向右移入第一寄存器,直到像素点Y100,1也移入第一寄存器,则存入第一寄存器的像素点从左至右的顺序为Y100,1、Y99,1、Y98,1、Y97,1、Y96,1、Y95,1、Y94,1、Y93,1、Y92,1。同时,机器人将读取的倒数第R+1=9个像素点开始向左移入第二寄存器,则存入第二寄存器的像素点从左至右的顺序为Y92,1、Y93,1、Y94,1、Y95,1、Y96,1、Y97,1、Y98,1、Y99,1。然后,机器人将第二寄存器中的右端的R+1-K =8+1-1=8个像素点向右移入第一寄存器,最后得到第一寄存器的像素点从左至右的顺序为Y92,1、Y93,1、Y94,1、Y95,1、Y96,1、Y97,1、Y98,1、Y99,1、Y100,1、Y99,1、Y98,1、Y97,1、Y96,1、Y95,1、Y94,1、Y93,1、Y92,1,此时,就可以采用这些像素点进行Y100,1的列高斯卷积运算。
上述实施例中,在距边界的行距离或者列距离为R个像素点(包括R)的范围内像素点,就属于与边界邻近的像素点。上述第一寄存器和第二寄存器为双向移位寄存器。K为大于或等于1且小于或等于R的自然数。
以上实施例通过根据高斯卷积具有线性可分的性质,把一个二维高斯卷积函数分解为两个一维高斯卷积函数乘积,即采用行高斯卷积和列高斯卷积级联来达到滤波目的,这样做有利于硬件电路并行架构实现,节省硬件资源。在做行高斯卷积时需要用到左、右边界扩充像素,在做列高斯卷积时需要用到上、下边界扩充像素。而硬件电路实现图像边界扩充的技术关键点在于,如何在计算高斯卷积时获取所需的边界扩充镜像映射像素。本实施例在对图像边界的像素点做边界像素扩充时,通过采用反向双移位寄存器法,把需要填充到边界的像素点同时分别反方向移入到2个移位寄存器,由于移入的方向不同,第二寄存器中存放的像素点顺序为第一寄存器的逆序,即获得以图像边界像素点为中心的镜像映射像素。其中,第一寄存器可存放L=2R+1个像素,即可以存放计算一个像素点高斯卷积时用到的所有像素点。第二寄存器可存放R个像素,即可以存放一个像素点边界扩充所需的所有像素点。整个处理过程只需要读取一次数据,就可以获取到所需要的镜像数据,像素扩充的效率很高。
为了保证最优性价比,所述第一寄存器最多能够存储2R+1个像素点的数据,所述第二寄存器最多能够存储R个像素点的数据,如果能够刚好满足高斯卷积运算的需求,又不好造成存储资源的浪费。
作为其中一种实施方式,所述R的值为16,则机器人进行高斯卷积运算的高斯卷积核长度为2*16+1=33。
一种基于硬件电路的SIFT算法图像边界处理方法,包括对邻近图像的左边界的像素点进行高斯卷积处理,对邻近图像的右边界的像素点进行高斯卷积处理,对邻近图像的上边界的像素点进行高斯卷积处理,以及对邻近图像的下边界的像素点进行高斯卷积处理。
假定L=高斯卷积核长度,R=高斯卷积核半径,则R=(L-1)/2。因为每个像素点在进行高斯卷积行计算时,需要用到该点左右两边高斯卷积核半径长度R的像素点,总共L个像素点。所以,对图像进行边界扩充时,对上、下边界需要扩充R行像素点,对左、右边界需要扩充R列像素点。如图2所示,对分辨率为MxN的图像像进行边界扩充(M列,N行)。对上边界进行扩充时,以首行像素为对称轴,将第2行到第(R+1)行像素点进行镜像映射填充到图像上边界,填充图像大小为MxR(M列,R行);对下边界进行扩充时,以末行像素点为对称轴,将第(N-1)行到第(N-R)行像素点进行镜像映射填充到图像下边界,填充图像大小为MxR(M列,R行);对左边界进行扩充时,以首列像素为对称轴,将第2列到第(R+1)列像素点进行镜像映射填充到图像左边界,填充图像大小为RxN(R列,N行);对右边界进行扩充时,以末列像素为对称轴,将第(M-1)列到第(M-R)列像素点进行镜像映射填充到图像右边界,填充图像大小为RxN(R列,N行)。
具体的,所述对邻近图像的左边界的像素点进行行高斯卷积处理,具体包括如下步骤:依次确定距左边界的行距离为R个像素点的范围内的像素点为待处理点;读取所述待处理点所在行的行像素点时,从该行的第1个像素点开始向右移入第一寄存器,直到移入第一寄存器的像素点个数达到(R+K)为止,同时,从该行的第2个像素点开始向左移入第二寄存器,直到移入第二寄存器的像素点个数达到R为止,然后把第二寄存器中左端的(R+1-K)个像素点拼接至第一寄存器的右端,使得第一寄存器中存储的像素点个数达到(2R+1);基于第一寄存器中存储的像素点,对所述待处理点进行行高斯卷积运算。至于具体的行高斯卷积运算方法,现有技术已有公开,此处不再赘述。
以图2中的像素点Y1,3为例,确定Y1,3作为待处理点。该像素点是图像中第1行第3列的像素点,也就是第K=3个像素点,是邻近图像左边界的像素点,对其进行高斯卷积运算时,需要进行像素扩充。假设R的值为8。首先,机器人读取第1行的像素点,依次读取Y1,1、Y1,2、Y1,3、Y1,4、Y1,5、Y1,6、Y1,7、Y1,8、Y1,9、Y1,10和Y1,11,并一边读取一边向右移入第一寄存器,则存入第一寄存器的像素点从左至右的顺序为Y1,11、Y1,10、Y1,9、Y1,8、Y1,7、Y1,6、Y1,5、Y1,4、Y1,3、Y1,2、Y1,1。同时,机器人将读取的Y1,2、Y1,3、Y1,4、Y1,5、Y1,6、Y1,7、Y1,8、Y1,9向左移入第二寄存器。然后,机器人将第二寄存器中的左端的8+1-3=6个像素点拼接至第一寄存器的右端,最后得到第一寄存器的像素点从左至右的顺序为Y1,11、Y1,10、Y1,9、Y1,8、Y1,7、Y1,6、Y1,5、Y1,4、Y1,3、Y1,2、Y1,1、Y1,2、Y1,3、Y1,4、Y1,5、Y1,6、Y1,7。最后,采用这些像素点进行待处理点Y1,3的行高斯卷积运算。
具体的,所述对邻近图像的右边界的像素点进行高斯卷积处理,具体包括如下步骤:依次确定距右边界的行距离为R个像素点的范围内的像素点为待处理点;读取所述待处理点所在行的行像素点时,从该行的倒数第(R+K)个像素点开始向右移入第一寄存器,直到移入第一寄存器的像素点个数达到(R+K)为止,同时,从该行的倒数第(R+1)个像素点开始向左移入第二寄存器,直到移入第二寄存器的像素点个数达到R为止,然后把第二寄存器中右端的(R+1-K)个像素点向右移入第一寄存器,使得第一寄存器中存储的像素点个数达到(2R+1);基于第一寄存器中存储的像素点,对所述待处理点进行行高斯卷积运算。
以图2中的像素点Y2,M为例,假设M=100,则Y2,M= Y2,100,确定Y2,100为待处理点。该像素点是图像中第2行第100列的像素点,是靠近图像右边界的倒数第1个像素点,也就是倒数第K=1个像素点,机器人对其进行高斯卷积运算时,需要进行像素扩充。假设R的值为8。首先,机器人依次读取第2行的像素点,并一边读取一边向右移入第一寄存器,当机器人读取到倒数第R+K=8+1=9个像素点Y2,92时,机器人继续将读取的像素点向右移入第一寄存器,直到像素点Y2,100也移入第一寄存器,则存入第一寄存器的像素点从左至右的顺序为Y2,100、Y2,99、Y2,98、Y2,97、Y2,96、Y2,95、Y2,94、Y2,93、Y2,92。同时,机器人将读取的倒数第R+1=9个像素点开始向左移入第二寄存器,则存入第二寄存器的像素点从左至右的顺序为Y2,92、Y2,93、Y2,94、Y2,95、Y2,96、Y2,97、Y2,98、Y2,99。然后,机器人将第二寄存器中的右端的R+1-K =8+1-1=8个像素点向右移入第一寄存器,最后得到第一寄存器的像素点从左至右的顺序为Y2,92、Y2,93、Y2,94、Y2,95、Y2,96、Y2,97、Y2,98、Y2,99、Y2,100、Y2,99、Y2,98、Y2,97、Y2,96、Y2,95、Y2,94、Y2,93、Y2,92。最后,采用这些像素点进行待处理点Y2,100的行高斯卷积运算。
具体的所述对邻近图像的上边界的像素点进行高斯卷积处理,具体包括如下步骤:依次确定距上边界的列距离为R个像素点的范围内的像素点为待处理点;读取所述待处理点所在列的列像素点时,从该列的第1个像素点开始向右移入第一寄存器,直到移入第一寄存器的像素点个数达到(R+K)为止,同时,从该列的第2个像素点开始向左移入第二寄存器,直到移入第二寄存器的像素点个数达到R为止,然后把第二寄存器中左端的(R+1-K)个像素点拼接至第一寄存器的右端,使得第一寄存器中存储的像素点个数达到(2R+1);基于第一寄存器中存储的像素点,对所述待处理点进行列高斯卷积运算。
以图2中的像素点Y2,2为例(图中未示出该像素点),确定Y2,2为待处理点。该像素点是图像中第2行第2列的像素点,也就是第K=2个像素点,是邻近图像上边界的像素点,对其进行列高斯卷积运算时,需要进行像素扩充。假设R的值为8。首先,机器人读取第2列的像素点,依次读取Y1,2、Y2,2、Y3,2、Y4,2、Y5,2、Y6,2、Y7,2、Y8,2、Y9,2和Y10,2,并一边读取一边向右移入第一寄存器,则存入第一寄存器的像素点从左至右的顺序为Y10,2、Y9,2、Y8,2、Y7,2、Y6,2、Y5,2、Y4,2、Y3,2、Y2,2、Y1,2。同时,机器人将读取的Y2,2、Y3,2、Y4,2、Y5,2、Y6,2、Y7,2、Y8,2、Y9,2向左移入第二寄存器,则第二寄存器中的像素点从左至右的顺序为Y2,2、Y3,2、Y4,2、Y5,2、Y6,2、Y7,2、Y8,2、Y9,2。然后,机器人将第二寄存器中的左端的8+1-2=7个像素点拼接至第一寄存器的右端,最后得到第一寄存器的像素点从左至右的顺序为Y10,2、Y9,2、Y8,2、Y7,2、Y6,2、Y5,2、Y4,2、Y3,2、Y2,2、Y1,2、Y2,2、Y3,2、Y4,2、Y5,2、Y6,2、Y7,2、Y8,2。最后,采用这些像素点进行待处理点Y2,2的列高斯卷积运算。
具体的,所述对邻近图像的下边界的像素点进行高斯卷积处理,具体包括如下步骤:依次确定距下边界的列距离为R个像素点的范围内的像素点为待处理点;读取所述待处理点所在列的列像素点时,从该列的倒数第(R+K)个像素点开始向右移入第一寄存器,直到移入第一寄存器的像素点个数达到(R+K)为止,同时,从该列的倒数第(R+1)个像素点开始向左移入第二寄存器,直到移入第二寄存器的像素点个数达到R为止,然后把第二寄存器中右端的(R+1-K)个像素点向右移入第一寄存器,使得第一寄存器中存储的像素点个数达到(2R+1);基于第一寄存器中存储的像素点,对所述待处理点进行列高斯卷积运算。
以图2中的像素点YN,1为例,假设N=100,则YN,1= Y100,1,确定Y100,1作为待处理点。该像素点是图像中第100行第1列的像素点,是靠近图像下边界的倒数第1个像素点,也就是倒数第K=1个像素点,机器人对其进行列高斯卷积运算时,需要进行像素扩充。假设R的值为8。首先,机器人依次读取第1列的像素点,并一边读取一边向右移入第一寄存器,当机器人读取到倒数第R+K=8+1=9个像素点Y92,1时,机器人继续将读取的像素点向右移入第一寄存器,直到像素点Y100,1也移入第一寄存器,则存入第一寄存器的像素点从左至右的顺序为Y100,1、Y99,1、Y98,1、Y97,1、Y96,1、Y95,1、Y94,1、Y93,1、Y92,1。同时,机器人将读取的倒数第R+1=9个像素点开始向左移入第二寄存器,则存入第二寄存器的像素点从左至右的顺序为Y92,1、Y93,1、Y94,1、Y95,1、Y96,1、Y97,1、Y98,1、Y99,1。然后,机器人将第二寄存器中的右端的R+1-K =8+1-1=8个像素点向右移入第一寄存器,最后得到第一寄存器的像素点从左至右的顺序为Y92,1、Y93,1、Y94,1、Y95,1、Y96,1、Y97,1、Y98,1、Y99,1、Y100,1、Y99,1、Y98,1、Y97,1、Y96,1、Y95,1、Y94,1、Y93,1、Y92,1。最后采用这些像素点进行待处理点Y100,1的列高斯卷积运算。
上述实施例所述的第一寄存器和第二寄存器为双向移位寄存器。所述R为高斯卷积核的半径长度。所述K为待处理点在其所在行像素点或者所在列像素点中距离邻近的边界排列的位置。K为大于或等于1且小于或等于R的自然数。
以上实施例通过根据高斯卷积具有线性可分的性质,把一个二维高斯卷积函数分解为两个一维高斯卷积函数乘积,即采用行高斯卷积和列高斯卷积级联来达到滤波目的,这样做有利于硬件电路并行架构实现,节省硬件资源。在做行高斯卷积时需要用到左、右边界扩充像素,在做列高斯卷积时需要用到上、下边界扩充像素。而硬件电路实现图像边界扩充的技术关键点在于,如何在计算高斯卷积时获取所需的边界扩充镜像映射像素。本发明在对图像边界的像素点做高斯卷积时,通过采用反向双移位寄存器法,把需要填充到边界的像素点同时分别反方向移入到2个移位寄存器,由于移入的方向不同,第二寄存器中存放的像素点顺序为第一寄存器的逆序,即获得以图像边界像素点为中心的镜像映射像素。其中,第一寄存器可存放L=2R+1个像素,即可以存放计算一个像素点高斯卷积时用到的所有像素点。第二寄存器可存放R个像素,即可以存放一个像素点边界扩充所需的所有像素点。整个处理过程只需要读取一次数据,就可以获取到所需要的镜像数据,数据读取效率很高,并且整个镜像过程只需要进行寄存器数据的存取,相比现有的软件计算方式,不仅节省了运算资源,而且数据处理效率也大大提升。
为了保证最优性价比,所述第一寄存器最多能够存储2R+1个像素点的数据,所述第二寄存器最多能够存储R个像素点的数据,如果能够刚好满足高斯卷积运算的需求,又不好造成存储资源的浪费。
作为其中一种实施方式,所述R的值为16,则机器人进行高斯卷积运算的高斯卷积核长度为2*16+1=33。
本领域技术人员可以理解实现上述实施方式方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序存储在一个存储介质中,包括若干指令用以使得单片机、芯片或处理器(processor)执行本发明各个实施方式所述方法的全部或部分步骤。而这些存储介质可以包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
另外需要说明的是,在上述具体实施方式中所描述的各个具体技术特征,在不矛盾的情况下,可以通过任何合适的方式进行组合。为了避免不必要的重复,本发明实施方式对各种可能的组合方式不再另行说明。