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