【问题标题】:Python : overflow while subtractionPython:减法时溢出
【发布时间】:2015-09-08 05:36:43
【问题描述】:
import cv2
image1 = cv2.imread('one.jpg', 0)
image2 = cv2.imread('two.jpg', 0)
diff   = image1 - image2

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

238 - 254 = 240

我能做些什么来防止这种溢出,而是得到-16 作为答案?

【问题讨论】:

  • signed int iso unsigned byte as type?
  • 现在是 unsigned int8.我要签名吗?
  • 是的,这是一个无符号字节。
  • 我该怎么做?一些 numpy 函数?
  • 只要值是 Python 整数,就不会有任何问题。如果您正在处理 c_short 或 c_ushort 等 ctypes,您将遇到问题。 Python 甚至还会自动将整数转换为长整数,或者如果值超过限制,则自动使用长整数。 docs.python.org/2.4/lib/typesnumeric.html 简而言之,我怀疑您是在“纯 Python”中执行此操作。也许一些代码会有所帮助?

标签: python integer-overflow


【解决方案1】:

所以这是您提供 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 数组的多功能性和实用性。

要详细了解 dtypes 以及如何使用它们,SciPy 文档的链接是here

【讨论】:

    【解决方案2】:

    以上数字的数据类型是unsigned int8,可以取值来自0 to 255

    238 - 254 = -16,因为uint8 没有负数的表示,所以它给出了240 作为答案。

    改为将数字转换为int8 (-128 to 127)int16 (-32768 to 32767)

    【讨论】:

    • Nancy 请分享您用于设置的实际代码,包括您正在使用的库。正如@alexanderhuszag 所提到的,似乎可以肯定您已经将问题从代码中抽象出来了。您图书馆的未来用户可能会错过没有名称的解决方案,并且它可能不适用于其他图书馆的用户。此外,如果您使用 numpy,将数字转换为 python 整数可能不是最佳解决方案。
    • @kobejohn 我正在使用cv2 库。 cv2.imread() 函数将值作为 uint8
    • 感谢您更新问题!现在清楚多了。
    • 转换为 int8 仍然可能导致上溢或下溢,因为两个无符号 8 位值之间的最大距离可以是 255(或 -255)。
    • @BlackJack 当然可以。在我的问题中,int8 达到了目的。
    猜你喜欢
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多