我试图找到同一图像的 2 个像素、p
和q
之间的差异。这是我的工作:
import cv2
import numpy as np
img = cv2.imread("coin.png",0)
diff = np.absolute(img[0][0] - img[1][45])
这导致:
RuntimeWarning: overflow encountered in ubyte_scalars
为什么会出现此警告?图像的dtype
是uint8
。如何找到两个像素之间的差异?
另外,为什么以下 2 个方程的结果不同?
np.absolute(img[0][0] - img[1][45])
# results in 166
和
np.absolute(img[1][45] - img[0][0])
# results in 90
这是怎么回事?这不是正常的减法吗?
正如您已经注意到的,图像以 1 字节无符号整数uint8
加载
。所以可能会发生溢出 - 这与打印绝对值的两个方程不同的原因相同。
您可以简单地投射到int
来解决问题。
import numpy as np
a = np.asarray([121], dtype=np.uint8)
b = np.asarray([93], dtype=np.uint8)
print(abs(a - b)) # prints [28]
print(abs(b - a)) # prints [228]
a = a.astype(int)
b = b.astype(int)
print(abs(a - b)) # prints [28]
print(abs(b - a)) # prints [28]
在计算绝对差值时,您可以通过从较大的数字中减去较小的数字来避免溢出:
res = np.maximum(x,y) - np.minimum(x,y)