2013-04-16 30 views
5

OpenCVを使用して、以下に示すようにバイナリイメージの楕円を検出しています。画像には、検出されるべき8つの楕円がある。 findContoursを使用して、8つの省略記号を含む多くの輪郭を取得できます。問題は、どのように判断することができ、どれが楕円ではないのですか?どのように他のすべての誤検出を削除するには?誤検出を削除するには?

enter image description here enter image description here

+1

何らかの種類のサークルがある場合は、軸の比率と軸のサイズをチェックしてノイズを除去することができます。 – mrgloom

+1

に似ている可能性があります:http://stackoverflow.com/questions/12977300/how-to-check-if-a-content-is-an-ellipse/12978905#12978905 –

答えて

6

1つのオプションは、少しハックです:findContoursの上に 分でminEnclosingCircleとフィルタの輪郭を使用しています。閾値に基づいて半径を囲む(半径Aより小さい(小さな小塊を除去する)、半径Bより大きい(巨大な小滴を除去する))。 minAreaRectを試して、幅/高さの比を調べて、高さ/幅のよりも均一な塊を探すこともできます。

ハッピーな解決策は、ハフ変換を使用することです。 hough circleとチュートリアルをご覧ください

+0

ありがとうございます。大きすぎるものや小さすぎるものを取り除くと便利だと思います。実際、偽の検出を取り除くために胡の瞬間を使うという考えがあります。これは、まず、数回の訓練楕円の瞬間を計算することです。次に、それぞれの輪郭に対して、それらが訓練されたものと非常に異なる場合、その胡のモーメントを計算し、その後、その輪郭を除外することができる。あなたはこの考えが有用だと思いますか? – Shiyu

+0

私はハフの瞬間を自分で使っていないので、経験から助言することはできません。あなたが必要としているようにハーフサークルの音が鳴ります。申し訳ありませんが、私は 'minEnclosingCircle()'を使うためにもっと多くの支援がありません。 –

+0

+1。 – karlphillip

6

この特定のケースでは、Hough Circle Transformがおそらく最も簡単な解決策です。

コピーをチュートリアルからコードとにcv::HoughCircles()のパラメータを変更します。

/// Apply the Hough Transform to find the circles 
HoughCircles(src_gray, circles, CV_HOUGH_GRADIENT, 1, 10, 40, 30, 0, 0); 

出力

enter image description here

しかし、私はそれで行く、ジョージのアイデア@愛し、それはですハードコードされた定数を指定するよりも堅牢です。私のアプローチはこの画像には効果的ですが、サークルや素材のサイズが異なる画像がある場合は、cv::minEnclosingCircle()を使用します。

1

今私は自分のalgoを使用して問題を解決していると思います。将来の参照のために投稿してください。

以下に示すように、すべての楕円を正確に見つけることができます。そして、誤検出は首尾よく取り除かれます。一方、アルゴは非常に時間効率が良い:通常のデスクトップ上のすべての画像処理では0.03秒。画像サイズ:ALGOの448x336ピクセル

手順:

  1. 輪郭
  2. の最小サイズの閾値を設定することにより、小さすぎるものを除去する機能findContours
  3. を用いて二値画像から輪郭を検出しますfitEllipse関数を使用して楕円を検出する
  4. 対応する楕円と輪郭を比較します。具体的には、すべての輪郭点を一般的な楕円方程式に置き換えます(http://www.maa.org/joma/volume8/kalman/general.html参照)。その後、代数的誤差を計算する。エラーがしきい値より小さい場合は、その輪郭を除外します。

enter image description here

EDIT:ジョージProfenzaとkarlphillipの答えにコメント。 George Profenzaとkarlphillipに感謝します。しかし、彼らの答えは問題をうまく解決できません。George Profenzaによって与えられた最初のアイデアは輪郭のサイズの閾値を設定することです。実際、私はそれを私の恋人に使っています。しかし、それは明らかに孤独の予備段階です。 「良い」サイズの多くの誤検出があります。 George Profenzaの2番目のアイデアは、HoughCirclesを使用することです。これはkarlphillipでも提案されています。 HoughCirclesの問題は次のとおりです。(a)遅いですが、私は組み込みシステムでアルゴをリアルタイムで実装する必要があります。 (b)円だけを検出できるが、楕円は検出できない。もちろん、楕円が円の近くにある場合は、それも機能します。しかし、一般的なケースではそうではありません。また、上記の方法では「figure 8」を検出できません。それは大きな問題であり、私はまだそれに取り組んでいます。

+0

あなたのアルゴリズムは、右下隅にある2つの省略記号(「図8」)を見落としているようです。これは問題ですか? Houghメソッドがそれらを見つけたことに注意してください。 – Throwback1986

+1

はい。私はあなたがハフサークルを使用したかどうかについて興味があります。この問題は、ジョージとカールが上記のように示唆したように、正しい問題のように思えます。一般に、ハフ変換などの方法は、単なるヒューリスティックよりも堅牢である傾向がある。 – lightalchemist

+0

@ Throwback1986:ご意見ありがとうございます。まず第一に、私がHoughCirlcesを使用しない理由は、(a)それは遅いですか(私は組み込みシステムでリアルタイム実装が必要です)。 (b)それは円だけを見つけることができますが、楕円は見つけることができません(右?)。もちろん、楕円が円に近いときに楕円も見つけることができます。第二に、「figure 8」は本当に大きな問題です。実際、私はまだそれに取り組んでいます。それのための任意のアイデア? – Shiyu

1

これまでに別の回答が受け入れられていますが、いくつかの選択肢がありますので、別の回答を追加します。ハフ方法は、あなたのアプリケーションのために十分に高速であると仮定すると、ここでいくつかの興味深いの選択肢は以下のとおりです。

  1. Ellipse detection with OpenCV
  2. http://www.codeforge.com/article/131943
  3. http://toyhouse.cc/profiles/blogs/modified-hough-ellipse-transform-detecting-ellipse-in-an-accurateそして、私は上記のコメントで追加された紙:http://www.bmva.org/bmvc/1988/avc-88-041.pdf

また、Houghが楕円を確実に検出するための「正しい」方法である可能性が高いと付け加えるかもしれませんが、int追加の課題。 Houghサークルがデスクトップ上で十分に速いことを示していますが、デスクトップのパフォーマンスが組み込みシステムとどれくらい一致していますか?組み込みシステムに浮動小数点ユニットがありますか?そうでない場合は、ソフトウェアエミュレートされた浮動小数点のパフォーマンスにあまり気を付けすぎないでください。ルックアップテーブルなどを使ってHoughアルゴリズムをうまく実装できるかもしれません。

+0

多くのありがとう.... – Shiyu

関連する問題