python - 无法 reshape 包含 PNG 图像的 numpy 数组

标签 python arrays numpy machine-learning

我使用 Python 中的 Keras 库训练了一个手写图像分类器。最初,我使用标准 MNIST 数据集进行训练和测试。但现在我想使用自己的数据集进行测试,其中所有图像的大小均为 900*1200*3 而不是 28*28*1

所以我需要在测试之前 reshape 所有图像。我正在使用以下代码来 reshape 但它给出了错误。

代码:

bb =  lol.reshape(lol.shape[0], 28, 28, 1).astype('float32')

其中 lol 是我的 numpy 数组,包含 55 个形状为 (900,1200,3)

的图像

错误日志如下:

ValueError                                Traceback (most recent call last)
<ipython-input-46-87da95da73e9> in <module>()
     24 #     # you can show every image
     25 #     img.show()
---> 26 bb =  lol.reshape(lol.shape[0], 28, 28, 1).astype('float32')
     27 # model = loaded_model
     28 # classes = model.predict(bb)

ValueError: cannot reshape array of size 178200000 into shape (55,28,28,1)

那我做错了什么?即使将大图像调整为 28*28 的非常小的图像,我能否获得准确的预测?感谢帮助。

最佳答案

你所做的事情是错误的。您无法将 (55, 900, 1200, 3) 的数组 reshape 为 (55, 28, 28, 1) 的数组,因为您试图在数组中存储 55*900*1200*3=178200000 个元素只能存储 55*28*28=43120 个元素。

你想做两件事:

1) 将 RGB 图像(由最后一个维度表示,即 3 个 channel )转换为灰度图像(1 个 channel )。最简单的方法是 (R+B+G)/3。所有与图像相关的 python 库(PIL、OpenCV、skimage、tensorflow、keras 等)都已经实现了这一点。示例:

from skimage.color import rgb2gray
gray = rgb2gray(original)

2) 将图像大小从 900x1200 调整为 28x28。同样,您可以在所有主要的图像相关 python 库中执行此操作。示例:

from skimage.transform import resize
resized = resize(gray, (28,28))

现在,如果您想在所有 55 个图像中执行此操作,您可以编写一个函数来转换一个图像并将其映射到您的数组中,或者使用一个简单的 for 循环并一次填充一个图像到您的新数组。

在您的情况下,代码应如下所示:

num_images = lol.shape[0] # 55 in your case
resized_images = np.zeros(shape=(num_images, 28, 28, 1)) # your final array
for i in range(num_images):
    gray = rgb2gray(lol[i,:,:,:]) # gray.shape should be (900,1200,1)
    resized = resize(gray, (28,28)) # resized.shape should be (28,28,1)
    resized_images[i,:,:,:] = resized # resized_images.shape should be (55,28,28,1)

关于python - 无法 reshape 包含 PNG 图像的 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46118773/

相关文章:

python - 如何将纯 http 请求发送到 url?

python - 将多个列表数据转换为字典

用于计算数组中过零次数的 Python 代码

java - 基于图 block 的游戏中的碰撞检测仅适用于数组中的文件图 block

python - 按比例将图像裁剪到最大的中心部分

java - 有限重复置换算法

python - CountVectorizer 忽略大写

python - 使用索引列表对数组进行切片

python - 将 Pandas 数据框转换为带有标题和数据类型的 numpy 数组

python - 潜在语义分析结果