项目场景:PIL库Image模块处理数组合并成3通道RGB图像

项目中,使用Pytorch的torch.utils.data.DataLoader加载自己准备好的数据集。同时想要直观查看或验证生成的数据是否正确。通过直观展示数据–训练数据和标签–来验证数据集。

自定义的数据集是使用PIL库的Image.open读取的图像数据。还是用它来展示验证数据。测试代码如下:

if __name__ == "__main__":
    import time
    from PIL import Image

    playPhoneData = PlayPhoneData("E:/Datasets/玩手机")
    # 利用dataloader加载数据集
    train_loader = torch.utils.data.DataLoader(playPhoneData, batch_size=1, shuffle=True, drop_last=True)

	# 展示和验证数据
    for i, (inputs, labels) in enumerate(train_loader, 0):
        print(i, inputs[0].shape, labels)
        # array = inputs[0]
        im1 = Image.fromarray(256 * inputs[0][0].numpy())
        im2 = Image.fromarray(256 * inputs[0][1].numpy())
        im3 = Image.fromarray(256 * inputs[0][2].numpy())
        im = Image.merge("RGB", [im1, im2, im3])
        im.show("i")
        break
问题描述:ValueError: mode mismatch

代码中:im1 = Image.fromarray(256 * inputs[0][0].numpy())inputs是数据集1个batch的图像。inputs[0]表示batch中取第一副图像。inputs[0][0]表示该图像的一个通道。.numpy()是将tensor转换成数组。256 *是因为生成图像数据集石对图像做了归一化处理,需要还原。
im1,im2,im3分别表示3个通道,通过merge函数将他们还原成3通道彩色图像。运行时,报错分析:

  1. 首先,每一个通道单独展示正常。
  2. 合并数据时会报错,ValueError: mode mismatch,或者数组数据没有model属性。
    ValueError: mode mismatch_数据

原因分析:

转化的im1,im2,im33个通道数组没有定义图像模式,需要明确定义model.需要im1,im2,im3调用convert设置图像模式。


解决方案:

使用im1.convert('L')定义图像模式。

im1 = Image.fromarray(256 * inputs[0][0].numpy()).convert('L')
im2 = Image.fromarray(256 * inputs[0][1].numpy()).convert('L')
im3 = Image.fromarray(256 * inputs[0][2].numpy()).convert('L')

ValueError: mode mismatch_pytorch_02