带有np.divide()的Numpy溢出。运行时警告:在ushort_标量中遇到溢出

2024-05-03 08:01:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在2个图像上运行以下代码:

ndvi = np.divide(img8 - img4, img8+img4)

invalid = (ndvi > 1).any()
if invalid:
    print("Stopping Execution")
    print(ndvi)

img8img4是两个图像,都有正值。 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

值本身并不会太大而导致溢出,但当数组大小变大时,会发生溢出


Tags: 代码图像元素if定义npanyprint
1条回答
网友
1楼 · 发布于 2024-05-03 08:01:35

当从一个小的数中减去一个大的数并且两者都是unitXX时,您会得到一个溢出(实际上是一个underflow),结果是负数的模XX,这是一个大的数。
这是因为uint不能表示负数,而是表示一个大的正数

这个模实际上是把maxint(==65535)加到负数上

在本例中,对于指定的索引

img8[88][118]-img4[88][118] == 1462 - 1652 == -190 == 65535 - 190 = 65345

将其除以1462 + 1652 == 3114得到20.984264611432241490044958253051


解决方案:

Convert the dtypes to float在分割之前,通常使用图像的浮点,而不是uint

浮点数(通常)不存在简单减法的下溢问题,因为它们也是用来表示负数的

同样有效的方法是使用int而不是uint,但为了您自己的利益,请坚持使用浮动

相关问题 更多 >