基于DSP的形状识别综述.docx
- 文档编号:27938265
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:14
- 大小:72.41KB
基于DSP的形状识别综述.docx
《基于DSP的形状识别综述.docx》由会员分享,可在线阅读,更多相关《基于DSP的形状识别综述.docx(14页珍藏版)》请在冰豆网上搜索。
基于DSP的形状识别综述
信息与电气工程学院
DSP应用系统(三级)项目
设计说明书
(2013/2014学年第二学期)
题目:
基于DSP的形状识别
专业班级:
电子信息1101
********
指导教师:
李丽宏崔冬王鹏贾东立
设计周数:
2周
设计成绩:
2014年7月11日
1项目设计目的
(1)通过DSP实验箱,读取一幅图像或者一路模拟视频信号的采集与显示;
(2)掌握形式识别的原理;
(3)掌握DSP实验箱环境与程序设计;
(4)基于实验箱环境编写形状识别程序,对规则形状进行识别
2项目设计内容
2.1项目设计原理
2.1.1数字图像信号处理
(1)数字图像直方图统计:
灰度直方图是数字图像处理中一个最简单、最有用的工具,它描述了一幅图像的灰度级内容。
任何一幅图像的直方图都包括了可观的信息,某些类型的图像可由其直方图完全描述。
灰度直方图是灰度值的函数,描述的是图像中具有该灰度值的像素的个数,其横坐标表示像素的灰度级别,纵坐标是该灰度出现的频率(像素个数与图像像素总数之比)。
程序流程图:
图1直方统计流程图
(2)数字图像边缘检测:
图像的边缘是图像的最基本特征。
所谓边缘(或边沿)是指其周围像素灰度有阶跃变化或屋顶变化的那些像素的集合。
边缘广泛存在于物体与背景之间、物体与物体之间、基元与基元之间。
因此,它是图像分割所依赖的重要特征。
物体的边缘是由灰度不连续性所反映的。
经典的边缘提取方法是考察图像的每个像素在某个邻域内灰度的变化,利用边缘临近一阶或二阶方向导数变化规律,用简单的方法检测边缘。
这种方法称为边缘检测局部算子法。
边缘的种类可以分为两种:
一种称为阶跃性边缘,它两边的像素的灰度值有着显著的不同;另一种称为屋顶状边缘,它位于灰度值从增加到减少的变化转折点。
如果一个像素落在图像中某一个物体的边界上,那么它的邻域将成为一个灰度级的变化带。
对于这种变化最有用的两个特征是灰度的变化率和方向,它们分别以梯度向量的幅度和方向来表示。
边缘检测算子检查每个像素的邻域并对灰度变化率进行量化,也包括方向的确定。
大多数使用基于方向导数掩模求卷积的方法。
(3)Sobel边缘算子:
在边沿检测中,常用的一种模板是Sobel算子。
Sobel算子有两个,一个是检测水平边沿的;另一个是检测垂直平边沿的。
与和相比,Sobel算子对于象素的位置的影响做了加权,因此效果更好。
Sobel算子另一种形式是各向同性Sobel(IsotropicSobel)算子,也有两个,一个是检测水平边沿的,另一个是检测垂直平边沿的。
各向同性Sobel算子和普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。
由于建筑物图像的特殊性,我们可以发现,处理该类型图像轮廓时,并不需要对梯度方向进行运算,所以程序并没有给出各向同性Sobel算子的处理方法。
由于Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数,简单有效,因此应用广泛。
美中不足的是,Sobel算子并没有将图像的主体与背景严格地区分开来,换言之就是Sobel算子没有基于图像灰度进行处理,由于Sobel算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。
在观测一幅图像的时候,我们往往首先注意的是图像与背景不同的部分,正是这个部分将主体突出显示,基于该理论,我们给出了下面阈值化轮廓提取算法,该算法已在数学上证明当像素点满足正态分布时所求解是最优的。
Sobel算子是一个离散微分算子(discretedifferentiationoperator)。
它结合了高斯平滑和微分求导,用来计算图像灰度函数的近似梯度。
下图所示的两个卷积核形成了sobel算子,图像中的每个点都用这两个核做卷积,一个核对通常的垂直边缘相应最大,而另一个对水平边缘相应最大。
两个卷积的最大值作为该点的输出位。
运算结果是一幅边缘幅度图像。
图2sobel边缘算子
程序流程图:
图3边缘检测流程图
2.1.2TMS320VC5509芯片介绍
DSP定点数字信号处理器(DSP)是基于DSPTMS320C55x代CPU处理器核心。
的C55xDSP架构通过增加并行性和减少功耗总重点实现了高性能和低功耗。
支持的CPU内部总线结构,是由一个程序读取的数据总线,三总线,两个数据写入总线,和更多的公交车专用外设和DMA活动。
这些巴士提供表演三数据的能力在一个周期内读取和写入两数据。
同时,DMA控制器进行了两个数据传输周期独立的CPU活动。
提供两个CPU的C55x乘累加(MAC)单元,每个具有17位×17位乘法的一个周期。
特征:
*高性能,低功耗,定点数字信号处理器TMS320C55x
*6.94-ns指令周期时间为144MHz的时钟速率在1.6V
*一个/两个指令(S)每个周期执行
*双乘法器[达288000000乘累加每秒(MMACS)]
*两个算术/逻辑单元(ALU)
*三内部数据、操作数读公交车和两个内部数据/操作数写入总线
*128K的×16位的芯片上的RAM,由:
*64K字节的双端口存储器(区)8块4K×16位
*192k字节的单一访问RAM(SARAM)24块4K×16位
*64K字节的一个等待状态的片上ROM(32K×16位)
*8×16位最大可寻址的外部存储空间(同步动态随机存储器)
*16位外部并行总线内存支持
*外部存储器接口(EMIF)与GPIO功能和无缝接口
*异步静态存储器(SRAM)
*异步存储器
*同步动态随机存取存储器(SDRAM)
*16位并行增强的主机接口(HPI)与GPIO功能
*六装置的功能结构域可编程低功耗控制
*在芯片扫描为基础的仿真逻辑
*片上外设
2.2程序代码
Image.c
#include
#defineIMAGEWIDTH80
#defineIMAGEHEIGHT80
#defineMODEGRAYBAR0
#defineMODEGRAY1
#defineMODEPHOTO12
#defineMODEPHOTO23
#defineMODEPHOTO34
#defineMODEPHOTO45
#defineMODEPHOTO56
#defineMODEPHOTO67
floatfHistogram[256];
voidInitImage(unsignedintnMode,unsignedchar*pImage,intnWidth,intnHeight);
unsignedchardbImage[IMAGEWIDTH*IMAGEHEIGHT];
unsignedchardbTargetImage[IMAGEWIDTH*IMAGEHEIGHT];
floatcircularity(unsignedchar*pImage,unsignedchar*pImage0,intnWidth,intnHeight,floatfHisto[256]);
floatL,S,circularity0;
/*直方图统计实验程序*/
intmain()
{
InitImage(MODEPHOTO1,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Sobel(IMAGEWIDTH,IMAGEHEIGHT);
identification(MODEPHOTO1);
InitImage(MODEPHOTO2,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Sobel(IMAGEWIDTH,IMAGEHEIGHT);
identification(MODEPHOTO2);
InitImage(MODEPHOTO3,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Sobel(IMAGEWIDTH,IMAGEHEIGHT);
identification(MODEPHOTO3);
InitImage(MODEPHOTO4,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Sobel(IMAGEWIDTH,IMAGEHEIGHT);
identification(MODEPHOTO4);
InitImage(MODEPHOTO5,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Sobel(IMAGEWIDTH,IMAGEHEIGHT);
identification(MODEPHOTO5);
InitImage(MODEPHOTO6,dbImage,IMAGEWIDTH,IMAGEHEIGHT);//BreakPoint
Sobel(IMAGEWIDTH,IMAGEHEIGHT);
identification(MODEPHOTO6);
while
(1);//BreakPoint
}
floatcircularity(unsignedchar*pImage,unsignedchar*pImage0,intnWidth,intnHeight,floatfHisto[256])
{inti,j;
unsignedintuWork;
unsignedchar*pWork,*pWork0;
for(i=0;i<256;i++)fHisto[i]=0.0f;
pWork=pImage0;
for(i=0;i { for(j=0;j { uWork=(unsignedint)(*pWork); fHisto[uWork]++; L=fHisto[255]; } } for(i=0;i<256;i++)fHisto[i]=0.0f; pWork0=pImage; for(i=0;i { for(j=0;j { uWork=(unsignedint)(*pWork0); fHisto[uWork]++; S=fHisto[0]; } } circularity0=L*L/S; return(circularity0); } identification(unsignedintnMode) {circularity0=circularity(dbImage,dbTargetImage,IMAGEWIDTH,IMAGEHEIGHT,fHistogram); printf("circularity0=%f.",circularity0); if(circularity0>59&&circularity0<60){ printf("circle\n"); } if(circularity0>63&&circularity0<64){ printf("squarence\n"); } if(circularity0>96&&circularity0<97){ printf("triangle\n"); } } InitImage.c #include #defineMODEGRAYBAR0 #defineMODEGRAY1 #defineMODEPHOTO12 #defineMODEPHOTO23 #defineMODEPHOTO34 #defineMODEPHOTO45 #defineMODEPHOTO56 #defineMODEPHOTO67 #defineMODEBLOCK6 #defineMODEINCLINE7 #defineMODEFPHOTO8 #defineGRAYBARLEVEL16 voidReadImage(unsignedchar*pImage,char*cFileName,intnWidth,intnHeight); voidInitImage(unsignedintnMode,unsignedchar*pImage,intnWidth,intnHeight) {switch(nMode) { caseMODEPHOTO1: ReadImage(pImage,"..\\circle1.bmp",nWidth,nHeight); break; caseMODEPHOTO2: ReadImage(pImage,"..\\squarence1.bmp",nWidth,nHeight); break; caseMODEPHOTO3: ReadImage(pImage,"..\\triangle1.bmp",nWidth,nHeight); break; caseMODEPHOTO4: ReadImage(pImage,"..\\squarence2.bmp",nWidth,nHeight); break; caseMODEPHOTO5: ReadImage(pImage,"..\\triangle2.bmp",nWidth,nHeight); break; caseMODEPHOTO6: ReadImage(pImage,"..\\circle2.bmp",nWidth,nHeight); break; } } voidReadImage(unsignedchar*pImage,char*cFileName,intnWidth,intnHeight) { intj; unsignedchar*pWork; FILE*fp; if(fp=fopen(cFileName,"rb")) { fseek(fp,1078L,SEEK_SET); pWork=pImage+(nHeight-1)*nWidth; for(j=0;j fread(pWork,nWidth,1,fp); fclose(fp); } } Sobel.c #defineIMAGEWIDTH80 #defineIMAGEHEIGHT80 #include externunsignedchardbImage[IMAGEWIDTH*IMAGEHEIGHT]; externunsignedchardbTargetImage[IMAGEWIDTH*IMAGEHEIGHT]; intmi,mj,m_nWork1,m_nWork2; unsignedintm_nWork,*pWork; unsignedchar*pImg1,*pImg2,*pImg3,*pImg; unsignedintx1,x2,x3,x4,x5,x6,x7,x8,x9; voidSobel(intnWidth,intnHeight) { inti; pImg=dbTargetImage; for(i=0;i (*pImg)=0; (*pImg)=0; pImg1=dbImage; pImg2=pImg1+IMAGEWIDTH; pImg3=pImg2+IMAGEWIDTH; for(i=2;i { pImg++; x1=(*pImg1);pImg1++;x2=(*pImg1);pImg1++; x4=(*pImg2);pImg2++;x5=(*pImg2);pImg2++; x7=(*pImg3);pImg3++;x8=(*pImg3);pImg3++; for(mi=2;mi { x3=(*pImg1);x6=(*pImg2);x9=(*pImg3); m_nWork1=abs(x7+x8+x8-x2-x2-x3); m_nWork2=abs(x3+x6+x6-x4-x4-x7); if(m_nWork1 m_nWork1=m_nWork2; if(m_nWork1>255)m_nWork1=255; (*pImg)=m_nWork1; x1=x2;x2=x3; x4=x5;x5=x6; x7=x8;x8=x9; } (*pImg)=0;pImg++; } } 程序运行结果: circularity0=59.205189.circle circularity0=63.320961.squarence circularity0=96.094772.triangle circularity0=63.429848.squarence circularity0=96.553711.triangle circularity0=59.391403.circle 3项目设计总结或结论 本学期学习DSP的时间很短,芯片设计掌握的深度不够,但通过此次课程设计,却改变了很多,首先,对于硬件电路的工作原理有了进一步的学习,同样就有了进一步的认识;其次,软件方面,在程序的设计,程序的调试方面都学到了很多东西。 通过认真的查阅资料和应用网络教程,完成了课程设计题目,用时挺长的,做的过程中遇到了许多大大小小的问题和困难,一开始感到无从下手,通过查阅各种资料视频,自己的学习思考终于才有了思路。 虽然完成了本次课程设计,但是很多的地方考虑的还是不够周全,有时不能很好的表达自己的思想。 课程设计也告诉我还有许多东西需要学习。 在大学课堂的学习只是纯理论的专业知识,而我们应该把所学的用到现实生活中去,此次的图像识别设计给我奠定了一个实践基础,我会在以后的学习、生活中磨练自己,使自己适应社会激烈的竞争。 在这次的DSP课程设计过程中,无论是在理论学习阶段,还是在设计的选题、资料查询和撰写的每一个环节,我都得到到了许多人的悉心的指导和帮助。 学习DSP要有一定的基础: 电子技术方面要有数字电路和模拟电路等方面的理论基础,特别是数字电路;编程语言要求C语言。 设计的时间花的算不算多,不是从XX里找就是从老师给的资料里一个一个拼凑起来。 这次的设计是基于一定的模版才设计出来的,好多不懂,都是从头学。 我要感谢授课的各位老师,正是由于你们的传道、授业、解惑,让我学到了专业知识,并从你们身上学到了如何求知治学、如何为人处事。 我也会珍惜以后每一次学习的机会。 4参考文献 [1]周霖,李枫.《DSP算法设计与系统方案》[J].国防工业出版社,2007,7. [2]赵红怡.《DSP技术与应用实例(第三版)》[M].电子工业出版社,20012,5. [3]郭文强,侯永严.《数字图像处理》[J].西安电子科技大学出版社,2009,5. 项目设计 评语 项目设计 成绩 指导教师 (签字) 年月日 注: 此表必须在同一页面。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 DSP 形状 识别 综述