【问题标题】:Numpy Image Array Replace specific color with 1, other colors with 0Numpy Image Array 用 1 替换特定颜色,用 0 替换其他颜色
【发布时间】:2021-06-17 17:05:08
【问题描述】:

我必须对图像进行语义分割编码。输入图像的形状为 (128, 256, 3),具有 128 x 256 RGB 值。我想要一个 (128, 256) 的输出形状,其中每 1 表示像素与给定颜色匹配,0 表示存在另一个 RGB 值。

[[20, 20, 20], [30, 30, 30], [40, 40, 40]] 和过滤器 [20,20,20] 应该导致 [1, 0, 0]

任何帮助将不胜感激。

此方法最好适用于包含 16 张图片的形状数组 (16, 128, 256, 3),并将过滤器应用于每张图片。

【问题讨论】:

  • 如果我错了,请纠正我,你的例子,矩阵[[20, 20, 20], [30, 30, 30], [40, 40, 40]]是二维的,所以过滤器应该只有20,结果是[[1,1,1],[0,0,0],[0,0,0]],对吗?
  • 问题中的矩阵只是一个例子。根据我的 batch_size,我的代码中的 Natrix 的形状为 (16, 128, 256, 3) 或 (8, 128, 1256, 3)。

标签: python numpy


【解决方案1】:

对一张图片使用np.where

filter_pixel = np.array([20, 20, 20])
image = np.array([[[20, 20, 20], [30, 30, 30], [40, 40, 40]],
                  [[20, 10, 20], [20, 20, 20], [40, 40, 40]]])

new_image = np.where(np.all(image == filter_pixel, axis=2), 1,0)
print(new_image)

输出:

[[1 0 0]
 [0 1 0]]

编辑,多张图片:

filter_pixels = np.array([[20, 20, 20], [30, 30, 30]])
filter_pixels = filter_pixels[:, np.newaxis, np.newaxis, :]
images = np.array([[[[20, 20, 20], [30, 30, 30], [40, 40, 40]],
                    [[20, 10, 20], [20, 20, 20], [40, 40, 40]]],
                  [[[20, 20, 20], [30, 30, 30], [40, 40, 40]],
                   [[20, 10, 30], [20, 20, 20], [30, 30, 30]]]])

new_images = np.where(np.all(images == filter_pixels, axis=3), 1, 0)

print(new_images)

输出:

[[[1 0 0]
  [0 1 0]]

 [[0 1 0]
  [0 0 1]]]

【讨论】:

  • 这种方法的问题是,如果一个元素与过滤器匹配,它会返回 1。例如image = np.array([[20, 20, 20], [20, 30, 30], [40, 40, 40]]) 会导致 [1, 1, 0] 这不是我想要的跨度>
  • 是的,你是对的。刚刚进行了编辑以使其正常工作。
  • 谢谢,我用你的方法弄明白了。我不得不使用axis = 3,因为我的数组比您的测试数组多一维,但它工作得很好并且计算速度很快。非常感谢!
  • 我为你的问题添加了完整的答案,它现在适用于许多图像。
  • 太好了,谢谢。在我的网络做出预测后,我现在一直在解码图像。所以现在我想从 shape(16, 128, 256, 12) 到 shape (16, 128, 256, 3),其中像素从输出数组中的 12 个值中获取最大数量的颜色值。我无法做到这一点。也许你可以再帮忙
猜你喜欢
  • 2013-10-22
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多