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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:07:39