将(M,N,3)numpy数组重塑为(M * N,3)

时间:2016-08-03 15:21:47

标签: python arrays numpy

假设我有一个由(M,N,3)numpy数组表示的RGB(或HSV)图像,其中每个维度([x, y, 0][x, y, 1])表示特定像素处的颜色通道值。我想将数组重新整形为(M * N,3),其中颜色通道被组合([R1, G1, B1], [R2, G2, B2] ...)到一个平面列表中(在这种情况下,这是正确的术语吗?)。我知道必须使用重塑功能,但我很难理解 如何使用该功能。任何帮助表示赞赏。

编辑:这是我想要发生的事情的一个例子。

输入:(640 x 640 x 3)代表图像的数组,其中[40, 40, 1]将是特定像素的G值。我想采用所有3个颜色通道并将它们组合成以下输出。

输出:([R, G, B], [R, G, B], [R, G, B]...)

2 个答案:

答案 0 :(得分:3)

如果img是您的数组,则可以使用img.reshape(-1, 3)

例如,

In [50]: img.shape
Out[50]: (5, 2, 3)

In [51]: img
Out[51]: 
array([[[2, 0, 4],
        [1, 4, 3]],

       [[2, 1, 4],
        [3, 2, 2]],

       [[2, 4, 1],
        [4, 0, 2]],

       [[1, 4, 2],
        [3, 2, 2]],

       [[3, 2, 1],
        [2, 1, 0]]])


In [53]: x = img.reshape(-1, 3)

In [54]: x.shape
Out[54]: (10, 3)

In [55]: x
Out[55]: 
array([[2, 0, 4],
       [1, 4, 3],
       [2, 1, 4],
       [3, 2, 2],
       [2, 4, 1],
       [4, 0, 2],
       [1, 4, 2],
       [3, 2, 2],
       [3, 2, 1],
       [2, 1, 0]])

答案 1 :(得分:1)

如果我理解正确的话,我会做这样的事情:

## loading the image...
import matplotlib.pyplot as plt   
import matplotlib.image as mpimg  
image = mpimg.imread("my_image.jpg")  

## extracting R, G, B and flatten them separately and then make
## an array out of them. 
res = np.transpose(np.array([image[...,0].flatten(), image[...,1].flatten(), image[...,2].flatten()]))

这可能不是最优雅的方式,但它会起作用。实际上,这不会给(M, 3),但会给(MxN, 3)。这应该是实际需要的,因为使用(M, 3)会丢失一些数据!