为什么我在4d numpy数组中显示不同的图像?

时间:2019-01-02 16:21:16

标签: python numpy python-imaging-library

我正在尝试为一堆3D图像创建4D阵列。我可以加载图像并正确显示图像,但是将其存储到4D阵列并显示该阵列中的图像后,它会显示乱码。

我试图比较加载的图像和从4D阵列读取的图像是否相等,并显示True。

import os
from glob import glob
import numpy as np
from PIL import Image

IMG_PATH = '32x32'
img_paths = glob(os.path.join(IMG_PATH, '*.jpg'))
images = np.empty((len(img_paths), 32, 32, 3))
for i, path_i in enumerate(img_paths):
    img_i = np.array(Image.open(path_i))
    Image.fromarray(img_i, 'RGB').show() # showing correct image
    images[i] = img_i
    Image.fromarray(images[i], 'RGB').show() # showing gibberish
    print(np.array_equal(img_i, images[i])) # True
    if i == 0:
        break

我希望显示与运行images[i] = img_i时完全相同的图像。

1 个答案:

答案 0 :(得分:2)

此行正在执行转换:

images[i] = img_i

images.dtype == np.float64起,但img_i.dtype可能是 np.uint8


您可以通过指定强制转换规则来捕获此类错误:

np.copy_to(images[i], img_i, casting='no')
# TypeError: Cannot cast scalar from dtype('uint8') to dtype('float64') according to the rule 'no'

您可以通过分配正确类型的数组来解决此问题:

images = np.empty((len(img_paths), 32, 32, 3), dtype=np.uint8)

或者您可以让numpy为您分配内存,但这将暂时使用几乎两倍的内存:

images = np.stack([
    Image.open(path_i)
    for path_i in img_paths
], axis=0)