光谱角监督分类算法 - C++ 实现
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('最小距离分类数据处理完毕!');
}
仿照上述代码,编写光谱角监督分类算法内容:
```cpp
void CSupervised::SpectralAngle(int Rows, int Cols, int Bands, int number, float AverageValue[][200], LPSTR *pPointer)
{
float *Gray = new float[number];
float *Distance = new float[number];
unsigned char *array = new unsigned char[Rows*Cols];
float min;
CFile g;
CString filename;
filename='spectral_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++)
{
//计算向量夹角余弦值
float cos_angle = 0;
float norm1 = 0, norm2 = 0;
for(int j=0;j<Bands;j++)
{
Gray[i]=float(*pPointer[j]*AverageValue[i][j]);
norm1 += pow(*pPointer[j], 2);
norm2 += pow(AverageValue[i][j], 2);
}
norm1 = sqrt(norm1);
norm2 = sqrt(norm2);
cos_angle = Gray[i] / (norm1 * norm2);
//计算向量夹角
float angle = acos(cos_angle);
Distance[i] = angle;
if(Distance[i]<=min)
min=Distance[i];
}
//比较距离,进行分类
for(int n=0;n<number;n++)
{
if(min==Distance[n])
{
array[data] = n+1;
}
}
//循环一次,指针移动一位
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/jpDP 著作权归作者所有。请勿转载和采集!