《基于DSP的图像处理》-dsp课程设计.doc_第1页
《基于DSP的图像处理》-dsp课程设计.doc_第2页
《基于DSP的图像处理》-dsp课程设计.doc_第3页
《基于DSP的图像处理》-dsp课程设计.doc_第4页
《基于DSP的图像处理》-dsp课程设计.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

河海大学计算机与信息学院DSP课程设计报告基于DSP的图像处理DSP课程设计报告学 号: 班 级: 姓 名: 同组姓名: 指导教师: 2012年9月13日目 录1课程设计目的12课程设计题目背景描述和要求13课程设计报告内容14总结45参考文献46附录51.课程设计目的利用软件CCS实现以下功能:1、根据图像灰度等级对图像进行不同的旋转;2、对图像进行二值化处理2.课程设计题目背景描述和要求图像处理主要是指对原始图像进行加工,使其具有更好的视觉效果或满足某些特定场合的应用要求。由于图像具有信息量大、某些场合下对实时性要求较高的特点,所以对处理芯片的运算速度有较高要求。DSP芯片具有运算速度快,数据吞吐率高等优点,故在图像处理中得到广泛应用。本课题利用软件CCS进行图像处理,实现对图像的读入、分析、翻转、二值化处理。3.课程设计报告内容3.1 图像的读入及分析数字图像处理(Digital Image Processing)又称为计算机图像处理,它是指利用计算机和其它高速、大规模集成数字硬件,对从图像信息转换来的数字电信号进行某些数字运算或处理,以期提高图像的质量或达到人们所预想的结果。输出用户所需图像DSP硬件平台原始图像图像处理算法数字图像处理中常将图像像素点的灰度分为256个等级,其中0为黑色,255为白色,0到255之间的等级灰度逐渐减小。图像是由若干像素组成,每个像素都有确定的灰度值。所以一幅图像,可以用每一个像素点的位置及其灰度值来描述。以此为依据,对于二维图像,我们采用了一个二维数组,每个数组元素存储一个像素点的信息,数组元素标号可以表示像素点的横纵坐标,数组元素的值就为像素点的灰度值。通过这种方法,我们就可以将整张图像的信息读入DSP存储空间中。图像读入后,根据每一个像素点的灰度值可以计算出整张图像的平均灰度值。根据这一平均值我们将图像分为四个等级:063为0级,64127为1级,128191为2级,192255为3级。3.2 图像的二值化处理3.2.1二值化处理一幅图像包括目标物体、背景和噪声。目标物体和背景等在灰度值上有明显差异。因此,为了从多值的数字图像中直接提取目标物体,常设定一灰度阈值T,将图像分为两个部分,灰度大于T的像素群及灰度小于T的像素群。上述就是二值化处理的方法。本课设中设计了两种二值化方式:全局二值化,局部二值化。3.2.2全局二值化根据确定的二值化阈值T,我们对以读入的图像进行处理,对于图像中所有像素点,灰度值大于T的,将其灰度设为255,;灰度值小于T的,将其灰度值设为0。这样实现了图像的全局二值化。全局二值化为这张图像设定了统一的二值化阈值,但实际图像的各个部分平均灰度状况并不统一。因此全局二值化在表现图像细节方面存在缺陷。3.2.3局部二值化利用3.1中介绍的灰度分级,利用已经得到的图像整体的灰度等级,为每级的图像设定一个二值化阈值T。0级的灰度在063之间,阈值T设为32;1级的灰度在64127之间,阈值T设为96;2级的灰度在128191之间,阈T设为160;3级灰度在192255之间,阈值T设为224。该方法首先将图像划分为若干子集,在根据各子集的灰度状况各自设定二值化阈值。为简化处理过程,本课设中实际将图像划分为四个大小相等部分。再后逐一计算每个部分的平均灰度值,以此作为二值化阈值。随后根据各部分自身阈值,分别进行二值化处理。最后再将处理后的各部分进行整合,得到处理后的图像。以上方法相对于全局二值化有一定改善,但仍有缺陷。它将图像划分为若干小部分,各个部分阈值选取为自身的灰度平均值,因此,对各个部分而言,实质上还是选取了一个统一阈值。对此,可通过优化各部分阈值计算方法来进一步改善效果。优化的阈值计算方式应当更多地依赖于各部分图像自身的特征,以求所得的阈值能更好地反映该部分的情况。一种具体优化方法是:根据各部分像素灰度值的平均值E,像素之间的差平方P,像素之间的均方根值Q等各种局部特征,设定一个参数方程进行阈值的计算。例如:T=a*E+b*P+c*Q,其中a,b,c是自由参数。这样得出来的二值化图像就更能表现出二值化图像中的细节。 图像翻转目前,已经有很多有效降低计算量的图像旋转算法,基于图像线性存储结构的旋转方法就是其中之一。然而,在DSP平台上,有限的高速存储资源限制了这些算法效率的直接发挥,需要针对算法及DSP平台的性能结构特点进行高效的数据调度。对于图像旋转问题而言,数据调度还需要克服由于存在大量非连续图像像素地址访问而严重影响DSP数据存取及CPU效率发挥的问题。这是图像旋转本身的特殊性,在其他图像处理技术中是不存在的。由DSP的结构特点可知,只有在数据和程序均位于片内存储器当中的条件下,DSP的效率才能得到最大化的发挥。在大图像旋转算法中,由于涉及的图像数据量远大于DSP的片内存储器容量,源图像和最终视口图像等数据必须被存放在片外存储器中。在这种情况下,为了保证DSP CPU高速处理能力的发挥,必须优化数据流,将源图像分块,依次搬移至片内处理,并设法保证CPU当前要处理的图像数据块已经事先在片内存储器中准备好了。因此在算法整体优化结构上采用Ping-Pong双缓冲技术,利用EDMA与CPU并行工作来隐藏图像数据块在片内和片外之间的传输时间,使CPU能连续不断地处理数据,中间不会出现空闲等待。传统的图像旋转一般通过矩阵乘法实现: 其中,为旋转角度。由于图像是线性存储的,各个像素点之间的相对位置关系确定。如图1(a)所示,图像旋转前,任意像素点P(x,y)和P1(x1,y1)、P2(x2,y2)及A(xA,yA)在几何上是矩形的四顶点关系。由于旋转变换是线性变换,如图1(b)所示,图像旋转后,各个像素点之间的相对位置关系不发生变化,旋转算法的数据调度目的是使算法能够按照一定的规则,将源图像数据有规律地分块,并按次序分别传输到DSP片内存储器中,完成计算后,形成视口图像块,再将视口图像块按同样的顺序进行排列,形成旋转后的视口图像。整个过程要求调入和调出的图像数据均是规则分块的,并且调入的源图像块中应该包含计算视口图像块的过程中所需要的全部像素数据,尤其需要解决其中的大量非连续图像像素地址访问问题。视口逆时针旋转的情况与此类似。区别有以下两点: 源图像块的左边框中点与相应的视口图像块旋转后的左上角顶点对应;源图像块的顶点局部坐标地址值与视口图像块的顶点局部坐标地址值之间的对应关系式应为:其中height指源图像块的高度。4.总结通过本次课程设计,将课堂教学的知识应用于实践。在这个过程中,我们先对图像的知识进行基本的了解,并且将图像转化为数组进行存储,处理。我们还学习了ccs软件的基本应用,这对于我们以后的工作也是非常重要的。同时通过这次实践进一步提高了我们的c语言水平。最重要的是对我们思维的开拓,从开始的数组化图像到后来局部二值化的想法,通过向老师提问,网上查找资料等方式我们一步一步完善我们的课程设计,最终完成了我们的课设目的。另外,通过本次实践,我们也感受到了dsp技术的稳定性好,可重复性好,抗干扰能力强,数据压缩等特点。相信这项技术在以后有更大的发展空间。参考文献1 戴明桢,周建江. TMS320C54x DSPM. 北京:北京航空航天大学出版社,2007.2 郎崇林 DSP及其在图像处理中的应用J. 科技情报开发与经济, 2011,第26期3 百度百科 二值化 附录3.1主程序#include#include#include#include#includeint load_cut(char *fname);int load_convolution_matrix(char *fname);int convolve_image(void);int swap_pictures(void);int minx,maxx,miny,maxy;int LOADPAGE=0;int ENHANCEPAGE=1;int *cmat, *pmat, *vmat;int cmx,cmy,cmnum;struct palettetype palette,newpal;int driver,mode;int cleancut=-1;int init_graphics(void) driver=DETECT; mode=0; detectgraph(&driver,&mode); if(driver=VGA) mode=VGAMED; initgraph(&driver,&mode,); getpalette(&palette); getpalette(&newpal);int cleanup_image(void) int i,j,num,x,y,k; if(cleancut0) return; setactivepage(LOADPAGE); setvisualpage(ENHANCEPAGE); for(x=minx;xmaxx;x+) for(y=miny;ymaxy;y+) if(getpixel(x,y)!=0) num=-1; else num=0; for(j=-1;j2;j+) for(i=-1;icleancut) k=getpixel(x,y); setactivepage(ENHANCEPAGE); putpixel(x,y,k); setactivepage(LOADPAGE); k=ENHANCEPAGE; ENHANCEPAGE=LOADPAGE; LOADPAGE=k;void show_test_image(void) int i; minx=cmx; miny=cmy; maxx=100+minx; maxy=100+miny; setcolor(1); moveto(minx,miny); randomize(); for(i=0;i20;i+) lineto(random(100)+minx,random(100)+miny); for(i=0;i8) cleancut=8; init_graphics(); setactivepage(1); cleardevice(); setactivepage(0); cleardevice(); setactivepage(LOADPAGE); setvisualpage(LOADPAGE); if(flag) load_cut(fname); else show_test_image(); cleanup_image(); setvisualpage(ENHANCEPAGE); convolve_image(); swap_pictures(); restorecrtmode();int toggle_colors(char c) c=tolower(c); c=c-a; if(c=palette.size) return 0; newpal.colorsc= palette.colorsc-newpal.colorsc; setpalette(c,newpal.colorsc); return 1;int swap_pictures(void) int mode=0; char a; setvisualpage(LOADPAGE); for(;) a=getch(); if(a=27) return; if(toggle_colors(a) continue; if(mode=0) setvisualpage(ENHANCEPAGE); if(mode=1) setvisualpage(LOADPAGE); mode=1-mode; int convolve_image(void) int i,j,k,nval; int *vx, *vy, *c; int colmax,offset,end,midy; char *lines=NULL; char *temp=NULL; offset=-minx+(cmx/2); end=cmy-1; midy=cmy/2; lines=(char *)malloc(cmy*sizeof(char *); for(i=0;icmy;i+) linesi=(char *)malloc(sizeof(char)*(maxx-minx+cmx+1); setactivepage(LOADPAGE); for(j=-cmy/2;jcmy/2;j+) for(i=minx-cmx/2;i(maxx+cmx/2+1);i+) linesj+midyi+offset=getpixel(i,j+miny); colmax=getmaxcolor(); for(j=miny;jmaxy;j+) setactivepage(LOADPAGE); for(i=j+cmy/2,k=minx-cmx/2,nval=maxx+cmx/2;knval;k+) linesendk+offset=getpixel(k,i); for(i=minx;imaxx;i+) /* Load & multiply neighbors into matrix */ setactivepage(LOADPAGE); vx=vmat; vy=vmat+1; c=cmat; nval=0; for(k=0;kcmnum;k+) if(*c) nval+= lines(*vy)+midyi+(*vx)+offset*(*c); /* if(*c) nval+= getpixel(i+(*vx),j+(*vy) * (*c); */ c+; vx+=2; vy+=2; /* Cut off values too high or too low */ if(nvalcolmax) nval=colmax; /* Place new pixel value */ setactivepage(ENHANCEPAGE); putpixel(i,j,nval); if(kbhit() getch(); break; /* rotate line pointers */ temp=lines0; for(i=1;icmy;i+) linesi-1=linesi; linesend=temp; for(i=0;icmy;i+) if(linesi!=NULL) free(linesi); if(lines!=NULL) free(lines); return;int build_offset_vectors(void) int *t; int il,im,jl,jm,i,j; il=-cmx/2; im=cmx+il; jl=-cmy/2; jm=cmy+jl; t=vmat; for(j=jl;jjm;j+) for(i=il;iim;i+) *t+=i; *t+=j; int load_convolution_matrix(char *fname) /* Layout of matrix file: #x #y x0y0 x1y0 . xny1 . . . . x0ym x1ym . xnym */ FILE *mf; int *t; int i,j,im,jm; if( (mf=fopen(fname,rt)=NULL ) printf(Cannot load matrix file.n); abort(); fscanf(mf,%d%d,&im,&jm); if( (im&1)=0 | (jm&1)=0 ) printf(Convolution matrix MUST have a center point.n); abort(); if( (cmat=(int *)calloc(im*jm,sizeof(int)=NULL ) printf(Unable to calloc convolution matrix.n); abort(); if( (vmat=(int *)calloc(2*im*jm,sizeof(int)=NULL ) printf(Unable to calloc offset vector matrix.n); abort(); cmx=im; cmy=jm; cmnum=im*jm; t=cmat; for(j=0;jjm;j+) for(i=0;i(getmaxy()-cmy) maxy=getmaxy()-cmy; height=maxy-yl; getw(fp); y=yl-1; for(sp=st,n=0;nheight;n+) stp=getw(fp); for(sp=st,spend=st+stp;spspend;) *sp+=getc(fp); sp=st; spend=sp+stp; x=xl; y+; while(sp0x80) len=(*sp+) & 0x7f; if(!(*sp) x+=len; continue; setcolor(*sp+); moveto(x,y); linerel(len,0); x+=len; continue; else len=*sp+; for(j=0;jlen;j+) putpixel(x+,y,*sp+); continue; fclose(fp);3.2初始化和读取图像程序#include#define MODEPHOTO1 1#define MODEPHOTO2 2#define GRAYBARLEVEL 16void ReadImage(unsigned char*pImage,char*cFileName,int nWidth,int nHeight);void InitImage(unsigned int nMode,unsigned char*pImage,int nWidth,int nHeight) swich(nMode) case MODEPHOTO1: Readimage(pImage,.DSP.bmp,nWidth,nHeight); break; case MODEPHOTO2: ReadImage(pImage,.1.bmp,nWidth,nHeight); break; default: break; void ReadImage(unsigned char*cFileName,int nWidth,int nHeight) int j; unsigned char*pWork; FILE*fp; if(fp=fopen(cFileName,rb) fseek(fp,1078L,SEEK_SET); pWork=pImage+(nHeight-1)*nWidth; for(j=0;jnHeight;j+,pWork-=nWidth) fread(pWork,nWidth,1,fp); fclose(fp); 1、 局部二值化处理原程序:#include math.h#include stdio.hint y6464;int ave(int (*t)32) unsigned int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论