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

时间:2015-04-18 19:44:47

标签: 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

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

3 个答案:

答案 0 :(得分:3)

您可以更改为支持负整数的int16并将neg值设置为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]

答案 1 :(得分:1)

您应该添加标记图像处理。这提出了这个想法。我认为,问题是,如果你有10-11这样的东西,你得到的值为255,但是更愿意坚持0,对吗?

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

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

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

答案 2 :(得分:0)

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

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