使用CV2与Numpy调整图像适配Keras模型时遇报错求助
解决cv2.resize报错及替代废弃scipy图像函数的方案
问题原因分析
你遇到的cv::hal::resize断言错误,主要是因为OpenCV的resize函数不支持int32类型的图像数组,而且你用PIL读取图像后直接转成int32,同时漏掉了旧代码里的灰度转换、图像反转步骤,这些都导致cv2无法正常处理图像。
你的旧核心逻辑是:读取灰度图→反转图像→缩放到28x28→调整形状适配Keras,新代码里不仅数据类型不符合要求,还缺失了关键的预处理步骤。
修复后的代码方案
下面提供两种可靠的实现方式,完美替代废弃的scipy函数,同时适配Keras模型:
方案1:纯PIL+Numpy实现(更简洁,避开cv2的类型坑)
import numpy as np from PIL import Image def load_and_preprocess_image(infilename): # 1. 读取灰度图(对应旧代码的mode='L') img = Image.open(infilename).convert('L') # 2. 转numpy数组并反转图像 img_array = np.invert(np.asarray(img, dtype=np.uint8)) # 3. 缩放到28x28尺寸 img_resized = Image.fromarray(img_array).resize((28, 28)) # 4. 调整形状为Keras需要的格式 final_array = np.asarray(img_resized).reshape(1, 28, 28, 1) # 可选:查看处理后的图像 img_resized.show() return final_array # 调用函数处理图像 x = load_and_preprocess_image("output.png")
方案2:结合OpenCV实现
如果一定要用cv2,需确保图像是uint8类型,并正确处理灰度转换:
import numpy as np import cv2 def load_and_preprocess_image(infilename): # 1. 直接读取灰度图 img = cv2.imread(infilename, cv2.IMREAD_GRAYSCALE) # 2. 反转图像(对应旧代码的np.invert) img_inverted = cv2.bitwise_not(img) # 3. 缩放到28x28(cv2对uint8类型的图像处理无压力) img_resized = cv2.resize(img_inverted, dsize=(28, 28)) # 4. 调整形状适配Keras final_array = img_resized.reshape(1, 28, 28, 1) # 可选:查看处理后的图像 cv2.imshow("Processed Image", img_resized) cv2.waitKey(0) cv2.destroyAllWindows() return final_array # 调用函数处理图像 x = load_and_preprocess_image("output.png")
关键注意点
- 数据类型:OpenCV和PIL处理图像默认用
uint8(0-255范围),不要随意转成int32,否则会触发处理错误。 - 灰度转换:必须显式将图像转为灰度格式,否则彩色图的3通道会导致后续reshape操作出错。
- 图像反转:这个步骤和旧代码的
np.invert对应,不能漏掉,否则输入Keras的图像明暗会和训练数据不匹配,影响模型预测结果。
内容的提问来源于stack exchange,提问作者user12657351
相关产品推荐
相关产品推荐

