【问题标题】:How to replace all RGB values in an Numpy Image Arrray based on an Target Pixel如何根据目标像素替换 Numpy 图像数组中的所有 RGB 值
【发布时间】:2020-08-31 15:14:30
【问题描述】:

我在 Numpy 数组中有一个图像。 我将用黑色替换特定颜色,并将所有其他颜色替换为白色。 For 循环会变慢,而且我的 numpy 条件不起作用。

与数组匹配的所有像素 --> [121, 112, 131] 必须完全替换为另一个数组 --> [0, 0, 0]

所有其他带 --> [255, 255, 255]

我的结果以与第一通道匹配的监督像素结束 [True, False, False]

抱歉拼写错误,我希望我的代码更好理解。

我的示例结果:

import numpy as np
from scipy import misc

file = misc.face()
img = np.array(file)

target_color = [121, 112, 131]
true_color = [0, 0, 0]
false_color = [255, 255, 255]

true_mask = np.all(img == target_color, axis=2)
false_mask = np.all(img != target_color, axis=2)

img[true_mask] = true_color
img[false_mask] = false_color

print(img)

输出:

array([[[  0,   0,   0],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],

       ...,

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [121, 157,  96],
        [255, 255, 255],
        [255, 255, 255]],

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]]], dtype=uint8)

问题:

当第一个通道等于目标颜色时,还有像素。

Target Pixel: [121, 112, 131]
Overseen Pixel: [121, 157,  96]

【问题讨论】:

  • 另外,如果我将它传递到编辑器中,您的代码将无法运行(我知道,因为我刚刚尝试过)
  • 抱歉,有一个难看的错字。现在它应该运行了。
  • 感谢您的修复。 misc.face() 已经返回一个数组。

标签: python numpy image-processing multidimensional-array


【解决方案1】:

您的图像形状是(768, 1024, 3)。您想要制作一个掩码,它等于一个 3 元素数组。您发现这样做的正确方法是

mask = np.all(img == target_color, axis=2)

这是有效的,因为形状是从最右边的维度广播的。您无需计算 img != target 即可获得反掩码:

false_mask = ~mask

但您不需要这样做。您可以创建输出数组:

img = np.full_like(img, [255, 255, 255])

你可以设置被屏蔽的元素:

img[mask, :] = [0, 0, 0]

索引: 很重要,因为您需要告诉它沿第三维处理所有内容,而掩码处理前两个。

【讨论】:

  • 这解决了我的问题,谢谢。我对维度的东西并不了解,但从这里我可以更深入地挖掘。 :)
  • @Incur。我很高兴它对你有用。有时,让这些提示告诉您从哪里开始挖掘非常重要。我很高兴为你做这件事
猜你喜欢
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多