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

ImageDataGenerator自定义中心裁剪函数报错AttributeError如何解决?

问题解决:AttributeError: 'numpy.ndarray' object has no attribute 'crop'

错误原因

你编写的Crop_Image函数使用了PIL Image的crop()方法,但ImageDataGenerator的preprocessing_function参数接收的是numpy.ndarray类型的图像数据,而非PIL Image对象,因此会触发该属性错误。

解决方案

提供两种可行的修改方式,按需选择:

方式1:转换为PIL Image处理后转回numpy数组

保留你原本的PIL裁剪逻辑,先把numpy数组转成PIL Image,处理完成后再转回numpy数组:

from PIL import Image
import numpy as np

def Crop_Image(image):
    # numpy数组转PIL Image
    pil_img = Image.fromarray(image)
    cropsize = 224
    croplength = cropsize / 2
    x = Xcentre  # 需提前定义Xcentre、Ycentre的具体数值
    y = Ycentre
    # 执行裁剪
    image_crop = pil_img.crop((x - croplength, y - croplength, x + croplength, y + croplength))
    # 转回numpy数组返回
    return np.array(image_crop)

方式2:直接用numpy数组切片裁剪(更高效)

跳过PIL类型转换,直接利用numpy数组的索引切片实现裁剪,注意numpy数组维度顺序为(高度, 宽度, 通道),因此索引顺序是[y范围, x范围, 通道]:

import numpy as np

def Crop_Image(image):
    cropsize = 224
    croplength = cropsize // 2  # 用整数除法避免浮点索引问题
    x = Xcentre  # 需提前定义Xcentre、Ycentre的具体数值
    y = Ycentre
    # 获取图像的高度和宽度
    h, w = image.shape[:2]
    # 计算裁剪边界,防止超出图像范围(可选但推荐)
    x_start = max(0, x - croplength)
    x_end = min(w, x + croplength)
    y_start = max(0, y - croplength)
    y_end = min(h, y + croplength)
    # 执行裁剪
    image_crop = image[y_start:y_end, x_start:x_end, :]
    # 可选:如果裁剪后尺寸不足224,补边到目标大小
    pad_h = cropsize - (y_end - y_start)
    pad_w = cropsize - (x_end - x_start)
    image_crop = np.pad(image_crop, ((pad_h//2, pad_h - pad_h//2), (pad_w//2, pad_w - pad_w//2), (0,0)), mode='nearest')
    return image_crop

额外注意事项

  • Xcentre和Ycentre必须提前赋值为具体的整数(比如图像宽度/2、高度/2),否则会触发NameError。
  • 若使用浮点型的裁剪边界,numpy数组会报错,推荐用整数除法//确保索引为整数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 03:20:16