格檢測深入剖析:自適應(yīng)閾值+輪廓分析如何精準鎖定歪斜照片里的數(shù)獨)
sudoku-solver網(wǎng)格檢測深入剖析自適應(yīng)閾值輪廓分析如何精準鎖定歪斜照片里的數(shù)獨【免費下載鏈接】sudoku-solverSmart solution to solve sudoku in VR項目地址: https://gitcode.com/gh_mirrors/su/sudoku-solversudoku-solver 是一款能「拍照片直接解題」的開源數(shù)獨求解器它的核心難題就是網(wǎng)格檢測——如何在歪斜、傾斜、光照不均的真實照片里精準框出那 9×9 的方格。本文帶你拆解它的完整方案自適應(yīng)閾值 → 輪廓分析 → 透視矯正三步流水線外加一條 Hough 變換備用路線看看它是如何做到連手抖歪拍的照片都能鎖定的。為什么「歪斜照片」是網(wǎng)格檢測的難點先看一張真實的測試輸入這張照片里網(wǎng)格整體傾斜、紙張有輕微透視變形光照也不均勻。對網(wǎng)格檢測來說這意味著三件事不能用全局閾值照片四角亮、中間暗固定閾值會讓一部分網(wǎng)格線消失不能假設(shè)網(wǎng)格是正放的四角坐標必須從形狀里「猜」出來而不是按行掃描不能只找到一個格一張照片里可能有多個數(shù)獨比如攤開的書。sudoku-solver 的 GridDetector 類就是為這三點量身定做的入口extract_grids()只做三件事threshed_img self.thresh_img(frame) # ① 自適應(yīng)閾值 grids_corners_list self.look_for_grids_corners(threshed_img) # ② 輪廓分析 unwraped_grid_list, transfo_matrix self.unwrap_grids(...) # ③ 透視矯正第一步自適應(yīng)閾值把網(wǎng)格線「打亮」預(yù)處理代碼只有寥寥幾行但每一步都有講究thresh_img對比度拉伸(gray - gray.min()) * 255 / (gray.max() - gray.min())把昏暗的照片壓成黑白分明高斯模糊 (5×5)抹掉紙張紋理和高頻噪點防止它們變成「假網(wǎng)格線」自適應(yīng)閾值cv2.adaptiveThreshold這是關(guān)鍵。它不像全局閾值那樣用一個固定值而是以每個像素鄰域41×41 窗口的均值減去常數(shù) 15 作為局部閾值所以照片哪邊亮哪邊暗都能正確分離出黑色的網(wǎng)格線取反 形態(tài)學(xué)閉運算 膨脹5×5 核閉運算把斷開的網(wǎng)格線連成完整閉合框膨脹則加粗線條為后面的輪廓檢測鋪路。幾個可調(diào)參數(shù)集中在 settings.pyblock_size_big 41鄰域窗口、mean_sub_big 15減去的常數(shù)、smallest_area_allow 75000最小有效面積。窗口越大對光照漸變越「寬容」但也越容易把數(shù)字誤判為線條——這就是自適應(yīng)閾值的經(jīng)典權(quán)衡。第二步輪廓分析多邊形近似四角一次鎖定拿到二值化圖后look_for_grids_corners 用輪廓分析鎖定候選網(wǎng)格cv2.findContours(RETR_EXTERNAL)只取最外層輪廓——網(wǎng)格的外框正好是最外圈內(nèi)部的 80 條細線自然被排除按面積從大到小排序逐個篩選面積小于75000像素直接放棄比最大輪廓小2倍以上ratio_lim的也丟棄——這一步同時解決了「一張照片多個網(wǎng)格」和「大面積噪聲」問題cv2.approxPolyDP以0.1 × 周長為容差做多邊形近似只有恰好剩下 4 個頂點的輪廓才算合格——這一步天然過濾掉了圓形、L 形等干擾物最后 find_corners 用「輪廓點均值」把四個頂點分到左上/右上/右下/左下四個象限保證角點順序穩(wěn)定為下一步的透視變換做好準備。 整套流程沒有任何「假設(shè)網(wǎng)格是正方形」的硬編碼所以即使照片旋轉(zhuǎn)任意角度、有輕微透視變形四角依然能按正確順序取出來。第三步透視矯正把歪格子拉回 450×450有了四角坐標unwrap_grids 調(diào)用cv2.getPerspectiveTransform求出單應(yīng)矩陣再用cv2.warpPerspective把歪斜的網(wǎng)格「攤平」成一個標準的 450×450 圖像target_h_grid, target_w_grid 450, 450見 settings.py。這一步的價值有兩個后續(xù)識別只面對正放的網(wǎng)格數(shù)字提取、CNN 識別可以按 9×9 均分格子來做邏輯大幅簡化逆矩陣被保存下來每張網(wǎng)格都附帶一個np.linalg.inv(transfo_mat)稍后解出答案時用它把數(shù)字「貼回」原照片的歪斜位置。備用路線Hough 變換找交叉點除了輪廓分析項目還保留了另一套方案 get_hough_transform用標準 Hough 變換閾值thresh_hough 500在邊緣圖上找出所有直線再由 MyHoughLines 把「同一條線的多段碎片」合并起來——判定條件非常樸素兩條線的 ρ 差小于 10 像素、θ 差小于 7° 就視為同一條線are_mergeable合并時用加權(quán)平均更新參數(shù)。合并完成后look_for_intersections_hough 在所有存活的直線里找出最上、最下、最左、最右四條兩兩求交點同樣得到網(wǎng)格四角。這條路線在網(wǎng)格線較細、輪廓閉合失敗時更穩(wěn)健屬于「雙保險」。從檢測到解題把答案「貼回」歪斜的原圖檢測只是起點。解出答案后ImageGenerator.recreate_img_filled 會創(chuàng)建一張與原圖同尺寸的虛擬黑圖用之前保存的逆透視矩陣把寫滿綠色答案的網(wǎng)格 warp 回原圖位置再按掩碼疊加回照片——所以你看到的成品是歪斜的原照片 對齊得嚴絲合縫的綠色數(shù)字。關(guān)鍵參數(shù)速查表參數(shù)默認值作用位置block_size_big41自適應(yīng)閾值的鄰域窗口settings.pymean_sub_big15閾值減去的常數(shù)越大線條越細settings.pysmallest_area_allow75000網(wǎng)格輪廓最小面積過濾噪聲settings.pyratio_lim2與最大輪廓的面積比上限過濾小干擾塊settings.pyapprox_poly_coef0.1多邊形近似容差決定「四邊形」判定松緊settings.pytarget_h_grid / w_grid450透視矯正后網(wǎng)格的標準尺寸settings.pythresh_hough500Hough 路線的直線累加閾值settings.py快速上手裝好依賴NumPy、OpenCV、TensorFlow、KivyMD并克隆倉庫后直接運行入口腳本即可啟動帶實時解題與相冊解題兩個界面kivy_md.pypython3 kivy_md.py如果想單獨驗證網(wǎng)格檢測也可以直接運行 grid_detector.py 底部的__main__它會對images_test/sudoku.jpg輸出裁好的網(wǎng)格圖grid_cut_0.jpg方便你一步步調(diào)參觀察。小結(jié)sudoku-solver 的網(wǎng)格檢測思路可以濃縮成一句話用自適應(yīng)閾值對抗光照不均用「面積篩選 四邊形近似」的輪廓分析對抗歪斜和多目標再用透視變換把世界拉正。三步全部基于經(jīng)典 OpenCV 算子沒有一行業(yè)務(wù)黑盒——這正是它值得拆解學(xué)習(xí)的地方一套樸素但嚴密的幾何流水線足以馴服絕大多數(shù)歪斜照片?!久赓M下載鏈接】sudoku-solverSmart solution to solve sudoku in VR項目地址: https://gitcode.com/gh_mirrors/su/sudoku-solver創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考