C++ NDVI 计算函数:从 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();
}

CFile 读写函数说明:

  1. CFile::modeReadWrite: 打开文件以进行读写操作。
  2. CFile::modeCreate: 如果文件不存在,则创建一个新文件。
  3. CFile::modeWrite: 打开文件以进行写操作。
  4. fReadFile.Seek(offset, origin): 设置文件指针的位置,offset 为偏移量,origin 为起始位置(CFile::begin 为文件开头,CFile::current 为当前位置,CFile::end 为文件结尾)。
  5. fReadFile.Read(buffer, count): 从文件中读取 count 个字节到 buffer 中。
  6. fWriteFile.Write(buffer, count): 将 buffer 中的 count 个字节写入文件中。
  7. delete[] ptr: 释放动态分配的内存。

函数功能:

该函数用于从 TM 图像数据中计算 NDVI 值,并将其写入新的文件。函数接收 TM 图像文件名、波段数、图像宽度、高度和数据类型作为参数,并返回 NDVI 数据文件。

算法流程:

  1. 从 TM 图像文件中读取红波段和近红外波段数据。
  2. 使用公式 NDVI = (Near-Infrared - Red) / (Near-Infrared + Red) 计算 NDVI 值。
  3. 将 NDVI 值写入新的文件。

注意事项:

  • 该函数假设输入图像数据为 unsigned char 类型,并且 NDVI 值为 float 类型。
  • 在读取和写入文件之前,需要确保文件存在且具有正确的权限。
  • 需要释放动态分配的内存,以避免内存泄漏。
C++ NDVI 计算函数:从 TM 图像生成 NDVI 数据

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

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