numpy with python:将3d数组转换为2d

时间:2015-09-29 08:03:08

标签: python arrays numpy image-processing computer-vision

假设我有一个彩色图像,当然这将由python中的三维数组表示,比如形状(n x m x 3)并称之为img。

我想要一个新的2-d数组,称它为“narray”以具有形状(3,nxm),使得该数组的每一行分别包含R,G和B通道的“扁平”版本。此外,它应该具有我可以通过类似

之类的东西轻松地重建任何原始频道的属性
narray[0,].reshape(img.shape[0:2])    #so this should reconstruct back the R channel.

问题是如何从“img”构建“叙事”?简单的img.reshape(3,-1)不起作用,因为元素的顺序对我来说是不可取的。

由于

3 个答案:

答案 0 :(得分:16)

您需要使用np.transpose重新排列尺寸。现在,n x m x 3将转换为3 x (n*m),因此将最后一个轴发送到前面并向右移动剩余轴(0,1)的顺序。最后,重新塑造3行。因此,实施将是 -

img.transpose(2,0,1).reshape(3,-1)

示例运行 -

In [16]: img
Out[16]: 
array([[[155,  33, 129],
        [161, 218,   6]],

       [[215, 142, 235],
        [143, 249, 164]],

       [[221,  71, 229],
        [ 56,  91, 120]],

       [[236,   4, 177],
        [171, 105,  40]]])

In [17]: img.transpose(2,0,1).reshape(3,-1)
Out[17]: 
array([[155, 161, 215, 143, 221,  56, 236, 171],
       [ 33, 218, 142, 249,  71,  91,   4, 105],
       [129,   6, 235, 164, 229, 120, 177,  40]])

答案 1 :(得分:1)

假设我们有一个大小为img的数组m x n x 3可以转换为一个大小为new_img的数组3 x (m*n)

new_img = img.reshape((img.shape[0]*img.shape[1]), img.shape[2])
new_img = new_img.transpose()

答案 2 :(得分:0)

如果已安装了scikit模块,则可以使用rgb2grey(或rgb2gray),以使从彩色照片以灰色(从3D到2D)

这skimage进口IO,颜色

lina_color = io.imread(path + img) lina_gray = color.rgb2gray(lina_color)

在[33]中:lina_color.shape 出[33]:(1920,1280,3)

在[34]中:lina_gray.shape 出[34] :( 1920,1280)