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;ifitness[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