【问题标题】:Reshape (M, N, 3) numpy array to (M*N, 3)将 (M, N, 3) numpy 数组重塑为 (M*N, 3)
【发布时间】:2016-08-04 00:52:03
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你能展示一些输入和输出的例子吗?
  • 您确定要 (M, 3) 而不是 (M, N)?
  • 你需要一个 (MxN, 3) 矩阵吗?假设 M 和 N 是您的尺寸大小,则每个坐标都需要一个值。仅当矩阵之前和之后的元素数量相同时,重塑才应该起作用。
  • 大概是arr.reshape(-1,3)
  • “我想将数组重塑为 (M, 3) ...” 我假设您的意思实际上是 (M*N, 3)

标签: python arrays numpy


【解决方案1】:

如果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]])

【讨论】:

  • 是的,很抱歉造成混乱。我的意思是 M*N 而不仅仅是 M。这是完美的
【解决方案2】:

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

## 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) 您会丢失一些数据!

【讨论】:

    猜你喜欢
    • 2019-02-27
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2021-12-02
    • 1970-01-01
    相关资源
    最近更新 更多