首页 > 解决方案 > 用 3D 替换 2D numpy 数组(元素到向量)

问题描述

这个问题之前可能已经被问过,所以我很高兴被指出答案,但我找不到它。

我有一个 2D numpy 数组TrueFalse. 现在我需要将其转换为黑白图像(一个 3D numpy 数组),也就是说,我需要 [0,0,0] 代替 everyFalse和 [1,1,1] 代替 every 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]) 的二维矩阵。

标签: pythonarraysnumpyimage-processingcv2

解决方案


最便宜的方法是将您的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是一个不复制任何数据的视图。

您可以绕过as_strided并手动view创建一个新的数组对象:

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

推荐阅读