最小距离监督分类算法实现
最小距离监督分类算法实现
void CSupervised::MinimumDistance(int Rows, int Cols, int Bands, int number, float AverageValue[][200], LPSTR *pPointer)
{
float *Gray = new float[number];
/*欧式距离
float *s = new float[number];
*/
float *Distance = new float[number];
unsigned char *array = new unsigned char[Rows*Cols];
float min;
CFile g;
CString filename;
filename='min_class';//文件储存位置
if(!g.Open(filename,CFile::modeCreate|CFile::modeWrite))
{
AfxMessageBox("输出文件打开失败!",MB_ICONHAND);
return;
}
//对每个像素进行处理
for(int data=0;data<Rows*Cols;data++)
{
//数组清零便于计算
for(int k=0;k<number;k++)
{
Gray[k]=0;
Distance[k]=0;
}
//计算结果进行分类 (计算各个点到样本区的距离)
min=100000;
for(int i=0;i<number;i++)
{
/////////////////////////绝对值距离////////////////////////
for(int j=0;j<Bands;j++)
{
Gray[i]=float(fabs(*pPointer[j]-AverageValue[i][j]));
Distance[i]=Distance[i]+Gray[i];
}
///////////////////////////////////////////////////////////
/*
/////////////////////////欧式距离////////////////////////
for(int j=0;j<Bands;j++)
{
Gray[i]=float(fabs(*pPointer[j]-AverageValue[i][j]));
s[i]=sqrt(pow(Gray[1],2)+pow(Gray[0],2));
Distance[i]=Distance[i]+Gray[i];
}
///////////////////////////////////////////////////////////
*/
if(Distance[i]<=min)
min=Distance[i];
}
//比较距离,进行分类
for(int n=0;n<number;n++)
{
if(min==Distance[n])
{
array[data] = n+1;
}
}
//array[data]=*pPointer[0];
//循环一次,指针移动一位
for(int ban=0;ban<Bands;ban++)
{
pPointer[ban]++;
}
}
//进行图像的写入
g.Write(array,Rows*Cols);
delete [] Gray;
delete [] Distance;
delete [] array;
g.Close();
AfxMessageBox("最小距离分类数据处理完毕!");
}
不同训练样本对分类结果的影响
不同的训练样本会对最小距离的监督分类法结果产生影响,因为该方法是通过计算待分类像素与各个样本之间的距离来确定分类的。不同的训练样本会对距离计算产生影响,因为每个样本的特征不同,计算出的距离值也不同,从而影响最终的分类结果。如果训练样本的数量不足或者不具有代表性,也会导致分类结果不准确。因此,选择合适的训练样本,以及样本的数量和质量对于最小距离的监督分类法的分类效果至关重要。
原文地址: https://www.cveoy.top/t/topic/jniE 著作权归作者所有。请勿转载和采集!