以下是使用 C++ 代码实现的 NDVI 计算函数,用于处理 TM 数据。该函数通过读取 TM 数据的红波段和近红外波段,计算 NDVI 值并写入文件。

void CBandMath::NDVICal(CString m_pathname, int Bands, int Width, int Height, int DataType)
{
	int fRed, fNearRed;

	if (DataType == 1) // TM
	{
		fRed = 3;
		fNearRed = 5;
	}

	CString m_OutFile;

	float *NDVIWr = new float[Height * Width];
	unsigned char *Red = new unsigned char[Height * Width];
	unsigned char *NearRed = new unsigned char[Height * Width];

	CFile fReadFile, fWriteFile;
	if (!fReadFile.Open(m_pathname, CFile::modeReadWrite)) // 打开图像文件(参数)
	{
		AfxMessageBox("不能打开所读文件!");
		return;
	}
	// 打开写入文件(其它类的变量)
	if (!fWriteFile.Open("NDVI", CFile::modeCreate | CFile::modeWrite))
	{
		AfxMessageBox("请选择输出文件!");
		return;
	}

	fReadFile.Seek((fRed - 1) * Height * Width, CFile::begin);
	fReadFile.Read(Red, Height * Width);

	fReadFile.Seek((fNearRed - 1) * Height * Width, CFile::begin);
	fReadFile.Read(NearRed, Height * Width);

	for (int k = 0; k < Height * Width; k++)
		NDVIWr[k] = ((float)NearRed[k] - Red[k]) / (NearRed[k] + Red[k]);

	fWriteFile.Write(NDVIWr, sizeof(float) * Height * Width);

	delete[] NDVIWr;
	delete[] Red;
	delete[] NearRed;

	fReadFile.Close();
	fWriteFile.Close();

}

计算出来的 NDVI 的行列

由于代码中没有明确给出行列信息,无法确定计算出来的 NDVI 的行列分别是多少。需要在代码中添加相应的行列信息才能确定。例如,在函数中添加如下代码以确定行列信息:

// 获取图像宽度和高度
int width = Width;
int height = Height;

然后,就可以使用 widthheight 来确定 NDVI 的行列信息。

C++ NDVI 计算函数 - TM 数据处理

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

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