假设我有一个由(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]...)
答案 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)
会丢失一些数据!