You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将PIL读取的图像适配tf.image.decode_image实现32×32×3缩放?

问题原因

tf.image.decode_image的输入要求是原始图像字节流(比如从文件直接读取的二进制数据),而你传入的是PIL已经解码完成的JpegImageFile对象,类型不匹配导致报错。

三种解决方法

方法1:直接将PIL图像转为TensorFlow张量

利用TensorFlow的原生方法,把PIL解码好的图像直接转为张量,无需再调用decode_image:

import PIL
import tensorflow as tf
from keras_preprocessing.image import array_to_img

path_image = "path/cat_960_720.jpg"

read_image = PIL.Image.open(path_image)
# 将PIL图像转为TensorFlow张量(已完成解码)
image_tensor = tf.convert_to_tensor(read_image, dtype=tf.float32)

print("原始图像尺寸:", image_tensor.shape, "\n")
print("原始图像张量:", image_tensor)

# 缩放到32×32
resize_image = tf.image.resize(image_tensor, (32, 32))
# 确保输出为3通道(兼容灰度图转RGB的情况)
if resize_image.shape[-1] == 1:
    resize_image = tf.image.grayscale_to_rgb(resize_image)

print("缩放后图像尺寸:", resize_image.shape)
print("缩放后图像张量:", resize_image)

to_img = array_to_img(resize_image)
to_img.show()

方法2:用TensorFlow原生流程读取解码

跳过PIL,直接用TensorFlow读取文件字节并解码,更贴合TF的使用习惯:

import tensorflow as tf
from keras_preprocessing.image import array_to_img

path_image = "path/cat_960_720.jpg"

# 读取图像文件二进制字节
image_bytes = tf.io.read_file(path_image)
# 解码为3通道RGB张量
image_decode = tf.image.decode_image(image_bytes, channels=3, dtype=tf.float32)

print("原始图像尺寸:", image_decode.shape, "\n")
print("原始图像张量:", image_decode)

# 缩放到32×32
resize_image = tf.image.resize(image_decode, (32, 32))

print("缩放后图像尺寸:", resize_image.shape)
print("缩放后图像张量:", resize_image)

to_img = array_to_img(resize_image)
to_img.show()

方法3:PIL转Numpy数组再转张量

如果需要先做PIL的图像预处理(比如裁剪、旋转),可以先转Numpy数组再转张量:

import PIL
import numpy as np
import tensorflow as tf
from keras_preprocessing.image import array_to_img

path_image = "path/cat_960_720.jpg"

read_image = PIL.Image.open(path_image)
# 这里可以加入PIL预处理步骤,例如:
# read_image = read_image.crop((100, 100, 800, 600))

# PIL转Numpy数组
image_np = np.array(read_image)
# Numpy转TensorFlow张量
image_tensor = tf.convert_to_tensor(image_np, dtype=tf.float32)

print("原始图像尺寸:", image_tensor.shape, "\n")
print("原始图像张量:", image_tensor)

# 缩放到32×32并确保3通道
resize_image = tf.image.resize(image_tensor, (32, 32))
resize_image = tf.ensure_shape(resize_image, (32, 32, 3))

print("缩放后图像尺寸:", resize_image.shape)
print("缩放后图像张量:", resize_image)

to_img = array_to_img(resize_image)
to_img.show()
关键注意点
  • 所有方法最终都要保证输出张量的形状为(32, 32, 3),可以通过指定通道数、灰度转RGB或强制形状来实现。
  • tf.image.resize默认输出浮点型张量,和array_to_img的输入要求兼容。

内容的提问来源于stack exchange,提问作者mCs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:45:38