簡體   English   中英

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作為答案?

所以這是您提供cv2模塊后的優化答案。

你的答案顯示了這個問題:

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

這意味着,正如您所說的那樣,它是一個無符號的8位整數,只能取0到025之間的值。

但是,您可以自動將數組轉換為更好的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數組的多功能性和實用性。

要了解更多關於dtypes以及如何使用它們,鏈接到SciPy的文檔是在這里

上述數字的數據類型是unsigned int8 ,可以取0 to 255值。

238 - 254 = -16 ,並且因為uint8沒有負數的表示,所以它給出了240作為答案。

而是將數字轉換為int8 (-128 to 127)int16 (-32768 to 32767)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM