#include <math.h>
#include <afx.h> // 替换为MFC相关头文件

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;
    }

    // 计算参考光谱的几何平均向量
    float *reference = new float[Bands];
    for (int i = 0; i < Bands; i++)
    {
        float sum = 0;
        for (int j = 0; j < number; j++)
        {
            sum += AverageValue[j][i];
        }
        reference[i] = pow(sum / number, 1.0 / Bands);
    }

    // 对每个像素进行处理
    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(reference[j], 2);
            }
            Distance[i] = acos(numerator / (sqrt(denominator1) * sqrt(denominator2)));

            if (Distance[i] <= min)
                min = Distance[i];
        }

        // 比较距离,进行分类
        for (int n = 0; n < number; n++)
        {
            // 设置阈值,若夹角小于阈值则进行分类
            float threshold = 0.5; // 可根据实验结果调整
            if (Distance[n] <= threshold)
            {
                array[data] = n + 1;
                break; //找到最近类别后跳出循环
            }
        }

        // 循环一次,指针移动一位
        for (int ban = 0; ban < Bands; ban++)
        {
            pPointer[ban]++;
        }
    }
    // 进行图像的写入
    g.Write(array, Rows * Cols);
    delete[] Gray;
    delete[] Distance;
    delete[] array;
    delete[] reference;

    g.Close();
    AfxMessageBox('光谱角分类数据处理完毕!');
}

基于光谱角距离的遥感图像监督分类算法

1. 算法原理

光谱角距离(Spectral Angle Mapper, SAM)是一种常用的光谱相似性度量方法,用于比较两个光谱向量之间的夹角。在遥感图像分类中,可以利用光谱角距离来度量像元光谱与参考光谱之间的相似性,从而实现对未知像元的分类。

2. 实现步骤

基于光谱角距离的遥感图像监督分类算法主要包括以下步骤:

  1. 参考光谱获取: 选择具有代表性的区域作为训练样本,并计算每个类别样本的几何平均向量作为参考光谱。
  2. 光谱角距离计算: 计算每个像元光谱与所有参考光谱之间的光谱角距离。
  3. 阈值设置: 针对不同的类别,根据实际情况设置不同的阈值。
  4. 像元分类: 将每个像元分类到与其光谱角距离最小且小于阈值的类别中。

3. 代码示例

上述代码展示了使用C++实现光谱角分类算法的示例,主要步骤包括:

  1. 计算参考光谱的几何平均向量
  2. 遍历每个像元,计算其与每个参考光谱的光谱角距离
  3. 设置阈值,将像元分类到满足条件的类别
  4. 将分类结果写入文件

4. 算法优势

光谱角距离算法具有以下优点:

  • 对光谱值的绝对差异不敏感,更关注光谱形状的相似性
  • 计算简单,易于实现

5. 应用领域

光谱角距离算法广泛应用于以下领域:

  • 土地覆盖分类
  • 植被类型识别
  • 岩石矿物识别

总结

光谱角距离是一种有效的光谱相似性度量方法,可以用于遥感图像监督分类。通过选择合适的参考光谱和阈值,可以获得较好的分类效果。

基于光谱角距离的遥感图像监督分类算法

原文地址: https://www.cveoy.top/t/topic/jpG0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录