NDVI 计算 - C++ 代码解析
该代码片段定义了一个名为 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 数组与原始图像具有相同的行列数。
原文地址: https://www.cveoy.top/t/topic/jlN3 著作权归作者所有。请勿转载和采集!