/ 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]]);
//由于类别标识与颜色间的一一对应关系,直接获得标识输出
}
}
}