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

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

提问人:skrhee 提问时间:4/19/2015 更新时间:5/15/2018 访问量:2945

问:

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

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

基本上,如果我的 q 数组中的值大于 p,则减法会循环回到 256 并从那里减去剩余的值。如果减法为负数,我宁愿得到一个值 0。有谁知道一个好方法吗?

python 数组 opencv numpy 减法

评论

0赞 Mazdak 4/19/2015
你的问题不清楚吗?你到底想做什么?
0赞 Francesco Montesano 4/19/2015
什么?“循环回溯”是什么意思?发生了类似的事情?p0-1 = 256
0赞 skrhee 4/19/2015
我只是不明白为什么减法不起作用,我认为是的,这种循环正在发生,但我不确定。p 和 q 一样,只是从不同的文件中拉取图像
0赞 skrhee 4/19/2015
我没有收到溢出错误,我仍然得到值,但也许。这是我的第一个图像处理项目,所以我是新手
0赞 skrhee 4/19/2015
检查后确定:假设我的 q 是 [x, 189, z] 假设我的 p 是 [m, 222, n] 我的 r 变为 [x-m, 223, z-n] 223 是 256-33

答:

4赞 Padraic Cunningham 4/19/2015 #1

您可以更改为支持负整数的 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)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)

或者也可以使用 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]

评论

0赞 too honest for this site 4/19/2015
所以你确定numpy中没有饱和减法吗?嗯。。这让我感到惊讶,因为这很常见,值得优化实施。
0赞 Padraic Cunningham 4/19/2015
@skrhee,不用担心,我远不是一个麻木的专家,所以可能有更好的方法,但这对我来说是最好的;)
1赞 skrhee 4/19/2015
@PadraicCunningham这和我需要的一样好!祝您周末愉快
0赞 Padraic Cunningham 4/19/2015
@skrhee,你也很高兴它有帮助,
0赞 Padraic Cunningham 4/26/2015
你的意思是 ?string or a number
1赞 too honest for this site 4/19/2015 #2

您应该添加标签图像处理。这给了这个想法。我认为,问题是,如果你有类似 10-11 的东西,你会得到 255 的值,但宁愿坚持 0,对吧?

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

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

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

0赞 racribeiro 5/15/2018 #3

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

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