最小距离法监督分类

来源:互联网 发布:工作日志管理系统源码 编辑:程序博客网 时间:2024/05/29 10:33

/     int Snum;//分类数目
     fscanf(fp,"%d",&Snum);//从分文件中读取分类数目
  int *SampleNum;//每类像元的个数
  int i,j;
     for(Snum,SampleNum=new int[Snum], i=0;i<Snum;i++)
  {
   fscanf(fp,"%d",&j);
   fscanf(fp,"%d",&SampleNum[i]);//读取每个样本的数目
  }
  //为各类设置颜色
  COLORREF*Setcolor=new COLORREF[Snum];//声请每类的颜色值
  memset(Setcolor,0,sizeof(COLORREF)*Snum);
  for(int i2=0;i2<Snum;i2++)
  {
   CColorDialog ColorDlg;
   if(ColorDlg.DoModal()==IDOK)
   {
   Setcolor[i2]=ColorDlg.GetColor();//获得颜色数目
   }
  }
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~求各类在各波段的均值
  double **Average=new double *[Snum];//声请各类均值数组
  for(int c=0;c<Snum;c++)
  {
   Average[c]=new double[band];//c为一个类别,Average[c]表示为各类别在各波段的均值
   memset(Average[c],0,sizeof(double)*band);//讲个波段的均值置零
  }
  for(int i1=0;i1<Snum;i1++)
  {
        double** Sample=new double*[band];//六波段总的每类像元数
  for(j=0;j<band;j++)//第一个标识符表示波段,第二个标识符表示类别的样本
   //合起来标识在第j个波段底i个类别的样本坐标
  {
   Sample[j]=new double[SampleNum[i1]];//声请各个波段的样本类别
   memset(Sample[j],0,sizeof(double)*SampleNum[i1]);
  }
  CPoint *point=new CPoint[SampleNum[i1]];//存点位置
  int position;
  for(int m=0;m<SampleNum[i1];m++)
  {
   fscanf(fp,"%d",&point[m].x);
   fscanf(fp,"%d",&point[m].y);
   position=(point[m].y-1)*width+(point[m].x-1);
   for(int n=0;n<band;n++)
    Sample[n][m]=Input[n][position];//保存坐标点的像素值
  }
  //??????????????????????????????
  for(int x=0;x<band;x++)
  {  
   DOUBLE temp=0;
   for(int y=0;y<SampleNum[i1];y++)
   {
    temp=temp+Sample[x][y];
   }
   Average[i1][x]=temp/SampleNum[i1];//第i类在第x波段上的均值
  }
  delete []Sample;
  delete []point;
  }
  //Average[i][x]为第i类在第x波段上的均值,i从1到Snum(5类),x从0到5
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     //为每一个像元归类
  CWindowDC dc(this);
  BYTE *D=new BYTE[Snum];//开辟一个距离数组空间,便于比较
     memset(D,0,sizeof(BYTE)*Snum);
  BYTE *Output=new BYTE[width*height];
     memset(Output,0,sizeof(BYTE)*width*height);
  for(int k=0;k<width*height;k++)//像元个数扫描整个图像数据
  {
       for(int i3=1;i3<=Snum;i3++)//类别数,扫描整个类别空间
    {
        for(j=0;j<band;j++)//波段数,扫描整个波段数据
     {
      //Input[j][k]表示在第j波段第第k个像元的像素值
                   D[i3]=D[i3]+fabs(Input[j][k]-Average[i3][j]);
       //计算第K个像元在整个波段空间的距离与各样本类别的距离大小
     }
    }
       int Min=D[1];//在第K个像元的前提下比较第k个像元的距离大小值,并保存最小值和其ID号
       int  belong=1;//像元属于哪一类
       for(int i4=2;i4<=Snum;i4++)
    {
        if(Min>D[i4])//循环迭代类别,比较Snum次
     {
      Min=D[i4];//保存最小的那个距离
      belong=i4;//保存类别标识
     }
    }
    Output[k]=belong;//输出途中记录类别标识,具有一一对应关系
  }
  for(int i5=0;i5<height;i5++)
  {
   for(int j1=0;j1<width;j1++)
   {
    dc.SetPixel(j1,i5,Setcolor[Output[i5*width+j1]]);
    //由于类别标识与颜色间的一一对应关系,直接获得标识输出
   }
  }

 }