【问题标题】:Python array subtraction loops back to high number instead of giving negative valuePython数组减法循环回高数而不是给出负值
【发布时间】:2015-04-18 19:44:46
【问题描述】:

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

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

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

【问题讨论】:

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

标签: python arrays opencv numpy subtraction


【解决方案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)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]

【讨论】:

  • 所以你确定 numpy 中没有饱和减法?嗯.. 让我感到惊讶,因为这很常见,值得优化实施。
  • @skrhee,别担心,我远不是一个 numpy 专家,所以可能有更好的方法,但这对我来说是最好的 ;)
  • @PadraicCunningham 这和我需要的一样好!周末愉快
  • @skrhee,你也很高兴它有帮助,
  • 你的意思是string or a number
【解决方案2】:

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

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

您想要的称为饱和算法。这将通过使结果饱和到最小值和最大值来避免回绕。 现在,由于我不知道 numpy,我无法告诉你,是否有可用的饱和减法,但你应该很容易找到。

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 2023-02-08
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多