数字图像处理在DSP上的实现_第1页
数字图像处理在DSP上的实现_第2页
数字图像处理在DSP上的实现_第3页
数字图像处理在DSP上的实现_第4页
数字图像处理在DSP上的实现_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

数字图像处理在DSP上的实现〔旋转〕1绪论1.1设计目的图像旋转是一种应用广泛的数字图像处理技术,随着应用水平的不断提高,对在嵌入式系统中实现高分辨率大图像旋转的需求也越来越高。如在航空领域的高分辨率数字地图图像的显示处理过程中,由于现有的显示芯片均不能支持图像旋转功能,就需要在资源有限的嵌入式平台上实现大幅面地图图像的实时旋转。采用DSP平台是一种实现方式,具体实现时需仔细考虑两个方面的问题,一是选用计算量小的旋转算法,二是充分发挥DSP平台强大的并行计算能力。1.2设计任务 1.能从计算机上读取图片。2.编写图像旋转程序,在TMS320C5509上实现。2设计原理及分析2.1设计原理 目前,已经有很多有效降低计算量的图像旋转算法,基于图像线性存储结构的旋转方法就是其中之一。然而,在DSP平台上,有限的高速存储资源限制了这些算法效率的直接发挥,需要针对算法及DSP平台的性能结构特点进行高效的数据调度。对于图像旋转问题而言,数据调度还需要克服由于存在大量非连续图像像素地址访问而严重影响DSP数据存取及CPU效率发挥的问题。这是图像旋转本身的特殊性,在其他图像处理技术中是不存在的。由DSP的结构特点可知,只有在数据和程序均位于片内存储器当中的条件下,DSP的效率才能得到最大化的发挥。在大图像旋转算法中,由于涉及的图像数据量远大于DSP的片内存储器容量,源图像和最终视口图像等数据必须被存放在片外存储器中。在这种情况下,为了保证DSPCPU高速处理能力的发挥,必须优化数据流,将源图像分块,依次搬移至片内处理,并设法保证CPU当前要处理的图像数据块已经事先在片内存储器中准备好了。因此在算法整体优化结构上采用Ping-Pong双缓冲技术,利用EDMA与CPU并行工作来隐藏图像数据块在片内和片外之间的传输时间,使CPU能连续不断地处理数据,中间不会出现空闲等待。传统的图像旋转一般通过矩阵乘法实现:其中,α为旋转角度。由于图像是线性存储的,各个像素点之间的相对位置关系确定。如图1(a)所示,图像旋转前,任意像素点P(x,y)和P1(x1,y1)、P2(x2,y2)及A(xA,yA)在几何上是矩形的四顶点关系。由于旋转变换是线性变换,如图1(b)所示,图像旋转后,各个像素点之间的相对位置关系不发生变化,旋转算法的数据调度目的是使算法能够按照一定的规那么,将源图像数据有规律地分块,并按次序分别传输到DSP片内存储器中,完成计算后,形成视口图像块,再将视口图像块按同样的顺序进行排列,形成旋转后的视口图像。整个过程要求调入和调出的图像数据均是规那么分块的,并且调入的源图像块中应该包含计算视口图像块的过程中所需要的全部像素数据,尤其需要解决其中的大量非连续图像像素地址访问问题。视口逆时针旋转的情况与此类似。区别有以下两点:源图像块的左边框中点与相应的视口图像块旋转后的左上角顶点对应;②源图像块的顶点局部坐标地址值与视口图像块的顶点局部坐标地址值之间的对应关系式应为:其中height指源图像块的高度。3软件程序3.1主程序#include<stdlib.h>#include<stdio.h>#include<graphics.h>#include<alloc.h>#include<ctype.h>intload_cut(char*fname);intload_convolution_matrix(char*fname);intconvolve_image(void);intswap_pictures(void);intminx,maxx,miny,maxy;intLOADPAGE=0;intENHANCEPAGE=1;int*cmat,*pmat,*vmat;intcmx,cmy,cmnum;structpalettetypepalette,newpal;intdriver,mode;intcleancut=-1;intinit_graphics(void){driver=DETECT;mode=0;detectgraph(&driver,&mode);if(driver==VGA)mode=VGAMED;initgraph(&driver,&mode,"");getpalette(&palette);getpalette(&newpal);}intcleanup_image(void){inti,j,num,x,y,k;if(cleancut<0)return;setactivepage(LOADPAGE);setvisualpage(ENHANCEPAGE);for(x=minx;x<maxx;x++){for(y=miny;y<maxy;y++){if(getpixel(x,y)!=0)num=-1;elsenum=0;for(j=-1;j<2;j++){for(i=-1;i<2;i++){if(getpixel(x+i,y+j)!=0)num++;}}if(num>cleancut){k=getpixel(x,y);setactivepage(ENHANCEPAGE);putpixel(x,y,k);setactivepage(LOADPAGE);}}}k=ENHANCEPAGE;ENHANCEPAGE=LOADPAGE;LOADPAGE=k;}voidshow_test_image(void){inti;minx=cmx;miny=cmy;maxx=100+minx;maxy=100+miny;setcolor(1);moveto(minx,miny);randomize();for(i=0;i<20;i++)lineto(random(100)+minx,random(100)+miny);for(i=0;i<10;i++)fillellipse(random(50)+25+minx,random(50)+25+miny,random(25),random(25));}main(){charfname[50];intflag=0;load_convolution_matrix("matrix.dat");printf(".CUTfile(1)ortestimage(0)?");scanf("%d",&flag);flag=flag?1:0;if(flag){fflush(stdin);printf("filenametoprocess:");gets(fname);}printf("Deletepixelswithxorfewerneighbors.x=");scanf("%d",&cleancut);if(cleancut>8)cleancut=8;init_graphics();setactivepage(1);cleardevice();setactivepage(0);cleardevice();setactivepage(LOADPAGE);setvisualpage(LOADPAGE);if(flag)load_cut(fname);elseshow_test_image();cleanup_image();setvisualpage(ENHANCEPAGE);convolve_image();swap_pictures();restorecrtmode();}inttoggle_colors(charc){c=tolower(c);c=c-'a';if(c<0||c>=palette.size)return0;newpal.colors[c]=palette.colors[c]-newpal.colors[c];setpalette(c,newpal.colors[c]);return1;}intswap_pictures(void){intmode=0;chara;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;}}intconvolve_image(void){inti,j,k,nval;int*vx,*vy,*c;intcolmax,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;i<cmy;i++)lines[i]=(char*)malloc(sizeof(char)*(maxx-minx+cmx+1));setactivepage(LOADPAGE);for(j=-cmy/2;j<cmy/2;j++){for(i=minx-cmx/2;i<(maxx+cmx/2+1);i++){lines[j+midy][i+offset]=getpixel(i,j+miny);}}colmax=getmaxcolor();for(j=miny;j<maxy;j++){setactivepage(LOADPAGE);for(i=j+cmy/2,k=minx-cmx/2,nval=maxx+cmx/2;k<nval;k++)lines[end][k+offset]=getpixel(k,i);for(i=minx;i<maxx;i++){/*Load&multiplyneighborsintomatrix*/setactivepage(LOADPAGE);vx=vmat;vy=vmat+1;c=cmat;nval=0;for(k=0;k<cmnum;k++){if(*c)nval+=lines[(*vy)+midy][i+(*vx)+offset]*(*c);/*if(*c)nval+=getpixel(i+(*vx),j+(*vy))*(*c);*/c++;vx+=2;vy+=2;}/*Cutoffvaluestoohighortoolow*/if(nval<0)nval=0;if(nval>colmax)nval=colmax;/*Placenewpixelvalue*/setactivepage(ENHANCEPAGE);putpixel(i,j,nval);}if(kbhit()){getch();break;}/*rotatelinepointers*/temp=lines[0];for(i=1;i<cmy;i++)lines[i-1]=lines[i];lines[end]=temp;}for(i=0;i<cmy;i++){if(lines[i]!=NULL)free(lines[i]);}if(lines!=NULL){free(lines);}return;}intbuild_offset_vectors(void){int*t;intil,im,jl,jm,i,j;il=-cmx/2;im=cmx+il;jl=-cmy/2;jm=cmy+jl;t=vmat;for(j=jl;j<jm;j++){for(i=il;i<im;i++){*t++=i;*t++=j;}}}intload_convolution_matrix(char*fname){/*Layoutofmatrixfile:#x#yx0y0x1y0...xny1...x0ymx1ym...xnym*/FILE*mf;int*t;inti,j,im,jm;if((mf=fopen(fname,"rt"))==NULL){printf("Cannotloadmatrixfile.\n");abort();}fscanf(mf,"%d%d",&im,&jm);if((im&1)==0||(jm&1)==0){printf("ConvolutionmatrixMUSThaveacenterpoint.\n");abort();}if((cmat=(int*)calloc(im*jm,sizeof(int)))==NULL){printf("Unabletocallocconvolutionmatrix.\n");abort();}if((vmat=(int*)calloc(2*im*jm,sizeof(int)))==NULL){printf("Unabletocallocoffsetvectormatrix.\n");abort();}cmx=im;cmy=jm;cmnum=im*jm;t=cmat;for(j=0;j<jm;j++){for(i=0;i<im;i++){if(fscanf(mf,"%d",t++)!=1){printf("Unabletoreadmatrix.\n");abort();}}}fclose(mf);build_offset_vectors();}intload_cut(char*fname){staticunsignedcharst[3000];char*sp=st,*spend;intstp=0;intwidth,height;FILE*fp;intx,y,xl,yl;inti,n,len,d,j;fp=fopen(fname,"rb");width=getw(fp);height=getw(fp);xl=cmx;yl=cmy;minx=xl;miny=yl;maxx=xl+width;maxy=yl+height;if(maxy>(getmaxy()-cmy)){maxy=getmaxy()-cmy;height=maxy-yl;}getw(fp);y=yl-1;for(sp=st,n=0;n<height;n++){stp=getw(fp);for(sp=st,spend=st+stp;sp<spend;)*sp++=getc(fp);sp=st;spend=sp+stp;x=xl;y++;while(sp<spend){if(*((unsignedchar*)sp)>0x80){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;j<len;j++)putpixel(x++,y,*sp++);continue;}}}fclose(fp);}3.2初始化和读取图像程序#include<stdio.h>#defineMODEPHOTO11#defineMODEPHOTO22#defineGRAYBARLEVEL16voidReadImage(unsignedchar*pImage,char*cFileName,intnWidth,intnHeight);voidInitImage(unsignedintnMode,unsignedchar*pImage,intnWidth,intnHeight){swich(nMode){caseMODEPHOTO1:Readimage(pImage,"..\\DSP.bmp",nWidth,nHeight);break;caseMODEPHOTO2:ReadImage(pImage,"..\\1.bmp",nWidth,nHeight);break;default:break;}}voidReadImage(unsignedchar*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<nHeight;j++,pWork-=nWidth)fread(pWork,nWidth,1,fp);fclose(fp);}}4运行结果分析从实验结果可以看出,调整图像旋转,由于存在对称性,一幅图像任意角度的旋转可分解为一次90°或180°或270°的旋转,再加上一次±45°以内的旋转。图4.1原图图4.2顺时针旋转90度图4.3逆时针旋转90度结论本文得到的结论如下:实验采用高分辨率图像处理平台,以TMS320C5509芯片为主处理芯片,时钟为300MHz,片外为16MBSDRAM。实验实现相应尺寸〔80×80像素〕的视口图像旋转,相应的源图像数据分别为80×80像素的BMP格式的数字地图图像,采用0.005弧度旋转角度递增间隔,对分别采用传统像素逐点矩阵相乘方法、基于图像线性存储结构方法以及基于本文数据调度策略的结构优化的线性存储结构方法三种实现方式进行比照,分别统计其平均每帧运行时间并转换成帧率,到达了本次课程设计的要求。参考文献DANIELSSONPE.High-AccuracyRotat

温馨提示

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

评论

0/150

提交评论