一个使用模板函数进行遥感图像处理易犯但不易调试的错误

最近在写点程序,计算相关系数时,和ENVI差别很大,本来以为ENVI做了特别处理,后来拿我以前写的软件算也是和ENVI一样,这把我搞蒙了。

主要用GDAL读图像,然后用模板的方法写处理函数,T1,T2表示数据的数据类型可为char,unsigned int ,int,float,double等。

template<class T1,class T2>
double cof3(int bandx,int bandy,GDALDataset*pDataSet,void*pData)
{

....

double x2sum=0;

double y2sum=0;

//图像读取

T1 *xBuffer=new T1[nw*READROW];

T2 *yBuffer=new T2[nw*READROW];

pDataSet->GetRasterBand(bandx)->RasterIO(GF_Read,nxOff,nyOff,nw,READROW,(void*)xBuffer,nw,READROW,xDataType,0,0);
  pDataSet->GetRasterBand(bandy)->RasterIO(GF_Read,nxOff,nyOff,nw,READROW,(void*)yBuffer,nw,READROW,yDataType,0,0);

...
x2sum+=xBuffer[i*nw+j]*xBuffer[i*nw+j];

y2sum+=yBuffer[i*nw+j]*yBuffer[i*nw+j];

....

}

到这里如果你能发觉问题,那回一下贴让我知道啊,哈哈,那就说明你C++功底扎实。

 

 

 

 

 

 

 

问题在哪里呢?

假如x波段和y波段的数据类型都是GDT_UInt16的,而且xBuffer[i*nw+j]=65535,yBuffer[i*nw+j]=65535,那么x2sum=y2sum=-131071

为什么?

因为两个unsigned int相乘还是unsigned int,但是65535*65535已经超出unsigned int的表示范围了,所以成了负数。

 

解决方法呢?

写出下面这样就行了

   x2sum+=xBuffer[i*nw+j]*(double)xBuffer[i*nw+j];

   y2sum+=yBuffer[i*nw+j]*(double)yBuffer[i*nw+j];

 

所以写两个整数的乘法时,要特别注意,一不小心就会越界。

 

 

你可能感兴趣的:(一个使用模板函数进行遥感图像处理易犯但不易调试的错误)