3

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:

画像1

画像 2:

画像2

ご覧のとおり、ほとんどの線が検出されているため、結果はより良くなっています。しかし、まだ十分ではありません。固定しきい値を追加することで改善できますが、それは画像ごとに異なる必要があります。

この方法は十分に堅牢ではないように思われるため、おそらく新しいアプローチを使用します。どんなヒントでも大歓迎です。

4

3 に答える 3

1

otsu の代わりに別の提案:

ソーベル画像の Y 方向の極大値を検索できます。

  • 1x10 の長方形カーネルでソーベル画像を膨張させます (「10」は、画像内のグリッド線間の最小距離でなければなりません)
  • 膨張した画像を元の画像と比較し、等しくないすべてのピクセルをゼロに設定します ( cmp(dy,dilatedImg,comparisonImg,CMP_GE)
  • 極大値のないすべての領域を削除します ( threshold(dy, mask, 1, 255, THRESH_BINARY); And(comparisonImg, mask, comparisonImg);)

これで、局所領域で最も強い水平エッジに対応するすべてのピクセルが得られました。


補足として、あなたの sobel の使い方は少し奇妙です:

黒い線の境界ではなく中心を識別したいので、これを行うと仮定ます。Imgproc.Sobel(img, dy, CvType.CV_16S, 0, 2);しかし、その場合、次のステップである convertScaleAbs は直感に反するように見えます。そうすれば、2 番目のソーベル導関数の最小値と最大値が得られます。最大値は黒い線の中心に対応する必要がありますが、最小値はエッジ画像に表示される奇妙な「トリプル ライン」アーティファクトを導入します。最初の sobel 導関数を使用する場合は、Abs ステップの方が合理的ですが、この場合、負の値を破棄する方がうまくいく可能性があります。

于 2014-08-09T08:14:34.797 に答える
1

問題は、強度分布が原因である可能性があります。sobel 演算子の後のヒストグラムを見ると、次のようになります。

ここに画像の説明を入力

大津検出に成功した画像のヒストグラムと比較します。

ここに画像の説明を入力

計算されたしきい値が左ではなく右に移動したため、最初のヒストグラムで失敗したことが簡単にわかります(左側に大きなピークがあり、すべての黒いピクセルが目立ちます)。そして 2 番目のケースでは、計算されたしきい値を右に「運ぶ」白いピクセルが多くなるという状況ではなく、分布はピークとフラット レストにそれほど分割されません。

つまり、黒いピクセルの支配を取り除く必要があります。言い換えれば、周囲の黒いピクセルの境界線ができるだけ最小限になるように数独をスケーリングしてみてください。これにより、配布は2番目のケースのようになります。

これらのヒストグラムから私見すると、画像の「黒」部分と「白」部分の違いにより、計算されたしきい値レベルが画像に非常に敏感であるため、この方法は非常に敏感であると言えます。私はこのアプローチに依存しません。一定のしきい値レベルについてはどうですか? 一般的には良くないように聞こえるかもしれませんが、ここではより決定論的に機能し、それでも正しいかもしれません。

于 2014-08-08T13:10:31.203 に答える