VLIB实验指导书
上面是VLIB一些处理函数的实际应用,可以很好的掌握TI的视觉库。前言如果·个孩了想搭积木,却两手空空的话,该如何开始呢?首先,当然是伐木、切削、打磨并给加工后的木块刷漆制成积木,一切准备工作就绪,才能开始搭。和搭积木比起来前面的准备工作对一个孩子来讲实在太过艰难。我想,许多视频开发的初学者就像这个孩子样,尽管头脑中充满了各种各样新奇有趣的方法,但在将这些方法诉诸实践的时候,却发现基本算法的实现就像制作积木一样难以逾越。好在II扮演了积木制造厂的角色,它为我们提供的VLB函数库中包括了 Canny边缘提取、 Hough直线检测、 Harris角点评分等多种基本算法的函数,大大缩短了开发者的工作时间。笔者在得到VLIB函数库之后,花了个多月时间对其中的函数进行学习和验证,并且把学习过程中的心得记录了下来,写成了这本小册子。∏I提供了VLB凶数使用的示例,但这些示例严谨有佘,灵活不足,读起来晦涩难懂。这本小册子的目的就是对VLIB说明文档和示例进行补充,意图使读者以更简单的方式了解这些函数的使用,因此,请务必结合VLB说明文档和TI的示例来阅读本册。并且,除非特殊声明,当本册的内容和wLB说明文档发生冲突时,请以ⅤLIB说明文档为准VLB库中的许多函数,以图像处理方面的经典论文为基础。对于这些论文中的算法,笔者没有详细描述,而是力图提纲挈领,给读者以宏观上的措述。如果读者对其中细节的地方感兴趣,可以参考补充文档中的论文,也可以直接与我们联系。VLIB说明文档中有许多用法类似的函数,只是输入参数的类型不同,由于本册侧重于函数的使用方法和原理,因此在对这些用法相似的函数进行说明时,只选择其中之一。读者可自行推演到同类型的其它函数。木册的实验素材都放在 images文件夹中,请读者将VLB文档放在D盘的根目录上,中于本册的实验从电脑中读取图像,因此ⅤLIB路径的更改会对程序造成影响。读者也可以放在其他的位置,但要修改程序中相应的文件路径。如果在运行程序时出现“ Please enter yourInput”的提示,请检查文件路径的设置,另外,由于是从电脑中读入图像,有时读取速度会很慢,请读者耐心等待。笔者也是一名视频开发的初学者,因此文档中难免岀现错误和疏漏,欢迎您提出宝贵意见。最后,感谢您对这本小册子的关注,也欢迎广大从事视频开发的同事和同学与我们联系和交流。实验一,Cany算子、实验目的1.学丬 Canny算子滤波的基木原理;2.学习ⅤIRB函数库中用于Cany滤波的函数的使用方法;、实验设备计算机,CCS3.3版软件,ELDM6437实验平台,DSP仿真器三、实验原理图像的边缘检测算法中,默认的算子是Cany算子。Cany算子在边缘检测与连接过程中都表现出很好的鲁棒性(健壮性),即使在含有噪声的图像中也是如此。Canny在1986年提出了这种边缘检测的方法,他考察了以往的边缘检测算子,进行了归纳,得到了三条准则,这三条准则是:好的检测:算法能够尽可能多地标识出图像中的实际边缘。好的定位:标识出的边缘要与实际图像中的实际边缘尽可能接近。最小响应:图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。有了这三个准则,寻找最优滤波器的问题就转化成了泛函的约束优化问题。 Canny利用变分法求出了这个帶有约束的泛函最优化问题的解。发现这个问题的解可以用高斯函数的阶导数去逼近,在二维情形下,可以使用二维高斯函数的导数作为滤波器函数图像的边缘检测中,抑制噪声与边缘精确定位是无法同时满足的,Cany算子致丿于在抗噪声和精确定位之间寻求最佳折衷方案。详细內容请参见补充文档中Cann在1986年发表的论文 Canny A+ Computational+ Approach+to+ Edge+ Detection P. pdf.Canny算子检测图像边缘的步骤如下1.高斯图像平滑高斯图像平滑意即使用斯滤波器对图像进行滤波。如果高斯滤波器为I(x,y),则平滑后G(x,y)=f(x,y)*H(x,y)。高斯函数形式如下:f(x)=aec2,其中a,b,c都为实数,且a>02.计算梯度幅值与方向通过一个一阶差分卷积模板H1求解出水平及垂直方向的梯度(x,y2(x,y)。接下米计算幅值和方向an(x,y)=f(x,y)*I1(x,y,g(,y)=f(x,y)*2(x,y)olx, ) =v9-lx )+2(x, y), 0=tan -IP2,"/4,P,x, y3.非极大值抑制为了得到确实的边缘,需要把矩阵中的局部梯度最大的点保留,抑制非极大值。765将方向离散为四个方向:水平、垂直、斜45°角。将这个点M(x,y)和沿着梯度线的两个点(同方向的两个点)作比较,如果点M(x,y)的梯度值不比这两个点的梯度值更大,则将M(xy)设置为0,否则为14.滞后阈值算法(双阈值算法)对非极大值抑制后的图像进行滞后阈值操作,这包括两个阙值——高阙值与低阙值,这两个阈值的作用分别为连接和检测。第二个阈值的作用是尽可能的保证边缘的正确无误,并不惜以某些边缘点损失为代价。第一个阈值的作用是尽可能的你补第二个阈值对实际边缘点的丢弃。设两个阈值分别为11,12,2I1≈12。T1处理后的图像设为图像1,12处理后的图像改为图像2。在图像2中把边缘连接成轮廓,当到达轮廓端点时,就在图像1的8邻域位置寻找可以连接到轮廓上的边缘,这样,算法不断地在图像1中寻找到满足条件的边缘(该点处的值大于T1),直到将图像2连接起来为止。四、实验步骤和函数说明实验步骤1.连接好电脑和仿貞器、ELDM6437和仿貞器2.给仿真器和ELDM6437上电,打开CCS并连接;3.打开 testON Canny文件夹里的工程文件Ⅴ LIB test Examples.pjt;4.下载程序out文件,如果没有就先编译一下 Project-》Bud(豳)5.打开 canny.c文件,在如下所示处设置断点;rint[(nEnd of the Test!\n):,,""t373%1= AreakmiIntimagewidthyIal free(DDR2HEAP,: mageDa二a,S1zeof(U1nt日)美p1汉e1Nms);MEM free(DDR2HEAP, scratchdatar sizeof (Uint8)*pixelNumsI;MEM free( DDR2hEAP, nonMaxr sizeof(until*pixeINums6.点击运行(公),稍等片刻后程序停止在断点,通过vew-》 Graph-》 Image观察图像outAtsr Proiect Debnz CEL Option Prof: le Tools DSP/BIOSL toolbarToolsv Layout ToolbarIsbus To3lba1'sVLIB adgeRalfoe三Eye Ii54Dali ck WatchMEM treeD由于需要观察的图像数据保存在 mulAta中,因此,先通过 Watch window获取 mulAta的廾始地址,再设置图像的高度宽度等信息。对于本实验,按下图所示设置 Graph Property dialog:for (i =n; i f imagewidt. itimageHei giintf"、 n End nf+heP十.1zeL:s=1maeW1以t上 irmagsHei1tMEM Eree(DDR2HEAP, i.aceData, sizeof (HMF飞(DDR2HE3P,sC⊥ cr. Ld,s⊥∠颩E Graph Property Dialogaphi ce山(Uintr(nStart AddressDi spl≤251)RGB:(0(InagsByteItsyHUniformquactizatior.to~256Ninage:feightM1:08080320三卫 nmIt emsonna4, Watch LocalG nAtch 1dout47.如果需要观察其他图像,请在要观察的地方设置断点,并重复步骤6如需观察方面梯度信息则设点的地方和图像属性对话框设置如下所示VLIB xyGradientsandMagpitude ( scatichnagrat互dth巢4Width你恰欢所置w Graph Property Dialoghtottom let243,238)B:(3:Imaersor ModeData]Cursoro gaussian_TxT0x810951“m14nmm7“PRR2hm「A1,】,8.本实验结束二、函数说明VLIB库提供了用于 Canny边缘检测的函数,在函数的使用过程中,要注意一段数据的首地址的偏移。现定义两个名词,以便于后续的解释。假设有一段数据,它在开始的边界处有些垃圾像素,则定义整段数据的首地址为“整体首地址”,定义忽略垃圾像素后的有效数据的首地址为“有效首地址”。首先做好准备工作,选择一幅猫的图像作为待处理图像,如图1-1所示。用函数获取所选图像的宽度 image Width和高度 imageHeight。读入图像并将首地址赋给 image Data。图1-1.待处理图像在内存中开辟以下空间grad用于存储X方向梯度gradY用于存储Y方向梯度grad用」存储梯度幅值non max用于存储非板大值抑制处理后的结果scratchData用于中间过程结果的保存listptr用于在过程中保存边缘信息outData用于存储最终的边缘图像定义lo为双阈值算法操作中的低阈值,木例设为2,h为高阈值木例设为20。 pixelNums为每一步操作中的待处理像素数(山于各函数参数的要求不同,该值会随时变化)。该算法过程分为四步。高斯滤波程序如下IMG conv 7x7 18 c8s(imageDatascratchDataplimage wigaussian 7x7其中,函数的第二个参数应将有效首地址传入。由于是7×7滤波器,滤波从图像的第四行第四列的点开始,至图像的倒数第四行倒数第四列的点结束,因此 pixelNums值为:pixelNums-image Width*(imageHeight-6)-6scratchData中保存了高斯滤波后的图像,如图1-2所示(首地址调整后)图1-2.高斯滤波后水平、垂直方向的梯度及梯度幅值的计算程序如下:VLIB XyGradicnts AndMagnitudc(scratchDatagrad+ image Width= 4+ 4gradY +image Width*4+4gradM image Width* 4+ 4image Width其中,第一、第二、第三和第四个参数都应传入有效首地址,在计算梯度时,由于会进步在边缘处引入行垃圾像素,因此有效首地址再次偏移。梯度计算不同于第步中的滤波计算,它的计算范围是略掉边界垃圾像素后中间的矩形区域,因此 pixeINums值为:pixcINums=imagc Width * imagcHcight-8)计算出的梯度幅值图像如图1-3所示。图1-3.梯度幅值抑制非极大值程序如下:VLIB nonMaximumSuppression Canny(gradM+ image Width*4+4,grad image Width 5+5ge width *5+5nonMax image Width 5+5image width-10mage Widthage Height-8):函数的第一、第二、第三和第四个参数都应传入有效首地址,函数的计算区域是略掉边界垃圾像素后中间的矩形区域,因此高度为 imageHeight-8。由简介可见,非极大值抑制需要和周围8邻域像素作对比,因此边界处的点肯定不会是局部极大值,即肯定会被抑制掉。再加上前两步引入的垃圾像素,图像首末五行的点肯定不会是局部极大值点。因此可以在第三步处理之前将 nonmax的首末五行数据置零。(不是必须的,这样做是为了让最终输出的图像边界处变成纯黑色。)非极大值抑制后的效果如图1-4所示图1-4.非极大值抑制后双阙值算法程序如下:VliB doublethresholding(gradM image Width*5+5non Max+ imagc width * 5+5lister,numltemsimage Width-10nage WidthimagcHcight-10其中,第一和第一个参数都应传入整体首地址,在 listptr中保存着图像的边缘信息。提取这些信息的程序如下:VLIB cdgcRclaxation(non Max imagc Width*5+5,listnumltemsimage width)for (i=0: i< image Width*imageHeight; 1++)(outData+1)-( (nonMax +1)>>7)*255然后, outdata中保存着最终的边缘图像,效果如图1-5所示
用户评论