【问题标题】:How To Delete Sub Arrays In Numpy IF Exactly Matches 0,0,0如何在 Numpy 中删除子数组 IF 完全匹配 0,0,0
【发布时间】:2019-06-20 11:23:10
【问题描述】:

我正在分析图像颜色,但正在去除任何 0,0,0(黑色)的 RGB 颜色像素。 (Using this top answer as reference)

我有一个像素数组

pixels = np.float32(img.reshape(-1, 3))

[[ 126.   94.   51.]
 [ 171.  115.   65.]
 [ 188.  119.   64.]
 ..., 
 [   0.    0.    0.]
 [   0.    0.    0.]
 [   0.    0.    0.]]

然后我尝试遍历并删除所有黑色的子数组。

pixelstoignore = np.delete(pixels, np.where(pixels == [0,0,0]), axis=0)

这似乎有效:

但是,平均颜色和主色之间的差异告诉您其他情况。平均颜色工作正常。 这是我的照片:

似乎正在发生的事情是,我的代码正在删除任何包含 0 的子数组。例如,上面的红色的 RGB 值为 255,0,0。我的代码正在删除它。但是如果所有 3 个值都是 0,我只想删除它!

我得到了使用 np.all 的平均值,但我无法让它与 delete 函数一起使用。救命!

编辑:解决方案似乎是这样的:

pixelstoignore = np.delete(pixels, np.where((pixels == [0,0,0]).all(axis=1)), axis=0)

【问题讨论】:

  • 这在我看来就像delete 中的一个错误 - 它不应该接受元组参数。
  • 不过,有一个问题,我知道如何删除只有零的整行,我已经知道了,虽然我不明白的是,这对您的实际情况不会有问题必须具有特定形状的图像?

标签: python numpy


【解决方案1】:

您要删除任何值为 0 的像素,还是只删除所有值为 0 的像素?

In [212]: arr = np.array([[ 126.,   94.,   51.],
     ...:  [ 171.,  0.,   65.],
     ...:  [ 188.,  119.,   64.],
     ...:  [   1. ,   0.,    0.],
     ...:  [   0. ,   0.,    0.],
     ...:  [   0. ,   1.,    0.]])
     ...:  
     ...:  
In [213]: arr
Out[213]: 
array([[126.,  94.,  51.],
       [171.,   0.,  65.],
       [188., 119.,  64.],
       [  1.,   0.,   0.],
       [  0.,   0.,   0.],
       [  0.,   1.,   0.]])
In [214]: arr == [0,0,0]
Out[214]: 
array([[False, False, False],
       [False,  True, False],
       [False, False, False],
       [False,  True,  True],
       [ True,  True,  True],
       [ True, False,  True]])
In [215]: np.where(arr == [0,0,0])
Out[215]: (array([1, 3, 3, 4, 4, 4, 5, 5]), array([1, 1, 2, 0, 1, 2, 0, 2]))

要测试“行”中的所有内容:

In [216]: (arr == [0,0,0]).all(axis=1)
Out[216]: array([False, False, False, False,  True, False])
In [217]: np.where((arr == [0,0,0]).all(axis=1))
Out[217]: (array([4]),)

In [218]: np.where((arr == [0,0,0]).any(axis=1))
Out[218]: (array([1, 3, 4, 5]),)

您的deletewhere 仅与where 中的条件一样好。

【讨论】:

  • “我们的删除和 where 仅与 where 内的条件一样好” 比这更糟糕 - 结合 deletewhere 总是做错事. deletewhere 返回的 i, j 元组重新解释为 i 值的二维数组 - 结果只是垃圾 - np.delete(a, ([1, 2], [3, 4]), 0)np.delete(a, [1, 2, 3, 4], 0) 相同
  • 谢谢伙计。 pixelstoignore = np.delete(pixels, np.where((pixels == [0,0,0]).all(axis=1)), axis=0) 好像可以。
  • 我认为上面的工作如下 - np.where((pixels == [0,0,0]).all(axis=1)) 定位数组中所有 3 列都等于 0 的位置。np.delete(, axis=0) 然后遍历并删除正确的行。
猜你喜欢
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 2012-03-09
  • 1970-01-01
  • 2021-04-02
  • 2016-12-28
  • 1970-01-01
相关资源
最近更新 更多