【发布时间】:2019-02-27 19:35:57
【问题描述】:
假设我想在一个 numpy 3-D 数组中表示具有 3 个颜色通道 (RGB) 的大小为 H*W 的图像,使得维度为 (H, W, 3)。让我们举一个简单的例子(4,2,3)。所以我们创建一个这样的数组 - img = np.arange(24).reshape(4,2,3)。
为了适合上面图片示例的类比,元素的值应该是-
Channel R: [0,1],[2,3],[4,5],[6,7]
Channel G: [8,9],[10,11],[12,13],[14,15]
Channel B: [16,17],[18,19],[20,21],[22,24]
即3个外部数组,上面的数组嵌套在里面。
但是,np.arange(24).reshape(4,2,3) 的结果是 -
array([[[ 0, 1, 2],
[ 3, 4, 5]],
[[ 6, 7, 8],
[ 9, 10, 11]],
[[12, 13, 14],
[15, 16, 17]],
[[18, 19, 20],
[21, 22, 23]]])
如果我想要第一个频道的第一行,即img[0,:,0],我希望结果是 [0,1],但实际上我会得到 [0,3]。
我知道如果我用形状 (3,4,2) 初始化 ndarray,我会得到我想要的。但我想使用 (H,W,depth) 的传统形状。
你能帮我理解一下我理解上的差距吗?
【问题讨论】:
-
第一个
0选择显示中的第一个平面或块。把它想象成一个 (2,3) 形状的数组。第二个0从该数组中选择第一列。要获得[0,1],您必须使用img[0,0,:2]],即第一个块的第一行,以及该行的前两项。 -
np.array([R,G,B])应该产生一个 (3,4,2) 数组。在numpy中,第一个维度是最外层。这与 MATLAB 正好相反。 -
谢谢@hpaulj!那么,用 np ndarray 表示
H pixel * W pixel * 3 color channels的图像的通常推荐方法是什么?也许只有我一个人,但我觉得这些形状对于图像表示不是很直观。 -
颜色通道通常是最后一个维度。例如,这就是
matplotlibimshow所期望的,matplotlib.org/api/_as_gen/…
标签: python numpy numpy-ndarray