获取 2 像素之间的差异并处理溢出错误



我试图找到同一图像的 2 个像素、pq之间的差异。这是我的工作:

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

为什么会出现此警告?图像的dtypeuint8。如何找到两个像素之间的差异?

另外,为什么以下 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)

最新更新