【问题标题】:Replace 2D numpy array with 3D (elements to vectors)用 3D 替换 2D numpy 数组(元素到向量)
【发布时间】:2021-07-04 15:50:01
【问题描述】:

这个问题可能以前有人问过,所以我很高兴有人指出答案,但我找不到。

我有一个 TrueFalse 的二维 numpy 数组。现在我需要将其转换为黑白图像(一个 3D numpy 数组),也就是说,我需要 [0,0,0] 代替每个 False 和 [1,1,1] 代替每个True。最好的方法是什么?例如,

Input:

[[False, True],
 [True, False]]

Output:
[[[0, 0, 0], [1, 1, 1]],
 [[1, 1, 1], [0, 0, 0]]]

(您可能知道,3D 图像是形状为 (height, width, 3) 的数组,其中 3 是深度维度,即通道数。)

如果有人能告诉我如何将其转换回来,即如果我有一个纯黑白图像(纯 [0,0,0] 和 [0,0,1] 像素),那么如何我得到一个具有相同高宽尺寸的二维矩阵,但用True 代替白色像素([1,1,1])和False 代替黑色像素([0,0,0])。

【问题讨论】:

  • a = a.astype(np.uint8) 对于 3D,您可以使用 np.expand_dims(arr, axis=2)np.stack([list of 2D arrays], axis=2),对于 True-False,您可以使用 np.where(arr==1)
  • @Bilal。这些都不是很好的选择

标签: python arrays numpy image-processing cv2


【解决方案1】:

最便宜的方法是将您的bool 数据查看为np.uint8,并添加一个假维度:

img = np.lib.stride_tricks.as_strided(mask.view(np.uint8),
                                      strides=mask.strides + (0,),
                                      shape=mask.shape + (3,))

mask.astype(np.uint8) 不同,mask.view(np.uint8) 不复制数据,而是利用bool_ 存储在单个字节中的事实。同样,np.lib.stride_tricks.as_strided 创建的新维度是一个不复制任何数据的视图。

您可以通过手动创建新的array object 来绕过as_stridedview

img = np.ndarray(shape=mask.shape + (3,), dtype=np.uint8,
                 strides=mask.strides + (0,), buffer=mask)

【讨论】:

  • 谢谢!!任何建议如何走另一条路(你有img,你称之为mask)?
  • @VainmondeDeCourtenay。你可以做img[..., 0].view(bool)
【解决方案2】:

我认为最清晰的方法是:

a = np.array([[False, True], [True, False]])
out = np.zeros((*a.shape, 3), dtype=np.uint8)
out[a.nonzero()] = 1

>>> out
array([[[0, 0, 0],
        [1, 1, 1]],

       [[1, 1, 1],
        [0, 0, 0]]], dtype=uint8)

【讨论】:

  • 你可以用a代替a.nonzero()a 已经是一个布尔掩码。无需将其转换为一次性操作的索引。
猜你喜欢
  • 1970-01-01
  • 2012-12-09
  • 2019-09-11
  • 2018-10-30
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多