【问题标题】:1D array to RGB image?一维数组到RGB图像?
【发布时间】:2020-05-15 18:55:36
【问题描述】:

我有一个一维图像数组,其中存储了 32X32 彩色图像,首先 1024 为红色,1024 为绿色,1024 为蓝色。图像以行主要顺序存储,因此现在数组的前 32 个条目是图像第一行的红色通道值。

样本看起来像 X[0]

(array([255., 252., 253., ..., 173., 231., 248.], dtype=float32)

我尝试将数组重新整形为 3 部分,但构造的图像看起来并不像任何东西。

代码

a = X[0].reshape(3,-1).T.reshape(32,-1,3)
Image.fromarray(a, 'RGB')

生成的图像如下所示

也许数据集只是随机数。

【问题讨论】:

  • X[0] 是一张图片吗?什么形状? (3072,)?如果是这样,我会尝试改写为(3,1024),然后改写为(3,32,32)。转置 (1,2,0) 将使其 (32,32,3) 可能转换为 image
  • 是的 X[0] 是一张图片。
  • 你可以堆叠 3 个平面,基本上是 img = np.dstack((X[:1024], X[1024:2048], X[2048:])) 并重新整形为 (32,32)。

标签: python image numpy


【解决方案1】:

我们需要置换轴,同样我们可以使用np.transpose -

H,W = 32,32 # image dimensions
img_0 = X[0].reshape(3,H,W).transpose(1,2,0)

如果你有一个图像数组存储在2D数组的行中,即第一行表示X[0],第二行表示X[1]等等,我们可以取回所有图像,这将是一个4D数组,就这样-

img_all = X.reshape(-1,3,H,W).transpose(0,2,3,1)

为了验证,让我们创建一个最小设置:

# This is what we want as final output
In [46]: a = np.arange(18).reshape(2,3,3)

    In [52]: a
    Out[52]: 
    array([[[ 0,  1,  2],
            [ 3,  4,  5],
            [ 6,  7,  8]],

           [[ 9, 10, 11],
            [12, 13, 14],
            [15, 16, 17]]])

In [47]: H,W = 2,3 # img dimensions

# This is what we have
In [63]: b = np.hstack([a[...,i].ravel() for i in range(3)])

In [64]: b
Out[64]: 
array([ 0,  3,  6,  9, 12, 15,  1,  4,  7, 10, 13, 16,  2,  5,  8, 11, 14,
       17])

# Check if the proposed soln gives us "a" back
In [51]: np.allclose(a, b.reshape(3,H,W).transpose(1,2,0))
Out[51]: True

【讨论】:

    猜你喜欢
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 2019-06-07
    • 1970-01-01
    • 2012-04-25
    相关资源
    最近更新 更多