ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

sudoku-solver网格检测深入剖析:自适应阈值+轮廓分析如何精准锁定歪斜照片里的数独

sudoku-solver网格检测深入剖析:自适应阈值+轮廓分析如何精准锁定歪斜照片里的数独 sudoku-solver网格检测深入剖析自适应阈值轮廓分析如何精准锁定歪斜照片里的数独【免费下载链接】sudoku-solverSmart solution to solve sudoku in VR项目地址: https://gitcode.com/gh_mirrors/su/sudoku-solversudoku-solver 是一款能「拍照片直接解题」的开源数独求解器它的核心难题就是网格检测——如何在歪斜、倾斜、光照不均的真实照片里精准框出那 9×9 的方格。本文带你拆解它的完整方案自适应阈值 → 轮廓分析 → 透视矫正三步流水线外加一条 Hough 变换备用路线看看它是如何做到连手抖歪拍的照片都能锁定的。为什么「歪斜照片」是网格检测的难点先看一张真实的测试输入这张照片里网格整体倾斜、纸张有轻微透视变形光照也不均匀。对网格检测来说这意味着三件事不能用全局阈值照片四角亮、中间暗固定阈值会让一部分网格线消失不能假设网格是正放的四角坐标必须从形状里「猜」出来而不是按行扫描不能只找到一个格一张照片里可能有多个数独比如摊开的书。sudoku-solver 的 GridDetector 类就是为这三点量身定做的入口extract_grids()只做三件事threshed_img self.thresh_img(frame) # ① 自适应阈值 grids_corners_list self.look_for_grids_corners(threshed_img) # ② 轮廓分析 unwraped_grid_list, transfo_matrix self.unwrap_grids(...) # ③ 透视矫正第一步自适应阈值把网格线「打亮」预处理代码只有寥寥几行但每一步都有讲究thresh_img对比度拉伸(gray - gray.min()) * 255 / (gray.max() - gray.min())把昏暗的照片压成黑白分明高斯模糊 (5×5)抹掉纸张纹理和高频噪点防止它们变成「假网格线」自适应阈值cv2.adaptiveThreshold这是关键。它不像全局阈值那样用一个固定值而是以每个像素邻域41×41 窗口的均值减去常数 15 作为局部阈值所以照片哪边亮哪边暗都能正确分离出黑色的网格线取反 形态学闭运算 膨胀5×5 核闭运算把断开的网格线连成完整闭合框膨胀则加粗线条为后面的轮廓检测铺路。几个可调参数集中在 settings.pyblock_size_big 41邻域窗口、mean_sub_big 15减去的常数、smallest_area_allow 75000最小有效面积。窗口越大对光照渐变越「宽容」但也越容易把数字误判为线条——这就是自适应阈值的经典权衡。第二步轮廓分析多边形近似四角一次锁定拿到二值化图后look_for_grids_corners 用轮廓分析锁定候选网格cv2.findContours(RETR_EXTERNAL)只取最外层轮廓——网格的外框正好是最外圈内部的 80 条细线自然被排除按面积从大到小排序逐个筛选面积小于75000像素直接放弃比最大轮廓小2倍以上ratio_lim的也丢弃——这一步同时解决了「一张照片多个网格」和「大面积噪声」问题cv2.approxPolyDP以0.1 × 周长为容差做多边形近似只有恰好剩下 4 个顶点的轮廓才算合格——这一步天然过滤掉了圆形、L 形等干扰物最后 find_corners 用「轮廓点均值」把四个顶点分到左上/右上/右下/左下四个象限保证角点顺序稳定为下一步的透视变换做好准备。 整套流程没有任何「假设网格是正方形」的硬编码所以即使照片旋转任意角度、有轻微透视变形四角依然能按正确顺序取出来。第三步透视矫正把歪格子拉回 450×450有了四角坐标unwrap_grids 调用cv2.getPerspectiveTransform求出单应矩阵再用cv2.warpPerspective把歪斜的网格「摊平」成一个标准的 450×450 图像target_h_grid, target_w_grid 450, 450见 settings.py。这一步的价值有两个后续识别只面对正放的网格数字提取、CNN 识别可以按 9×9 均分格子来做逻辑大幅简化逆矩阵被保存下来每张网格都附带一个np.linalg.inv(transfo_mat)稍后解出答案时用它把数字「贴回」原照片的歪斜位置。备用路线Hough 变换找交叉点除了轮廓分析项目还保留了另一套方案 get_hough_transform用标准 Hough 变换阈值thresh_hough 500在边缘图上找出所有直线再由 MyHoughLines 把「同一条线的多段碎片」合并起来——判定条件非常朴素两条线的 ρ 差小于 10 像素、θ 差小于 7° 就视为同一条线are_mergeable合并时用加权平均更新参数。合并完成后look_for_intersections_hough 在所有存活的直线里找出最上、最下、最左、最右四条两两求交点同样得到网格四角。这条路线在网格线较细、轮廓闭合失败时更稳健属于「双保险」。从检测到解题把答案「贴回」歪斜的原图检测只是起点。解出答案后ImageGenerator.recreate_img_filled 会创建一张与原图同尺寸的虚拟黑图用之前保存的逆透视矩阵把写满绿色答案的网格 warp 回原图位置再按掩码叠加回照片——所以你看到的成品是歪斜的原照片 对齐得严丝合缝的绿色数字。关键参数速查表参数默认值作用位置block_size_big41自适应阈值的邻域窗口settings.pymean_sub_big15阈值减去的常数越大线条越细settings.pysmallest_area_allow75000网格轮廓最小面积过滤噪声settings.pyratio_lim2与最大轮廓的面积比上限过滤小干扰块settings.pyapprox_poly_coef0.1多边形近似容差决定「四边形」判定松紧settings.pytarget_h_grid / w_grid450透视矫正后网格的标准尺寸settings.pythresh_hough500Hough 路线的直线累加阈值settings.py快速上手装好依赖NumPy、OpenCV、TensorFlow、KivyMD并克隆仓库后直接运行入口脚本即可启动带实时解题与相册解题两个界面kivy_md.pypython3 kivy_md.py如果想单独验证网格检测也可以直接运行 grid_detector.py 底部的__main__它会对images_test/sudoku.jpg输出裁好的网格图grid_cut_0.jpg方便你一步步调参观察。小结sudoku-solver 的网格检测思路可以浓缩成一句话用自适应阈值对抗光照不均用「面积筛选 四边形近似」的轮廓分析对抗歪斜和多目标再用透视变换把世界拉正。三步全部基于经典 OpenCV 算子没有一行业务黑盒——这正是它值得拆解学习的地方一套朴素但严密的几何流水线足以驯服绝大多数歪斜照片。【免费下载链接】sudoku-solverSmart solution to solve sudoku in VR项目地址: https://gitcode.com/gh_mirrors/su/sudoku-solver创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表