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)的函数,函数名为 NDVICal。
// 参数 m_pathname 是输入图像的路径,Bands 是波段数,Width 和 Height 分别是图像的宽和高,DataType 是图像类型。

// 首先,根据图像类型确定红光和近红外波段的位置,这里以 TM 影像为例,红光波段为第三个波段,近红外波段为第五个波段。

// 然后,定义输出文件名为 'NDVI',并分配内存空间存储 NDVI 结果、红光和近红外波段的像元值。

// 接着,打开输入文件并读取红光和近红外波段的像元值。

// 接下来,对每个像元计算 NDVI 值,并将结果写入输出文件。

// 最后,释放内存空间并关闭文件。

// 注:NDVI 的计算公式为 (NIR-Red) / (NIR+Red),其中 NIR 为近红外波段的像元值,Red 为红光波段的像元值。
C++ NDVI 计算函数:NDVICal 实现

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

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