C++实现光谱角遥感影像监督分类算法
#include <cmath>
#include <fstream>
#include <string>
// 假设你已经定义了 CFile 和 AfxMessageBox
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('光谱角分类数据处理完毕!');
}
代码说明:
- 函数定义:
SpectralAngle函数实现了光谱角分类算法,它接受图像的行数、列数、波段数、类别数、平均值数组以及指向像素数据的指针作为输入。 - 计算光谱角距离: 代码中使用了一个循环来遍历所有类别,并计算每个像素与每个类别之间的光谱角距离。
- 寻找最小距离类别: 找到最小距离后,将该像素分类到对应的类别。
- 写入文件: 最后,将分类结果写入到指定的文件中。
注意:
- 这段代码需要配合你的具体项目进行修改和完善,例如CFile和AfxMessageBox的定义。
- 这段代码仅仅是光谱角分类算法的核心部分,你需要根据实际情况添加数据读取、预处理、结果展示等功能。
希望这段代码能够帮助你理解光谱角遥感影像监督分类算法的实现过程。
原文地址: https://www.cveoy.top/t/topic/jpGw 著作权归作者所有。请勿转载和采集!