该代码片段定义了一个名为 CBandMath 的类的 NDVICal 方法,该方法用于计算 NDVI 指数。方法接受图像路径、波段数量、宽度、高度和数据类型作为输入参数。

代码首先根据数据类型确定红色波段和近红外波段的索引。然后,代码打开输入图像文件和输出文件。接着,代码读取红色波段和近红外波段的数据,并将它们存储在数组中。

接下来,代码遍历每个像素,使用公式 (NIR - Red) / (NIR + Red) 计算 NDVI 值。计算后的 NDVI 值存储在一个新的数组中。

最后,代码将 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 行列与原图相同。代码中,读取的红色波段和近红外波段数据与原始图像的尺寸相同,并且 NDVI 计算是在每个像素的基础上进行的,因此最终的 NDVI 数组与原始图像具有相同的行列数。

NDVI 计算 - C++ 代码解析

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

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