光谱角分类算法实现:C++ 代码详解
该函数实现了光谱角分类算法,输入参数包括图像的行数 (Rows)、列数 (Cols)、波段数 (Bands)、样本区数量 (number)、各样本区的平均值 (AverageValue) 以及图像数据的指针数组 (pPointer)。函数首先创建了一些变量,包括存储每个像素的灰度值的数组 (Gray)、每个像素到样本区的距离的数组 (Distance)、以及存储分类结果的数组 (array)。接着,函数对每个像素进行处理,首先将灰度值和距离数组清零,然后计算每个像素到每个样本区的距离,并将距离最小的样本区作为该像素的分类结果。最后,函数将分类结果写入到文件中。
具体实现中,函数使用了光谱角距离公式来计算每个像素到样本区的距离。该公式中包括了分子和两个分母,分别计算了像素和样本区的光谱角余弦值。计算完成后,函数将距离最小的样本区作为该像素的分类结果。值得注意的是,函数中使用了指针数组来遍历图像数据,以提高效率。
最后,函数将分类结果写入到文件中,并释放了动态分配的内存。函数执行完成后,会弹出一个提示框,提示用户分类数据处理完毕。
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_angle_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 numerator = 0, denominator1 = 0, denominator2 = 0;
for (int j = 0; j < Bands; j++)
{
numerator += (*pPointer[j] * AverageValue[i][j]);
denominator1 += pow(*pPointer[j], 2);
denominator2 += pow(AverageValue[i][j], 2);
}
Distance[i] = acos(numerator / (sqrt(denominator1)*sqrt(denominator2)));
///////////////////////////////////////////////////////////
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/jpGZ 著作权归作者所有。请勿转载和采集!