新闻  |   论坛  |   博客  |   在线研讨会
自动视觉系统识别路标――在C语言和汇编程序中执行Sobel滤波器
lulu888 | 2009-06-24 06:55:16    阅读:2462   发布文章

汽车行业对于带摄像头式驾驶协助系统的需求日益增长。交通信号识别可以提高司机和乘客的安全性,因而日益受到人们的关注。在可以应用到汽车和工业设计多个领域的图像识别技术中,交通信号识别技术就是其中的一种。

交通信号识别技术采用了机器视觉专家们最擅长的图案识别算法。本系列文章的前部分详细讲述了一套采用Blackfin处理器的摄像头式交通信号识别系统;Blackfin是一款来自模拟器件公司的低功耗、低成本的嵌入式DSP。这些配置展示了一套高效率软件架构的设计,以及如何使用一个滤波器块算法来执行交通信号识别应用。

本章节讨论了如何利用一个采用Blackfin处理器的摄像头式交通信号识别系统来以各种方式执行Sobel边缘检测滤波器。随后我们对结果进行了对比,并讲述了实现现有处理功能最佳利用的步骤。

Sobel滤波器

Sobel滤波器一般都被配置在一个处理链路的前端。计算结果显示了边缘及其方向(向量)的量值。这是通过一个二维卷积完成的。图1展示了一个典型卷积的工作。比如,为了计算G22值,将一个3 x 3滤波器矩阵H放在输入图象F上,矩阵H的每个点分别和一个图象数值相乘然后累计。3 x 3滤波器矩阵H在整个图象上移动,来从所有其它图象数值中计算出G值。等式1展示了一个卷积的工作。


图1:二维卷积。


等式1:二维卷积。

一个二维卷积包含了九个乘积的总和。对于Sobel滤波器,每个图象值必须执行两个卷积,一个是针对横向Gx上的边缘,另一个针对是纵向Gy上的边缘。边缘Gxy的实际量值和实际角度Theta可以从结果中得出。图1展示了Sobel运算符号。等式2和等式3展示了执行矩阵数值得出的计算。


图2:Sobel运算符号。


等式2:卷积Gx。


等式3:卷积Gy。

由于Sobel算符在矩阵中有多个0,乘机的数量可以减少。上面的等式2和等式3显示,只需要6次乘积。由于Sobel算符的矩阵以数值1占据了一些位置,此处不需要乘积。只有数值2那些位置需要考虑乘积。另外还可以通过将数值1快速移到左边来实现这一点。每个边缘的量值是通过Gx和Gy的几何加法来计算的。得出的向量通过下面的等式显示出了这一点:

等式4: 几何数量。
等式4: 几何数量。

向量的角度也可以计算出来:


等式5:边缘方向。

在下一部分,我们以不同方法进行了Gx和Gy的卷积,并展示了所需的计算周期。

采用C语言的标准Sobel

在这一部分,等式1和等式2 被直接执行。外部存储器图象的一个区域(192 x 256 x 8 位)被逐线读取,并传输到内部存储器上。如今,存储器(3 x 192 x 16 位)里已经有所需16位宽区域的三条线,可以开始计算了。与此同时,第四条线会被传输到内部存储器,这是计算第二条线所必需的。由于每根线都被跑出,通过这种方法可以逐一传输并计算各条线。由于这些线条不会被多次复制到存储器中,指示器常常会被重新计算。图5展示了存储器分页和指示器a、b和c的过程。


图4:通过DMA信道传输一个区域图象。


图5:每根线处理期间的存储器分页。

下面列表1中的程序编码展示了卷积的执行方式。变量a、b和c这项每根相关的线。计算出的结果Gx和Gy被列在表格中。


列表1:Sobel的标准执行。

因为系数是直接编码到等式中的,所以只有要获得图象数据才需要访问内存。因此,获取图象数据而访问内存,不会和系数矩阵的访问竞争。此外,第一部分的一些运算,是适合第二部分中的一些运算的。

编辑器可以识别这些重复,并减少运算的次数。图6展示了编辑器必须发到汇编程序的语句。FOR环已经被一个硬件回路(address 0xFFA02744)替代。


图6:编辑器语句标准执行。

这展示出来对于管线式处理器的一个巨大优势。回路中的语句被自动移动到管线里,不需分配任何处罚周期。0xFFA02748-0xFFA0279E这个地址范围内的所有语句都在硬件回路内。但是可以看到,由于每个语句线只有一个数学运算执行,因此并没有达到最大的语句宽度。其原因来自数据安排。当同时有两个减法/加法运算时,内存数据必须在加载时互相直接靠近(r6=r2+|+r3;执行双加法运算时的语句)。若非如此,就需要由额外的语句来执行这个功能。

有些语句线包含NOP语句。这些线并没有装满最大语句,因为在这些位置不能存储任何有利的语句。另外,通过替换也可以完成乘法。要计算一条包含192个象素的线,需要2765个周期。计算一条包含256个象素的线,需要3857个周期。

采用3 x 3卷积的Sobel滤波器

下面两个变量就是基于典型的卷积概念。在此,矩阵的每个点都和一个象素相乘。两个拥有所需数值的矩阵(Hx和Hy)被存放在存储器中。其优势在于替换型滤波器的矩阵可交换性。在此例中,如前一变量(3 x 256 x 16位)所述,数据是按列的形式读取的,而不是按线的形式。这让数据可以被置于线性表格中。图7展示了存储器分页情况。和所有变量一样,DMA通道获得数据并传输到内部存储器。此时矩阵被从图象数据的顶部移动到底部。


图7:列处理。

列表2展示了执行的C代码。内部回路有两次运算。每次运算代表一个卷积,一个卷积用于两个不同的卷积矩阵中。由于每个DMA通道那的数据线性安排,卷积能以1为地址增量来进行。这更适合Blackfin处理器的架构。在内部回路9次重复之后,外部回路必须以3执行一次地址现实化。这样确保了每个矩阵沿着一根线向下移动。


列表2:二维卷积。

这次编辑器生成了两个和C代码相似的硬件回路。内部回路包含了在0xFFA029C0- 0xFFA029E4之间的语句。该回路随后被执行8次(参考计数器P5)。第9次就在该回路之下执行了。

可惜的是,编辑器不能考虑数据的独立性。这样造成内部回路需要多个语句才能执行计算。但是,这样无法利用在语句线可以执行两次运算的优势,而是在每个情况下只能有一个数据被并行导入到一个算法语句中。这是由于数据可能会彼此依赖所造成的。外部回路包含了0xFFA029A4-0xFFA02A12之间的语句,并自己重复256次(参考计数器P2)。因此,内部回路中的额外语句,和内部与外部回路之间的语句,就会相乘大得出一个量很大的处理器周期。所以,要在这一范围执行一个卷积,需要至少18958个周期。


图8:一个典型卷积的编辑器输出。

借助两个编辑器Pragma,编辑器被告知没有数据关联存在((#pragma no_alias),所有计算都可以并行执行(#pragma vector_for)。另外,矩阵也被嵌套(SobelMatXY[])。只有一个带有属于矩阵x和矩阵y的数值的表格存在。一次访问内存就可获得这两个数值。

列表3: 数据优化型二维卷积。
列表3: 数据优化型二维卷积。

从图9中可以看到,内部回路只执行0xFFA029C8之后的语句。编辑器可以最大化地将所有运算并行,但只有用于运算预处理和后处理的语句会被保留下来。该执行需要7438个周期。尽管只改进了2.5倍,C语言中的标准Sobel仍显示出更好的结果。这是由于消除了冗余运算,并利用了Gx和Gy的协同作用;这是在标准卷积中不会被考虑在内的。而且,这里以更低的反复次数,使用了两个回路。


图9:编辑器输出数据得到优化的卷积。

编辑器代码中的Sobel滤波器

在本章节,我们将讨论如何以编辑器代码生成Sobel滤波器两个矩阵的卷积。为了实现正确的功能,内部存储器中必须有三条线。我们采用了一条长度为256象素的线来保持可比较性,并通过DAG(数据地址发生器)的地址指示字来获取图象数据和矩阵数值。

必须初始化四个地址指示字用于卷积。第一个将指向滤波器矩阵本身(iO)。后面三个地址指示字指向图象数据的每根线(i1,i2和i3)。从此每个语句只有两个卷积被执行,一个用于Gx,一个用于Gy。此处最重要的任务是,处理单个地址指示字时,要使得在一个回路重复之后,已经可获得有效地址用于下一次重复。否则就需要额外的语句才能执行。

卷积完成后,如果要进行后续处理,一般需要几何加法。为此,Gx和Gy的结果要平方,随后互加:

列表4展示了如何借助嵌套的矩阵两个(ConvMatXY[])来在一个回路中计算Gx和Gy。正如优化型3x3卷积方法一样,对于每根语句线,会有一个矩阵X上的一点的一个象素,和一个矩阵y的矩阵点的一个象素被计算出来。在每次3x3卷积卷积后,Gx和Gy会被平方并快速相加。它们是在标有“1End”的线中被平方,而平方值是在中线部分相加的。对于一根带有256个象素的线,这个卷积需要2560个周期,才能进行卷积和几何加法。


列表4:通过编辑器代码进行的包含几何加法的卷积。

在讨论了卷积之后,将计算出向量的角度Theta。角度计算并不需要三根线。

利用标准库atan2_fr16进行的角度计算

如上一章节所述,Gx和Gy的结果值是被保存嵌套的。通过这种形式,二者可以转变成第一个版本的角度计算。指示字"pInputXY[]"以Gx线的第一个值开始,随后是Gy线的第一个数值。计算出来的角度值被借助指示字"pOutputPhaseXY[]"写回。此时线长度包含了256个象素(nCount = 256)。

我们可以看到,这里是利用标准库中的Arkus正切(arctan)函数来计算出角度的。但是,这属于优化型计算方法,因为它是编码到编辑器中,并考虑了处理器的碎片格式。结果是没有使用任何浮点计算,而这原本是需要由定点处理器通过软件来模仿的。


列表5:利用函数atan2_fr16进行的计算。

在该方法中,所需周期数是可以变化的。取决于数据值的不同,必须执行更多或更少的计算,来最接近最精确的角度。由于所有方法都使用同样的测试图象,结果是可以互相比较的 - 256个象素需要24000个周期。

利用Arkus正切表格的角度计算

角度计算可以通过一个Arkus正切表格来执行。各个图象边缘的Gx和Gy值会在Arkus正切表格来识别出一个位置。在这个位置可以找到各个角度。为了实现这一点,必须提前创建一个表格,实现一个足够的角度分辨率。从图10中可以看出,一个128 x 128的表格被创建。该表格位于中心点,为数值范围在-64 ~ +64的图象边缘提供了一个角度。对于所有超出了这一范围的边缘量值,必定会被标准化。这是通过尽可能将两个数值(Gx和Gy)较大的一个值分开,直到数值等于或小于64(分开是指将数值转移到右边)为止来实现的。但是,为了达到一个正确的角度,还必须适当将两个数值中更小的一个减小。

图10:左图:Arkus正切表格 右图:Arkus正切标准化。
图10:左图:Arkus正切表格 右图:Arkus正切标准化。


列表6:通过Arkus正切表格的计算。

这个过程中所需要的周期数量是恒定的 - 一个带256象素的线需要8493个周期。其中大部分周期是需要用来检验超出范围的数值。该测试可以被更高效地解决。

汇编码中所用的完整角度计算

在这个变量中,来自汇编码执行的优化型卷积被执行,角度计算被结合到其中。因此,所需要的数值不一定要被重写到存储器中或重读。列表7中可以看出,处理器包含了可以让单个数值大小被计算并规格化的语句。这样就防止了任何的条件跳变,因为这些会产生额外的周期(处理器管线效应)。


列表7:通过汇编码进行的包含几何相加和角度计算的卷积。

此处所需周期数也是固定的 - 256象素的线需要5915个周期。

总结

在本系列文章的前两部分中(参考下面内容),介绍了一个针对视觉图象处理的系统概念,其包含了一套合适的硬件和软件设置。硬件的系统块图显示,即便组件数量最少(CMOS传感器、Blackfin处理器、TFT监视器和SDRAM),也可以实现一个完整的系统。所介绍的软件设置显示,借助DMA通道,不仅可以将数据传输并行,数据范围还可以单独选择(图象部分加载)。此外,数据范围还可以被修改(图象部分的旋转或嵌套)。

本系列的第三部分,介绍了Sobel边缘滤波器。这个滤波器处于特征抽取位置,被用于很多应用中。在该位置中,滤波器创建了一个图象(纯量场)和一个倾斜图象(矢量场)。此外,文中还介绍了在C语言和汇编程序中的不同执行,并对比了其性能。本文还介绍了在何种情况下1个C语言编辑器可以产生一个更优化的汇编码。最后,我们通过一个手写汇编码来对结果进行了对比,并展示了一个C编辑器可以在考虑到执行处理器架构的条件下,生成良好的结果。

作者:Thorsten Lorenzen
模拟器件公司

[大 中 小][打印]

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客