Python 数组减法循环返回高数而不是给出负值

Python array subtraction loops back to high number instead of giving negative value

这是我的代码: 我正在使用 numpy 和 opencv

q = np.array(image)
q = q.reshape(-1, q.shape[2])
r = np.subtract(q,p)
print r

基本上,如果我的 q 数组中的值大于 p,减法循环回到 256 并减去那里剩下的内容。如果减法变为负数,我宁愿得到 0 的值。有人知道这样做的好方法吗?

您可以更改为支持负整数的 int16 并将负值设置为 0,您的值正在换行,因为您有 uint8's:

arr1 = np.array([100, 200, 255],dtype=np.int16)
arr2 = np.array([180, 210, 100],dtype=np.int16)

sub_arr = np.subtract(arr1, arr2)
sub_arr[sub_arr < 0] = 0
print(sub_arr)
[  0   0 155]

要更改您的数组,您可以使用 array.astype(np.int16)uint8 更改为 np.int16 并在减去后使用相同的方法再次更改回来。

arr1 = np.array([100, 200, 255],dtype=np.uint8)
arr2 = np.array([180, 210, 100],dtype=np.uint8)
_arr2 = arr2.astype(np.int16)
sub_arr = np.subtract(arr1, _arr2)

sub_arr[sub_arr < 0] = 0
sub_arr = sub_arr.astype(np.uint8)
print(sub_arr)

或者也使用np.clip:

arr1 = np.array([100, 200, 255],dtype=np.uint8)
arr2 = np.array([180, 210, 100],dtype=np.uint8)

sub_arr = np.subtract(arr1, arr2.astype(np.int16)).clip(0, 255).astype(np.uint8)
print(sub_arr)
[  0   0 155]

您应该添加标记图像处理。这给了这个想法。我认为,问题在于,如果您有 10-11 之类的值,您会得到 255 的值,但更愿意保持在 0,对吗?

这称为换行(严格来说:模运算,这对于固定大小的整数变量是正常的)并且也适用于加法(255+1 换行到 0)。

你要的是饱和算法。这将通过将结果饱和到最小值和最大值来避免回绕。 现在,因为我不了解 numpy,所以我不能告诉你,如果有可用的饱和减法,但你应该很容易找到它。

希望我的猜测是正确的;你的问题留下了很多space的解释。

给定 2 个字节数组 p 和 q,我使用 numpy 和以下代码行成功计算了差异。

r = (p>q)*(p-q)+(p<q)*(q-p)