如何基于目标像素替换 Numpy 图像数组中的所有 RGB 值

3

我有一个Numpy数组中的图像。

我想将特定颜色替换为黑色,其他所有颜色替换为白色。

循环太慢,我的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]

此外,如果我将您的代码粘贴到编辑器中,它将无法运行(我知道,因为我刚刚尝试过)。 - Mad Physicist
抱歉,之前有一个很丑的打字错误。现在应该可以运行了。 - Incur
感谢修复。misc.face() 已经返回一个数组了。 - Mad Physicist
1个回答

4

您的图像形状为(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
@Incur。我很高兴它对你有用。有时候,获得那些提示告诉你从哪里开始挖掘是非常重要的。我很乐意为你做这件事。 - Mad Physicist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接