写真から数独パズルを抽出するAndroidアプリを書いています。9x9数独グリッドの各セルについて、1から9までの数字のいずれかが含まれているか、空白であるかを判別する必要があります。これが私のアルゴリズムの大まかなストロークです。
- アダプティブスレッショルドパズル
- 考慮すべき輪郭の数を減らすために拡張します
- パズルの輪郭を見つけて、正方形にワープします
- 正方形を81個の等しいセルに分割します。少なくとも20%の白いピクセルを持つセルを探します
- これらのセルの中心に最も近い白いブロブを見つけて、その境界の長方形を取得します
- 境界矩形内の画像の部分で文字認識(k最近傍/ Tesseractなど)を使用します
数独パズルの太い外側の境界線は簡単な塗りつぶしで削除できますが、内側のグリッド線は拡張した後でも連続しておらず、簡単に削除することはできません。説明のために、外側のグリッド線を削除した後の数独のサンプルを次に示します。
問題:セルに十分なグリッド線があり、そのピクセルの20%以上が白である場合があるため、そのセルに数値が含まれていると誤検出します。このようなセルの例を次に示します。
内側のグリッド線の視認性を下げるために、画像のゆがみを解除することを検討しました。ハフ変換またはこの投稿で説明されている方法を使用して、ワープ解除の前置きとしてグリッド線を見つけることができます。ただし、ワープを解除することによる他の重要な利点は見当たらないので、グリッド線を完全に削除する方が安全で簡単なはずです。
または、前処理を変更して、内側のグリッド線がそのまま残るようにすることもできます。現在、私の前処理は次のとおりです。
Imgproc.GaussianBlur(mat, mat, new Size(11,11), 0);
Imgproc.adaptiveThreshold(mat, matBW, 255,
Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 5, 2);
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_CROSS, new Size(3, 3));
Imgproc.dilate(matBW, matBW, kernel);
しきい値処理の前にノイズを減らすには、ガウスぼかしが必要です。拡張は、外側のグリッド線が接続されていることを確認することですが、内側の線を再接続するには十分ではありません。
画像の残りの部分に影響を与えずに、内側のグリッド線を一貫して削除するにはどうすればよいですか?
どうもありがとう。