我正在2个图像上运行以下代码:
ndvi = np.divide(img8 - img4, img8+img4)
invalid = (ndvi > 1).any()
if invalid:
print("Stopping Execution")
print(ndvi)
img8
和img4
是两个图像,都有正值。
ndvi
是(img8-img4)/(img8+img4)
因此,根据定义,ndvi的所有元素应介于-1和1之间。 但我得到了一些价值观>;一,
此上下文中所有变量的数据类型均为“uint16”
当我检查无效值的索引并运行单个代码时:
temp = (img8[88][118]-img4[88][118])/(img8[88][118]+img4[88][118])
我得到以下警告:
<stdin>:1: RuntimeWarning: overflow encountered in ushort_scalars
这些数值是: img8[88][118]=1462 img4[88][118]=1652
值本身并不会太大而导致溢出,但当数组大小变大时,会发生溢出
当从一个小的数中减去一个大的数并且两者都是
unitXX
时,您会得到一个溢出(实际上是一个underflow),结果是负数的模XX,这是一个大的数。这是因为
uint
不能表示负数,而是表示一个大的正数这个模实际上是把maxint(==65535)加到负数上
在本例中,对于指定的索引
将其除以
1462 + 1652 == 3114
得到20.984264611432241490044958253051
解决方案:
Convert the dtypes to float在分割之前,通常使用图像的浮点,而不是uint
浮点数(通常)不存在简单减法的下溢问题,因为它们也是用来表示负数的
同样有效的方法是使用
int
而不是uint
,但为了您自己的利益,请坚持使用浮动相关问题 更多 >
编程相关推荐