envi中用ndvi工具算ndvi,值就是正确的,[-1,1]。
但是用bandmath算出来的值就是[0-255].
百思不得其解到底为什么?
后来终于看到有人在说在Arcgis里算ndvi值得时候要把类型改成float,终于明白了是数据类型的问题。
原因:影像的DN值是无符号整型(uint),但是计算机表示的时候默认是整型(int),这就出现了一个问题,当两个unit相比如:
unit a=4;
unit b=5;
那么归一化指数c=(a-b)/(a+b)=(4-5)/(4+5)=-1/9.但是由于unit/unit=unit,而unit类型又不能表示负数。所以怎么办呢?那就是把unit强制转化为int,因此:
unit类型的-1/9就被强制转化为了int类型的4294967295/9,也就是说:
uint c=4294967295;
(int)c=-1
为了验证这个想法对不对,在vs2013上试了一下,结果如下:
找到原因就好解决题目中的这个问题了,我们也来个强制类型转换嘛。
在波段计算器中这样写,以landsat5计算NDVI为例,其他指数类似:
NDVI=(float(TM4)-float(TM3))/(float(TM4)+float(TM3))
或者
NDVI=(TM4*1.0-TM3*1.0)/(TM4*1.0+TM3*1.0)
或者更简单,就用ndvi这个工具,改一下波段就可以了,如要计算MNDWI=(2-5)/(2+5)
(结果就是你想要的结果,这是因为ndvi工具自行进行了数据类型的强制转换)