该函数实现了光谱角分类算法,输入参数包括图像的行数 (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("光谱角分类数据处理完毕!");
}
光谱角分类算法实现:C++ 代码详解

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

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