以下是我的代码: 我使用numpy和opencv
q = np.array(image)
q = q.reshape(-1, q.shape[2])
r = np.subtract(q,p)
print r
基本上,如果我的 q 数组中的值大于 p,则减法循环回到 256 并从那里减去剩下的部分。如果减法结果为负数,我宁愿得到一个值为 0。有人知道一个好方法吗?
以下是我的代码: 我使用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,所以您的值正在发生环绕:
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]
给定两个字节数组p和q,我已成功使用numpy计算了它们的差异,以下是代码行。
r = (p>q)*(p-q)+(p<q)*(q-p)