数字图像处理在DSP上的实现Word下载.docx
《数字图像处理在DSP上的实现Word下载.docx》由会员分享,可在线阅读,更多相关《数字图像处理在DSP上的实现Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
![数字图像处理在DSP上的实现Word下载.docx](https://file1.bdocx.com/fileroot1/2022-10/8/a218119a-7607-49a0-be9a-c0f08eff3269/a218119a-7607-49a0-be9a-c0f08eff32691.gif)
其中,α为旋转角度。
由于图像是线性存储的,各个像素点之间的相对位置关系确定。
如图1(a)所示,图像旋转前,任意像素点P(x,y)和P1(x1,y1)、P2(x2,y2)及A(xA,yA)在几何上是矩形的四顶点关系。
由于旋转变换是线性变换,如图1(b)所示,图像旋转后,各个像素点之间的相对位置关系不发生变化,
旋转算法的数据调度目的是使算法能够按照一定的规则,将源图像数据有规律地分块,并按次序分别传输到DSP片存储器中,完成计算后,形成视口图像块,再将视口图像块按同样的顺序进行排列,形成旋转后的视口图像。
整个过程要求调入和调出的图像数据均是规则分块的,并且调入的源图像块中应该包含计算视口图像块的过程中所需要的全部像素数据,尤其需要解决其中的大量非连续图像像素地址访问问题。
视口逆时针旋转的情况与此类似。
区别有以下两点:
1源图像块的左边框中点与相应的视口图像块旋转后的左上角顶点对应;
②源图像块的顶点局部坐标地址值与视口图像块的顶点局部坐标地址值之间的对应关系式应为:
其中height指源图像块的高度。
3软件程序
3.1主程序
#include<
stdlib.h>
stdio.h>
graphics.h>
alloc.h>
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(&
mode,"
"
);
getpalette(&
palette);
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<
i++){
if(getpixel(x+i,y+j)!
=0)num++;
}
if(num>
cleancut){
k=getpixel(x,y);
setactivepage(ENHANCEPAGE);
putpixel(x,y,k);
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;
20;
i++)
lineto(random(100)+minx,random(100)+miny);
10;
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);
filenametoprocess:
gets(fname);
Deletepixelswithxorfewerneighbors.x="
cleancut);
if(cleancut>
8)cleancut=8;
init_graphics();
setactivepage
(1);
cleardevice();
setactivepage(0);
setvisualpage(LOADPAGE);
if(flag)load_cut(fname);
elseshow_test_image();
cleanup_image();
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;
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*));
cmy;
i++)lines[i]=(char*)malloc(sizeof(char)*(maxx-minx+cmx+1));
for(j=-cmy/2;
cmy/2;
for(i=minx-cmx/2;
(maxx+cmx/2+1);
lines[j+midy][i+offset]=getpixel(i,j+miny);
colmax=getmaxcolor();
for(j=miny;
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;
/*Load&
multiplyneighborsintomatrix*/
vx=vmat;
vy=vmat+1;
c=cmat;
nval=0;
for(k=0;
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*/
putpixel(i,j,nval);