Android プラットフォームで数独解決アプリケーションを作成していますが、画像の処理中に問題が発生しました。Sobel フィルターを使用して OpenCV を使用し、Otsu アルゴリズムでしきい値を設定して、パズルの水平線を見つけようとしています。
Mat kernaly = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(10,2));
Mat dy = new Mat();
Mat close = new Mat();
Imgproc.Sobel(img, dy, CvType.CV_16S, 0, 2);
Core.convertScaleAbs(dy, dy);
Core.normalize(dy,dy,0,255,Core.NORM_MINMAX);
Imgproc.threshold(dy, close, 0, 255, Imgproc.THRESH_BINARY|Imgproc.THRESH_OTSU);
Imgproc.morphologyEx(close, close, Imgproc.MORPH_DILATE, kernaly);
この方法は、実際にはほとんどの画像でうまく機能します。次に例を示します。
ただし、次の画像では失敗します。
結果が大きく異なり、上の 2 番目の画像が 1 行しか返さない理由を誰か説明できますか? また、Canny や Hough の行など、代わりに別の方法論を使用する必要がありますか?
前もって感謝します!
編集: marol のアドバイスを使用して、画像をゆがめることなく、できるだけ多くの黒い境界線を削除しようとしました。これは、これらの再加工された画像に上記と同じプロセスを適用した結果です。
画像 1:
画像 2:
ご覧のとおり、ほとんどの線が検出されているため、結果はより良くなっています。しかし、まだ十分ではありません。固定しきい値を追加することで改善できますが、それは画像ごとに異なる必要があります。
この方法は十分に堅牢ではないように思われるため、おそらく新しいアプローチを使用します。どんなヒントでも大歓迎です。