python : overflow while subtraction

标签 python integer-overflow

import cv2
image1 = cv2.imread('one.jpg', 0)
image2 = cv2.imread('two.jpg', 0)
diff   = image1 - image2

对于上面的代码,对于某些值,由于减法而发生溢出。 例如:

238 - 254 = 240

我该怎么做才能防止这种溢出并得到 -16 作为答案?

最佳答案

所以这里是提供 cv2 模块后的优化答案。

您的回答说明了问题:

>>> import cv2
>>> img = cv2.imread('myimage.jpg', 0)
>>> img.dtype
dtype('uint8')

这意味着,正如您正确指出的那样,它是一个无符号的 8 位整数,只能取 0-255 之间的值。

但是,您可以自动将数组转换为更好的 dtype,这比 int(value) 的内存效率高得多。 例如……

>>> img[0][0] 
0
>>> img[0][0] -= 1
>>> img[0][0]
255 # since it's uint8
>>> img[0][0] += 1
>>> img2 = img.astype('uint16')
>>> img2[0][0] -= 1
>>> img2[0][0]
65535 # since it's uint16

您还可以转换为 uint8、16、32 和 64 以外的其他类型。例如...

>>> img3 = img2.astype('int64') # signed int64
>>> img3[0][0] -= 7000000
>>> img3[0][0]
-6934465

简而言之,您可以通过指定 newarray = array.astype('type '),使用新的 dtype 创建一个紧凑高效的数组。您还可以指定其他类型,例如 'int'、'bool'、'object' 等,显示 NumPy 数组的通用性和实用性。

要阅读更多关于数据类型以及如何使用它们的信息,SciPy 文档的链接是 here .

关于 python : overflow while subtraction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32449963/

相关文章:

c - 数组索引上的整数溢出

c++ - 为什么将除法改为右移时会发生有符号溢出?

java - Java 如何处理整数下溢和上溢,您将如何检查它?

javascript - 为什么 << 32 在 javascript 中不会导致 0?

python - 为什么我不能在没有手动编辑的情况下粘贴 Pythons REPL 的输出?

python - 我在定义函数时做错了什么,导致错误 "numpy.ndarray"不可调用?

python - 将列表 append 到 python 中的列表列表中会更改所有子列表

python - 如何检测一个二维数组是否在另一个二维数组中?

python - Django ContentFile get_available_name() 得到了一个意外的关键字参数 'max_length'

c++ - C++ 中的整数溢出和整数乘法