我正在尝试为一堆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
时完全相同的图像。
答案 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)