【问题标题】:Multiple numpy place calls yield odd results多个 numpy 地方调用产生奇怪的结果
【发布时间】:2019-05-03 21:03:46
【问题描述】:

我正在尝试创建一个用于某些图像操作的 8 位 1 通道掩码。我有一个图像,在original 图像中的某些像素填充有fuscia (255, 0, 255),这表明该像素应该用于掩蔽。

我的想法是简单地复制原始图片,然后用白色替换所有 fuscia 像素,并将所有非 fuscia 像素替换为黑色。我正在使用numpy.place 来执行此操作。但是,似乎只真正“应用”了最后一个 place 操作。

例如,在下面的代码中,我尝试首先将所有 fuscia 像素设置为白色,然后将所有非 fuscia 像素设置为黑色。但是,当我实际保存图像并查看时,只有非红褐色像素变黑了。

mask = original.copy()
np.place(mask, mask == (255, 0, 255), (255, 255, 255))
np.place(mask, mask != (255, 0, 255), (0, 0, 0))
mask = mask.reshape((h, w, 3))
mask = cv2.cvtColor(mask, cv2.COLOR_RGB2GRAY)

original

mask

我希望 fuscia 区域是白色的,但事实并非如此。这是fuscia颜色的灰度版本(112, 112, 112

我对 numpy 还很陌生,所以我什至可能找错了树,可能有更简单的方法可以做到这一点。我究竟做错了什么?有没有更简单的方法来做我所描述的事情?谢谢!

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    似乎您可以使用布尔数组作为掩码。例如:

    mask = np.any(original==[255, 0, 255], axis=-1)
    

    现在您可以通过original[mask] 仅获取洋红色像素,或通过orignal[~mask] 获取其他像素。

    你会发现你无法覆盖original,但你可以覆盖一个副本:

    newimg = original.copy()
    newimg[mask] = [255, 255, 255]
    newimg[~mask] = [0, 0, 0]
    

    顺便说一句,我认为你“应该”使用masked arrays 来处理这类事情,但我从来没有掌握过这些。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-17
      相关资源
      最近更新 更多