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

skr*_*hee 5 python arrays opencv numpy subtraction

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

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

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

Pad*_*ham 5

您可以更改为支持负整数的 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]
Run Code Online (Sandbox Code Playgroud)

要更改数组,您可以使用array.astype(np.int16)从 更改uint8np.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)
Run Code Online (Sandbox Code Playgroud)

或者也使用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]
Run Code Online (Sandbox Code Playgroud)