使用PIL读取缩放图像后调用numpy.concatenate报TypeError错误的解决求助
问题分析
你遇到的错误核心原因很明确:np.concatenate是用来拼接numpy数组的,但你的faults和normal列表里装的是PIL Image对象,不是numpy数组,所以numpy没法把Image对象转成它能处理的数值类型,就抛出了类型错误。
解决方案
有两种简单的方法可以解决这个问题,核心都是把PIL Image对象转换成numpy数组:
方案1:读取图像时直接转成numpy数组
修改你最初的图像读取代码,在把图像加入列表前,先转换成numpy数组。同时推荐用os.path.join来拼接路径,适配Windows/Linux不同的路径分隔符:
from PIL import Image import os import numpy as np size = (96,96) list_of_images = [] path = "你的图像文件夹路径" # 替换成实际路径 for filename in os.listdir(path): # 用os.path.join生成更安全的路径 image_directory = os.path.join(path, filename) print(image_directory) image = Image.open(image_directory) image = image.resize(size) # 将PIL Image转换为numpy数组 image_np = np.array(image) # 如果你的图像是灰度图(单通道),建议添加通道维度,避免后续拼接维度不匹配 # image_np = np.array(image)[..., np.newaxis] list_of_images.append(image_np)
这样处理后,list_of_images里就全是numpy数组了,后续的切片和拼接代码可以直接正常运行。
方案2:对现有Image列表批量转换
如果不想修改读取代码,也可以在拼接前把faults和normal列表里的Image对象批量转成numpy数组:
import numpy as np # 将PIL Image列表转换为numpy数组列表 faults_np = [np.array(img) for img in faults] normal_np = [np.array(img) for img in normal] # 同样,如果是灰度图,记得添加通道维度 # faults_np = [np.array(img)[..., np.newaxis] for img in faults] # normal_np = [np.array(img)[..., np.newaxis] for img in normal] # 现在可以正常拼接了 train_images = np.concatenate((faults_np, normal_np), axis = 0) train_labels = np.concatenate((fault_label, normal_label), axis = 0)
为什么你的BytesIO尝试没用?
你之前把Image转成字节流的方法,得到的是PNG格式的字节数据,这依然不是numpy数组,np.concatenate无法处理这种类型的数据,所以这个思路解决不了问题。
内容的提问来源于stack exchange,提问作者Giorgos
相关产品推荐
相关产品推荐

