Numpy 展平 RGB 图像数组

Posted

技术标签:

【中文标题】Numpy 展平 RGB 图像数组【英文标题】:Numpy flatten RGB image array 【发布时间】:2016-08-26 08:40:00 【问题描述】:

我有 1,000 个 RGB 图像 (64X64),我想将它们转换为 (m, n) 数组。

我用这个:

import numpy as np
from skdata.mnist.views import OfficialImageClassification
from matplotlib import pyplot as plt
from PIL import Image                                                            
import glob
import cv2

x_data = np.array( [np.array(cv2.imread(imagePath[i])) for i in range(len(imagePath))] )
print x_data.shape

这给了我:(1000, 64, 64, 3)

现在如果我这样做:

pixels = x_data.flatten()
print pixels.shape

我得到:(12288000,)

但是,我需要一个具有以下维度的数组:(1000, 12288)

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

在将flatten() 应用到展平数组后应用numpy 方法reshape()

  x_data = np.array( [np.array(cv2.imread(imagePath[i])) for i in range(len(imagePath))] )

  pixels = x_data.flatten().reshape(1000, 12288)
  print pixels.shape

【讨论】:

整洁!这会保留原始图像属性,即我不会丢失任何像素信息吗? Flatten()reshape() 是无损的。结果数组的维度应始终相乘以得到相同的总数。 Flatten 有一个 shape() 作为一维数组,而不是 n 维数组,因此它的形状没有第二个值。它看起来像array([1, 2, 3,])。形状为 (3,1) 的 n-D 数组看起来像 array([[1],[2],[3]]) 这是一篇关于塑形的精彩 SO 帖子:***.com/questions/22053050/… @apples-oranges 也取决于你在做什么,你可能只想直接reshape 原始数据——扁平化创建你可能不需要的数据的重组副本。 x_data.reshape(1000, 12288) 再次感谢您的提示!计划是通过 t-SNE 算法解析数组:-)。【参考方案2】:

试试这个:

d1, d2, d3, d4 = x_data.shape

然后使用numpy.reshape()

x_data_reshaped = x_data.reshape((d1, d2*d3*d4))

x_data_reshaped = x_data.reshape((d1, -1))

(Numpy 从原始长度和定义的维度d1 推断出值而不是-1

【讨论】:

d2*d3*4 拼写更好-1。所以x_data_reshaped = x_data.reshape(x_data.shape[0], -1) @Eric 你能解释一下 x_data.reshape((d1, d2*d3*4)) 和 x_data.reshape(x_data.shape[0], -1) 是如何相同的吗?【参考方案3】:

您可以遍历图像数组并独立展平每一行。

numImages = x_data.shape[0]
flattened = np.array([x_data[i].flatten() for i in range(0,numImages)])

【讨论】:

【参考方案4】:

你也可以这样使用: X 是您的 2D 图片,例如大小为 32x32,而 -1 仅表示它是一个未知维度,我们希望 numpy 弄清楚它。 numpy 将通过查看“数组长度和剩余维度”并确保它满足上述标准 (What does -1 mean in numpy reshape?) 来计算这一点。 T 表示在使用 axes 关键字参数时反转张量的转置 (https://docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html)。

X_flatten = X.reshape(X.shape[0], -1).T

【讨论】:

如果您对此进行详细说明会有所帮助,因为它可能会更好地帮助其他人理解您的解决方案。【参考方案5】:

假设您有一个数组image_array,您可以使用reshape() 方法。

image_array = image_array.reshape(1000, 12288)

【讨论】:

以上是关于Numpy 展平 RGB 图像数组的主要内容,如果未能解决你的问题,请参考以下文章

将numpy数组转换为rgb图像

在 Python 中将 3 个单独的 numpy 数组组合为 RGB 图像

Numpy 数组:连接展平和添加维度

展平 NumPy 数组列表?

展平和取消展平 numpy 数组的嵌套列表

如何在 Numpy 中将数组展平为矩阵?