编程语言
首页 > 编程语言> > Python:减法时溢出

Python:减法时溢出

作者:互联网

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’),而不是使用Python的内置类型转换,而可以使用NumPy的dtypes从uint8-64和int8-64(甚至更多)中手动指定dtypes,使用新的dtype创建紧凑高效的数组.您还可以指定其他类型,例如’int’,’bool’,’object’等,以显示NumPy数组的多功能性和实用性.

要了解有关dtype以及如何使用它们的更多信息,指向SciPy文档的链接是here.

标签:integer-overflow,python
来源: https://codeday.me/bug/20191119/2038628.html