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

如何提升基于OpenCV的数独求解器的数字识别准确率?

数独数字识别准确率优化方案

一、修复图像处理中的明显bug

你的predict_digits函数里存在裁剪范围错误:

# 原错误代码
img = image[4:img_width-4, 4:img_height-4]

split_grid后每个方块是50x50(450/9),但你用了全局的img_width=450作为裁剪终点,这会导致索引越界,实际只裁剪了方块的一小部分。修正为针对单个方块的尺寸裁剪:

# 修正后
square_size = 50  # 450/9=50
img = image[4:square_size-4, 4:square_size-4]

二、对齐训练与推理的图像预处理流程

  1. 确认图像反转逻辑:MNIST数据集的数字为黑色(低像素值)、背景为白色(高像素值),而你的数独图像可能是白底黑字。检查训练时是否对图像执行了bitwise_not反转,如果训练时没做反转,推理时的反转会导致输入和训练数据分布完全相反,直接降低准确率。
  2. 统一预处理步骤:训练集的图像是否经过了高斯模糊、二值化?如果训练时没有这些操作,推理时的预处理会引入额外噪声。建议将推理时的单个数字预处理步骤和训练时完全对齐,比如训练时如果是直接resize到28x28、归一化,那推理时也只做这些操作。

三、优化网格分割与数字提取

  1. 去除网格线干扰:透视变换后的图像可能残留网格线,分割后会和数字混在一起干扰识别。在split_grid前加入形态学操作去除细线条:
# 在warp之后、split_grid之前添加
kernel = np.ones((3,3), np.uint8)
img_warped = cv2.morphologyEx(img_warped, cv2.MORPH_OPEN, kernel)
# 再做二值化,确保数字和背景分离
_, img_warped_thresh = cv2.threshold(img_warped, 127, 255, cv2.THRESH_BINARY_INV)
  1. 验证分割准确性:在split_grid后,把每个方块保存为图片,检查是否每个方块都完整包含数字、没有多余的边框或空白区域。如果分割偏移,说明透视变换的biggest_contour识别不准确,需要调整approxPolyDP的参数(比如把0.02改成0.03),或者增加轮廓筛选的条件(比如检查轮廓的宽高比接近1)。

四、模型训练与适配优化

  1. 消除数据集分布差异:MNIST是手写数字,和数独的印刷体差异较大。建议:
    • 优先使用印刷体数据集训练,减少MNIST的占比,或者只使用印刷体数据集;
    • 加入数据增强:对训练图像做轻微旋转(±5度)、缩放(0.9-1.1倍)、平移、添加高斯噪声,提升模型对不同风格印刷体的鲁棒性;
  2. 处理类别不平衡:数独中空单元格(对应预测的0)数量远多于数字,训练时模型会偏向预测0。解决方法:
    • 使用加权交叉熵损失,给数字类分配更高的权重;
    • 过采样数字样本,或者欠采样空单元格样本,让训练集类别分布更均衡;
  3. 模型评估与调优:
    • 用验证集评估模型,查看混淆矩阵,明确哪些数字容易被误判(比如1和7、3和8),针对性补充对应样本;
    • 如果模型过拟合,添加Dropout层或L2正则化;如果欠拟合,适当增加模型层数或神经元数量。

五、推理阶段细节调整

  1. 调整概率阈值:当前0.7的阈值可能过于严格或宽松,建议统计验证集上所有正确预测的概率分布,选择合适的阈值(比如0.5或0.6),减少正确数字被误判为0的情况;
  2. 优化resize插值方式:数字是高对比度的图形,使用cv2.INTER_NEAREST最近邻插值可以避免模糊,保留数字边缘细节:
img = cv2.resize(img, (28, 28), interpolation=cv2.INTER_NEAREST)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 12:04:59