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