NumPy将RGB图像数组展平

23
我有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)

我该如何实现?

5个回答

12

在应用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

太好了!这会保留原始图像属性,也就是说我不会失去任何像素信息吗? - apples-oranges
2
Flatten()reshape()都是无损的。结果数组的维度应该总是相乘得到相同的总数。Flatten()具有1-D数组的形状(shape()),而不是n-D数组,因此没有第二个值来表示其形状。它看起来像array([1, 2, 3,])。一个形状为(3,1)的n-D数组看起来像array([[1],[2],[3]]) - Ray
1
这是一篇关于形状的很棒的SO帖子:https://dev59.com/UmEh5IYBdhLWcg3wwly8 - Ray
2
@apples-oranges 同时,根据您的操作,您可能只希望直接“reshape”原始数据——flatten将创建一个重构过的数据副本,您可能不需要。 x_data.reshape(1000, 12288) - Ray
再次感谢你的提示!计划是通过t-SNE算法解析数组 :-). - apples-oranges

10

试试这个:

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)

1
"d2d34" 最好写成 "-1"。因此,"x_data_reshaped = x_data.reshape(x_data.shape[0], -1)"。 - Eric
@Eric,你能解释一下x_data.reshape((d1, d2d34))和x_data.reshape(x_data.shape[0], -1)是相同的吗? - GeorgeOfTheRF

3
你可以遍历你的图片数组并独立地将每一行压平。
numImages = x_data.shape[0]
flattened = np.array([x_data[i].flatten() for i in range(numImages)])

3

如果您能更详细地阐述一下,这可能有助于他人更好地理解您的解决方案。 - Jeffrey

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接