Python : 减法溢出
Python : overflow while subtraction
import cv2
image1 = cv2.imread('one.jpg', 0)
image2 = cv2.imread('two.jpg', 0)
diff = image1 - image2
对于上面的代码,对于某些值,由于减法而发生溢出。
例如:
238 - 254 = 240
我该怎么做才能防止这种溢出,而不是得到 -16
作为答案?
上述数字的数据类型为unsigned int8
,可以从0 to 255
.
取值
238 - 254 = -16
,并且由于 uint8
没有负数表示,所以它给出 240
作为答案。
相反,将数字转换为 int8 (-128 to 127)
或 int16 (-32768 to 32767)
。
所以这是你提供cv2模块后的优化答案。
您的回答说明了问题:
>>> import cv2
>>> img = cv2.imread('myimage.jpg', 0)
>>> img.dtype
dtype('uint8')
这意味着,正如您正确指出的那样,它是一个无符号的 8 位整数,只能取 0-255 之间的值。
但是,您可以自动将数组转换为更好的数据类型,这比执行 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数组的通用性和实用性。
要了解有关 dtype 及其使用方法的更多信息,SciPy 文档的 link 是 here。
import cv2
image1 = cv2.imread('one.jpg', 0)
image2 = cv2.imread('two.jpg', 0)
diff = image1 - image2
对于上面的代码,对于某些值,由于减法而发生溢出。 例如:
238 - 254 = 240
我该怎么做才能防止这种溢出,而不是得到 -16
作为答案?
上述数字的数据类型为unsigned int8
,可以从0 to 255
.
238 - 254 = -16
,并且由于 uint8
没有负数表示,所以它给出 240
作为答案。
相反,将数字转换为 int8 (-128 to 127)
或 int16 (-32768 to 32767)
。
所以这是你提供cv2模块后的优化答案。
您的回答说明了问题:
>>> import cv2
>>> img = cv2.imread('myimage.jpg', 0)
>>> img.dtype
dtype('uint8')
这意味着,正如您正确指出的那样,它是一个无符号的 8 位整数,只能取 0-255 之间的值。
但是,您可以自动将数组转换为更好的数据类型,这比执行 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数组的通用性和实用性。
要了解有关 dtype 及其使用方法的更多信息,SciPy 文档的 link 是 here。