【问题标题】:Applying a 2D numpy mask to grayscale image将 2D numpy 蒙版应用于灰度图像
【发布时间】:2017-08-10 20:58:26
【问题描述】:

我有一个 256×256 像素的 2D 蒙版,像素值为 0 或 255,以及匹配的灰度图像。两者都有形状 (256, 256)。

我想在灰度图像上应用蒙版,因此生成的图像仅包含原始灰度图像中的像素,其中对应的蒙版值为 255(应保留原始灰度像素值)。

我无法使用

img_clean = img_grayscale[mask]

因为它为数组添加了一个新维度(如 numpy 的文档中所述)。

我该如何解决这个问题?

【问题讨论】:

  • only contains pixels from the original grayscale image 是什么意思?
  • 生成的图像应该是原始图像的副本,除了对于原始图像中在掩码中具有相应 0 的像素 - 对于这些像素,结果图像值应为0
  • 在这种情况下按位 AND 应该可以工作:img_clean = img_grayscale & mask
  • 是的,完美,如果你把它作为答案,我会选择它,谢谢
  • 好主意,但如果掩码的值 != 255 也可以。我不确定这是否可以。

标签: python arrays numpy mask


【解决方案1】:

只需添加第三个选项并修改您的灰度图像就地

img_grayscale[mask == 255] = 0

PS:如果您不想就地修改,可以只创建一个副本。

【讨论】:

  • 第三个选项和最佳选项
【解决方案2】:

我认为这应该可以完成这项工作

np.where(mask == 255, img_grayscale, 0)

有关文档,请参阅 https://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html

【讨论】:

    【解决方案3】:

    可以使用bitwise AND 将像素值设置为0,其中掩码为0

    img_clean = img_grayscale & mask
    

    由于掩码包含0255,因此值要么保持不变,要么根据您的要求设置为0

    【讨论】:

    • 只是一个小注释,但如果 img_grayscale 的数据类型不同于 uint8img_grayscale 的强度范围大于 255,这将不起作用。在大多数情况下,灰度图像是 0-255 范围内的 uint8,但以防万一值得添加注释(例如,我倾向于使用 0-1 范围内的 float32 图像)。
    猜你喜欢
    • 1970-01-01
    • 2021-06-02
    • 2016-08-31
    • 2021-08-20
    • 2021-04-02
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    相关资源
    最近更新 更多