數(shù)字圖像處理在DSP上的實(shí)現(xiàn)_第1頁
數(shù)字圖像處理在DSP上的實(shí)現(xiàn)_第2頁
數(shù)字圖像處理在DSP上的實(shí)現(xiàn)_第3頁
數(shù)字圖像處理在DSP上的實(shí)現(xiàn)_第4頁
數(shù)字圖像處理在DSP上的實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

數(shù)字圖像處理在DSP上的實(shí)現(xiàn)〔旋轉(zhuǎn)〕1緒論1.1設(shè)計(jì)目的圖像旋轉(zhuǎn)是一種應(yīng)用廣泛的數(shù)字圖像處理技術(shù),隨著應(yīng)用水平的不斷提高,對(duì)在嵌入式系統(tǒng)中實(shí)現(xiàn)高分辨率大圖像旋轉(zhuǎn)的需求也越來越高。如在航空領(lǐng)域的高分辨率數(shù)字地圖圖像的顯示處理過程中,由于現(xiàn)有的顯示芯片均不能支持圖像旋轉(zhuǎn)功能,就需要在資源有限的嵌入式平臺(tái)上實(shí)現(xiàn)大幅面地圖圖像的實(shí)時(shí)旋轉(zhuǎn)。采用DSP平臺(tái)是一種實(shí)現(xiàn)方式,具體實(shí)現(xiàn)時(shí)需仔細(xì)考慮兩個(gè)方面的問題,一是選用計(jì)算量小的旋轉(zhuǎn)算法,二是充分發(fā)揮DSP平臺(tái)強(qiáng)大的并行計(jì)算能力。1.2設(shè)計(jì)任務(wù) 1.能從計(jì)算機(jī)上讀取圖片。2.編寫圖像旋轉(zhuǎn)程序,在TMS320C5509上實(shí)現(xiàn)。2設(shè)計(jì)原理及分析2.1設(shè)計(jì)原理 目前,已經(jīng)有很多有效降低計(jì)算量的圖像旋轉(zhuǎn)算法,基于圖像線性存儲(chǔ)結(jié)構(gòu)的旋轉(zhuǎn)方法就是其中之一。然而,在DSP平臺(tái)上,有限的高速存儲(chǔ)資源限制了這些算法效率的直接發(fā)揮,需要針對(duì)算法及DSP平臺(tái)的性能結(jié)構(gòu)特點(diǎn)進(jìn)行高效的數(shù)據(jù)調(diào)度。對(duì)于圖像旋轉(zhuǎn)問題而言,數(shù)據(jù)調(diào)度還需要克服由于存在大量非連續(xù)圖像像素地址訪問而嚴(yán)重影響DSP數(shù)據(jù)存取及CPU效率發(fā)揮的問題。這是圖像旋轉(zhuǎn)本身的特殊性,在其他圖像處理技術(shù)中是不存在的。由DSP的結(jié)構(gòu)特點(diǎn)可知,只有在數(shù)據(jù)和程序均位于片內(nèi)存儲(chǔ)器當(dāng)中的條件下,DSP的效率才能得到最大化的發(fā)揮。在大圖像旋轉(zhuǎn)算法中,由于涉及的圖像數(shù)據(jù)量遠(yuǎn)大于DSP的片內(nèi)存儲(chǔ)器容量,源圖像和最終視口圖像等數(shù)據(jù)必須被存放在片外存儲(chǔ)器中。在這種情況下,為了保證DSPCPU高速處理能力的發(fā)揮,必須優(yōu)化數(shù)據(jù)流,將源圖像分塊,依次搬移至片內(nèi)處理,并設(shè)法保證CPU當(dāng)前要處理的圖像數(shù)據(jù)塊已經(jīng)事先在片內(nèi)存儲(chǔ)器中準(zhǔn)備好了。因此在算法整體優(yōu)化結(jié)構(gòu)上采用Ping-Pong雙緩沖技術(shù),利用EDMA與CPU并行工作來隱藏圖像數(shù)據(jù)塊在片內(nèi)和片外之間的傳輸時(shí)間,使CPU能連續(xù)不斷地處理數(shù)據(jù),中間不會(huì)出現(xiàn)空閑等待。傳統(tǒng)的圖像旋轉(zhuǎn)一般通過矩陣乘法實(shí)現(xiàn):其中,α為旋轉(zhuǎn)角度。由于圖像是線性存儲(chǔ)的,各個(gè)像素點(diǎn)之間的相對(duì)位置關(guān)系確定。如圖1(a)所示,圖像旋轉(zhuǎn)前,任意像素點(diǎn)P(x,y)和P1(x1,y1)、P2(x2,y2)及A(xA,yA)在幾何上是矩形的四頂點(diǎn)關(guān)系。由于旋轉(zhuǎn)變換是線性變換,如圖1(b)所示,圖像旋轉(zhuǎn)后,各個(gè)像素點(diǎn)之間的相對(duì)位置關(guān)系不發(fā)生變化,旋轉(zhuǎn)算法的數(shù)據(jù)調(diào)度目的是使算法能夠按照一定的規(guī)那么,將源圖像數(shù)據(jù)有規(guī)律地分塊,并按次序分別傳輸?shù)紻SP片內(nèi)存儲(chǔ)器中,完成計(jì)算后,形成視口圖像塊,再將視口圖像塊按同樣的順序進(jìn)行排列,形成旋轉(zhuǎn)后的視口圖像。整個(gè)過程要求調(diào)入和調(diào)出的圖像數(shù)據(jù)均是規(guī)那么分塊的,并且調(diào)入的源圖像塊中應(yīng)該包含計(jì)算視口圖像塊的過程中所需要的全部像素?cái)?shù)據(jù),尤其需要解決其中的大量非連續(xù)圖像像素地址訪問問題。視口逆時(shí)針旋轉(zhuǎn)的情況與此類似。區(qū)別有以下兩點(diǎn):源圖像塊的左邊框中點(diǎn)與相應(yīng)的視口圖像塊旋轉(zhuǎn)后的左上角頂點(diǎn)對(duì)應(yīng);②源圖像塊的頂點(diǎn)局部坐標(biāo)地址值與視口圖像塊的頂點(diǎn)局部坐標(biāo)地址值之間的對(duì)應(yīng)關(guān)系式應(yīng)為:其中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運(yùn)行結(jié)果分析從實(shí)驗(yàn)結(jié)果可以看出,調(diào)整圖像旋轉(zhuǎn),由于存在對(duì)稱性,一幅圖像任意角度的旋轉(zhuǎn)可分解為一次90°或180°或270°的旋轉(zhuǎn),再加上一次±45°以內(nèi)的旋轉(zhuǎn)。圖4.1原圖圖4.2順時(shí)針旋轉(zhuǎn)90度圖4.3逆時(shí)針旋轉(zhuǎn)90度結(jié)論本文得到的結(jié)論如下:實(shí)驗(yàn)采用高分辨率圖像處理平臺(tái),以TMS320C5509芯片為主處理芯片,時(shí)鐘為300MHz,片外為16MBSDRAM。實(shí)驗(yàn)實(shí)現(xiàn)相應(yīng)尺寸〔80×80像素〕的視口圖像旋轉(zhuǎn),相應(yīng)的源圖像數(shù)據(jù)分別為80×80像素的BMP格式的數(shù)字地圖圖像,采用0.005弧度旋轉(zhuǎn)角度遞增間隔,對(duì)分別采用傳統(tǒng)像素逐點(diǎn)矩陣相乘方法、基于圖像線性存儲(chǔ)結(jié)構(gòu)方法以及基于本文數(shù)據(jù)調(diào)度策略的結(jié)構(gòu)優(yōu)化的線性存儲(chǔ)結(jié)構(gòu)方法三種實(shí)現(xiàn)方式進(jìn)行比照,分別統(tǒng)計(jì)其平均每幀運(yùn)行時(shí)間并轉(zhuǎn)換成幀率,到達(dá)了本次課程設(shè)計(jì)的要求。參考文獻(xiàn)DANIELSSONPE.High-AccuracyRotat

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論