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 图像数组的主要内容,如果未能解决你的问题,请参考以下文章