www.pudn.com > GAyutuxing.rar > PATMAT.c
/**********************************************************************/ /* 基于遗传算法的图像模式识别 PATMAT.C */ /* 同济大学计算机系 王小平 2000年5月 */ /***********************************************************************/ #include#include #include #include #include #include #include "graph.c" #include "operator.c" /* 宏定义 */ #define POP_SIZE 20 #define S_RATE 0.4 #define M_RATE 0.2 #define DEFOCUS_L 4 #define G_LENGTH 15 /* 个体遗传基因位长 */ #define XUL 100 #define YUL 250 #define GX1 360 #define GY1 66 #define GX2 360 #define GY2 257 #define GXR 250 #define GYR 100 #define GSTEP 2 /* 全局变量 */ unsigned char gene[POP_SIZE][G_LENGTH]; /* 个体遗传基因 */ unsigned char image[128][128]; double fitness[POP_SIZE]; double _sin[8];_cos[8]; double max_fit,avg_fit; int m_num; int m_pnts[2][1000]; int pnts[2][1000]; void g_draw_frame(x1,y1,x2,y2,c1,c2,c3,c4,text) int x1,y1,x2,y2,c1,c2,c3,c4; char *text; { int n,x3; g_rectangle(x1,y1,x2,y2,c1,1); g_rectangle(x1,y1,x2,y2,c2,0); g_rectangle(x1,y1,x2,y1+16,c3,1); g_rectangle(x1,y1,x2,y1+16,c2,0); n=strlen(text); x3=x1+((x2-x1-n*8)/2); disp_hz16(text,x3,y1,c4); } void g_disp_image() { int i,j; for(i=0;i<128;i++) for(j=0;j<128;j++) g_pset(XUL+j,YUL+i,image[j][i]); } void g_init_frames() /* 初始化画面 */ { int i,j,cx,cy,x,y; char text[17]; g_draw_frame(0,0,639,399,15,0,4,15, "基于遗传算法的基元识别与提取"); g_draw_frame(0,16,320,170,7,15,8,15,"基元"); itoa(m_num,text,10); setcolor(9); disp_hz16("构成点数=",30,50,15); disp_hz16(text,118,50,15); for(i=0;i ",10,300,20); gscanf(420,300,4,0,2,"%s",choice); n=atoi(choice); switch(n) { case 1: x1=345;y1=225; x2=x1-25-random(25);y2=y1; x3=x1;y3=y1-25-random(25); g_line(x1,y1,x2,y2,9); g_line(x1,y1,x3,y3,9); g_line(x2,y2,x3,y3,9);break; case 2: x1=345;y1=225; x2=x1-25-random(25); y2=y1-25-random(25); g_rectangle(x2,y2,x1,y1,9,0);break; case 3: x1=320;y1=200; x2=10+random(25); y2=10+random(25); g_circle(x1,y1,x2,y2,9);break; case 4: x1=320;y1=200; rad[0]=10+random(15); for(i=1;i<90;i++) { rad[i]=rad[i-1]-4+random(9); if(rad[i]<10) rad[i]=10.0; else if(rad[i]>25) rad[i]=25.0; } for(i=1;i<3;i++) for(j=0;j<90;j++) { if((j-1)<0) n1=89; else n1=j-1; if((j+1)>89) n2=0; else n2=j+1; rad[j]=(rad[n1]+rad[j]+rad[n2])/3.0; } for(i=0;i<90;i++) { if((i+1)>89) n1=0; else n1=i+1; x2=(int)(rad[i]*cos(i/45.0*3.14))+x1; y2=(int)(rad[i]*sin(i/45.0*3.14))+y1; x3=(int)(rad[n1]*cos((double)n1/45.0*3.14))+x1; y3=(int)(rad[n1]*sin((double)n1/45.0*3.14))+y1; g_line(x2,y2,x3,y3,9); } } g_rectangle(260,140,380,260,4,0); setcolor(9); disp_hz16("轮廓圆滑处理满意否? no:1 yes:2===>",10,340,20); gscanf(400,340,4,0,2,"%s",choice); ok=atoi(choice); } setcolor(9); disp_hz16("加入噪声否? no:1 yes:2===>",10,380,20); gscanf(400,380,9,0,2,"%s",choice); yn=atoi(choice); if(yn==2) for(i=0;i<3000;i++) g_pset(261+random(119),141+random(119),0); m_num=0; for(y1=141;y1<260;y1++) for(x1=261;x1<380;x1++) { col=g_pget(x1,y1); if(col!=0) { m_pnts[0][m_num]=x1; m_pnts[1][m_num]=y1; m_num=m_num+1; } } wx=0;wy=0;work=(double)m_num; for(i=1;i<=m_num;i++) { wx=wx+(double)(m_pnts[0][i-1])/work; wy=wy+(double)(m_pnts[1][i-1])/work; } x1=(int)wx;y1=(int)wy; for(i=1;i<=m_num;i++) { m_pnts[0][i-1]=m_pnts[0][i-1]-x1; m_pnts[1][i-1]=m_pnts[1][i-1]-y1; } } void g_set_image() { int ok,i; int cx,cy,gx,gy,x,y,col,xx,yy,xymax; double angle,x1,y1; char choice[2]; for(i=0;i<8;i++) { _sin[i]=sin((double)i*45.0/360.0*3.141592); _cos[i]=cos((double)i*45.0/360.0*3.141592); } xymax=64; cx=200;cy=100; ok=1; while(ok==1) { g_cls(); for(i=0;i<25;i++) printf("\n"); g_rectangle(cx-1,cy-1,cx+128,cy+128,9,0); for(i=0;i<3;i++) g_line(random(128)+cx,random(128)+cy, random(128)+cx,random(128)+cy,9); for(i=0;i<1;i++) g_circle(random(64)+cx+32,random(64)+cy+32, random(20)+10,random(20)+10,9); for(i=0;i<5000;i++) g_pset(random(128)+cx,random(128)+cy,0); for(i=0;i<200;i++) g_pset(random(128)+cx,random(128)+cy,9); gx=random(xymax)-xymax/2; gy=random(xymax)-xymax/2; angle=random(8); for(i=1;i<=m_num;i++) { x1=(double)m_pnts[0][i-1]; y1=(double)m_pnts[1][i-1]; x=(int)(_cos[angle]*x1-_sin[angle]*y1)+64+cx+gx; y=(int)(_sin[angle]*x1+_cos[angle]*y1)+64+cy+gy; g_pset(x,y,9); } setcolor(9); disp_hz16("绘制原图像满意否? no:1 yes:2===>",10,240,20); gscanf(300,240,4,0,2,"%s",choice); ok=atoi(choice); } for(y=0;y<128;y++) for(x=0;x<128;x++) { col=g_pget(x+cx,y+cy); if(col>0) image[x][y]=DEFOCUS_L; else image[x][y]=0; } for(y=0;y<128;y++) { /* printf("%d/128\n",y+1);*/ for(x=0;x<128;x++) if(image[x][y]==DEFOCUS_L) for(i=0;i =0 && xx<=127 && yy>0 && y<=127) if(image[xx][yy]==(DEFOCUS_L-i)) image[xx][yy]=DEFOCUS_L-i; } } for(y=0;y<128;y++) for(x=0;x<128;x++) g_pset(x+cx,y+cy,image[x][y]); setcolor(9); disp_hz16("回车键结束",10,430,20); getch(); for(i=0;i<25;i++) printf("\n"); } void swap_fit(n1,n2) int n1,n2; { unsigned char c; double f; int i; for(i=0;i fitness[i]) swap_fit(j,i); max_fit=fitness[0]; avg_fit=0; for(i=0;i =0 && x2<128 && y2>=0 && y2<128) sum=sum+(double)image[x2][y2]; } fitness[i]=sum/fitmax; } } void g_disp_max(flg) int flg; { int i,xsft,ysft,angle,x,y; if(flg==1) { for(i=0;i =0 && x<128 && y>=0 && y<128) g_pset(XUL+x,YUL+y,image[x][y]); } } gene_to_param(0,&xsft,&ysft,&angle); for(i=0;i =0 && x<128 && y>=0 && y<128) g_pset(XUL+x,YUL+y,9); } } void make_offspring(g1,g2,g3,g4) int g1,g2,g3,g4; { int i,rnd,rndmax; two_crossover(gene,g1,g2,g3,g4,G_LENGTH); rndmax=(int)(10000.0*M_RATE); for(i=0;i