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
相关产品推荐
相关产品推荐

