[英]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.