Python:减法时溢出

时间:2015-09-08 05:36:43

标签: python integer-overflow

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

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

238 - 254 = 240

我该怎么做才能防止这种溢出,而是以-16作为答案?

2 个答案:

答案 0 :(得分:2)

因此,在您提供cv2模块之后,这是优化的答案。

您的回答显示了问题:

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

这意味着,正如您所说的那样,它是一个无符号的8位整数,只能取0到55的值。

但是,您可以自动将数组转换为更好的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

简而言之,您可以使用NumPy的dtypes手动指定来自uint8-64和int8-64(可能更多)的dtypes,而不是使用Python的内置类型转换。 newarray = array.astype(' type'),使用新的dtype创建一个紧凑而高效的数组。您还可以指定其他类型,例如' int',' bool',' object'等,显示NumPy数组的多功能性和实用性。

要了解有关dtypes以及如何使用它们的更多信息,SciPy文档的链接为here

答案 1 :(得分:1)

上述数字的数据类型为unsigned int8,可以从0 to 255获取值。

238 - 254 = -16,由于uint8没有负数的代表,因此给出了240作为答案。

相反,请将数字转换为int8 (-128 to 127)int16 (-32768 to 32767)