web-dev-qa-db-ja.com

画像内の線を検出するための良いアプローチですか?

OpenCVライブラリを使用して草に描かれた白い線を検出するコードをいくつか作成しました。私が使用したアプローチについて誰かの意見が必要です(私よりもはるかに良い方法があると確信しているので)。また、画像のわずかな変動のためにパラメーターを微調整する必要があるため(また、固定パラメーターで操作する必要があるため)、得られる結果は期待したほど良くありません。

これまでの私のアプローチ:

  1. ウェブカメラから画像を取得します(明らかにグレースケールに変換します)
  2. しきい値フィルターを実行します(THRESH_TO_ZEROモードを使用し、しきい値以下のピクセルをゼロにします)。
  3. 画像をぼかす
  4. 侵食フィルターに通す
  5. canny Edge検出器を介して実行します
  6. 最後に、この処理された画像を取得し、確率的ハフ変換HoughLinesPを使用して線を見つけます

フィルターのシーケンスを変更する必要がありますか?

追伸処理能力についてはあまり心配していません。 GPU BでHoughLinesPを実行しています-

また、ここにサンプル画像があります: original image

私が得ている結果:キャニーで with canny キャニーなし(パラメーターの微調整) no canny this time

どんな助けやガイダンスでも大歓迎です!私はそれを改善するために何をすべきかわかりません!

[〜#〜] update [〜#〜]選択した回答に従って、非常に迅速なスケルトン実装(ぼかしのTONSを使用)を使用した後、これを取得しました。 it works!

25
Cashew

画像の スケルトン表現 を使用しようとします。ここでのキャニーの問題は、線の幅のために基本的に2行になることです。

次に、ハフ変換を適用します。

15
JonasVautherin

可能な解決策の1つは、キャニーエッジ検出から取得したすべてのエッジポイントを取得し、これらのポイントで線形最小二乗(おそらく反復)を使用してラインを近似することです。このようにして、常にエッジポイントに「最適な」単一の線を取得します。この方法に関連するパラメーター化は事実上ありません。

5
Zaphod

屋内の画像にはキャニーを使用していましたが、屋外には確率的ハフ線変換(PHT)を適用するよりもラプラスフィルターとソーベルフィルターの方が適しています。

行を太くしたい場合は、ラプラスの後に Sobel演算子 を試し、最後にPHTを試してください。画像がうるさい場合、悪化する可能性があります。

4
Elod

最後の結果(スケルトンフィルターの後)に続いて、多くの小さなセグメントを取得します。その時点で、この記事で行われたことを実装するのに本当に良い立場にいると思います。

http://www.cs.ubc.ca/~lowe/papers/aij87.pdf

基本的に、同じオブジェクトに属する可能性に基づいて、画像内のさまざまな機能を再グループ化するツールを提供します。したがって、あなたがしなければならないことは、結果をアルゴリズムにフィードするだけで、おそらく結果として1行になります。

0
Exeko

RANSACアルゴリズムが良い方法かもしれません。この方法は、regressionまたはinterpolationアプローチに似ています。 _Edge detection_を使用した後、ポイントを抽出する必要があります(私が思うに、この目標のための最良の方法はcannyです)。次に、最適な行を見つける必要があります。いくつかの点を通る線を見つけるには、線形回帰やRANSACなどのさまざまな方法があります。 this linkRANSACアルゴリズムに関する実装とメモを見つけることができます。

この目標のためのRANSACと他の有用なアルゴリズムは、OpenCV(バージョン3.2で知っているように)および_already implemented_(画像処理用の無料ライブラリ)の_Accord NET_であることに注意してください。

0
Babak.Abad