2016-05-22 5 views
9

私は、以下のイメージから気泡を分離する良い方法を探しています。私はVisual Studio 2015とC#を使用しています。イメージからの気泡のサイズを決定するアルゴリズム

私は流域の方法について聞いたことがあり、それが良い解決策であると信じています。

私はここで見つけたコードのソリューションを実装してみました:watershed image segmentation

私は多くの成功を持っていませんでした。解決策は、関数の検索に問題があります。たとえば、FilterGrayToGray。

これを行うには良い方法がありますか?

解決方法1:Hough transform for circles

使用するソリューションへ

Example of Image

+1

あなたはOpenCV(またはEmgu CV for .NET ... C#)を試してみましたか?多分あなたの気泡を検出するのに十分なはずです。 –

+0

OpenCVが必要な別のアルゴリズムを試しましたが、ライブラリのすべてのバージョンでCVを利用できます。NuGetは動作しません。 – Toster

+1

それが役に立つなら、[挑戦](http://codegolf.stackexchange.com/questions/40831/counting-grains-of-rice)がcodegolfにありました。 [C#](http://codegolf.stackexchange.com/questions/40831/counting-grains-of-rice)の回答 – CSharpie

答えて

4

気泡がない場合(16×16ピクセルのサンプルグループで)、画像の一部を認識するように、Neural networkをトレーニングするだけです。その後、正方形が正しく認識されない場合は、水平走査線のバーストを行い、エッジの開始位置と終了位置を登録します。気泡の断面をかなり正確に決定することができます(しかし、表面の曲率を考慮に入れてボリュームを決める必要がありますが、より困難ですが)。より多くのカメラを使用する可能性がある場合は、バブルのより多くのセクションを三角形分割して、実際の音量を正確に把握することができます。気泡の大きさを知るためのもう一つのユーロスティックとして、既知の音量のスループットを使うこともできます。そのため、時間間隔内にXリットルの空気を放出し、気泡がある割合で与えられたセクションを持つ場合、さらに精度を上げてください(もちろん、プールの底にある泡がより少なくなるため、圧力を覚えておく必要があります)。

Show different images tweaked

あなたが異なる品質の結果を達成するためにガウス違いやコントラストなどの単純なアルゴリズムで遊ぶことができます見ての通り。

  • 左の写真では、すべての背景ノイズを簡単に削除できますが、今では気泡の一部が失われています。プール上の異なるイルミネーションを使用して、見逃した泡のエッジを再獲得することが可能です。
  • 右の図では泡のエッジ全体が表示されていますが、手動で破棄する必要がある領域が増えました。

エッジ検出アルゴリズムでは、エッジに固定オフセット(畳み込み行列やラプラスなど)を追加しないアルゴリズムを使用する必要があります。これはガウス差が最も効果的だと思います。

すべての中間データを保持しておくと、アルゴリズムを簡単に検証し調整することができ、精度を向上させることができます。

EDIT:

コードは、使用ウィッヒライブラリに依存し、簡単にニューラルネットワークのためにそこに#ソリューションcはすでに存在し、ブラー(ガウス)と水平スキャンラインを実装することができます。

// Do gaussian difference 
Image ComputeGaussianDifference (Image img, float r1, float r2){ 
    Image img = img.GaussianBlur(r1); 
    Image img2 = img.GaussianBlur(r2); 
    return (img-img2).Normalize(); // make values more noticeable 
} 

より編集保留...その間に自分自身を文書化しますしてみてください、私はすでにあなたが仕事をやらせるのに十分なトレースを与え、あなただけの、簡単な画像処理アルゴリズムと準備ができて、ニューラルネットワークの利用の基本的な理解を必要とします。

+0

エッジ検出としては、ノイズ(波、光の反射)おそらく最も良いことは、ガウスの差を試して手動で微調整して泡のエッジだけを見ることです。 – GameDeveloper

+1

神経細胞が必要であるのは、泡ではないエッジ(プールのエッジ、明るいハイライト)があり、NNによって手動で無効にされた領域または領域である必要があるためです。もちろん、より良い方法は、NNの要件を取り除く、単色の青色のバックグラウンドがあるような方法でカメラを配置することです。 – GameDeveloper

+0

このソリューションのサンプルコードを提供できますか? 私は、C#で解決しなければならなかったのと同じ問題を含意するソリューションに問題があり、私はより多くのユーザーDelphiです。 – Toster

1

は気にしています。

解決方法2:

過去には、私はまた、類似した画像分割タスクとのトラブルの多くを持っていました。基本的に私はあなたがプログラムした流域アルゴリズムに似ている洪水の氾濫で終わった。

私はここにしようと、いくつかのハットトリック:

  • 画像を縮小します。
  • 色を使用してください。私はあなたがすべてを灰色にしていることに気づきます。ダークブルーの背景と黒の境界線がある場合はほとんど意味がありません。
2

あなたが楽しみを探している場合は、Application Example: Photo OCRを調べることができます。基本的に、気泡を検出するために1つのNNを訓練し、イメージ全体のスライディングウィンドウでそれを試します。あなたが1つをキャプチャするとき - あなたは気泡の大きさや量を見積もるために訓練された別のNNを使います(おそらくNNを訓練するためにあなたの気流を測定することができます)。それは聞こえるほど難しくはなく、非常に高い精度と適応性を提供します。

P.S. Azure MLは深く進む必要なく、すべての鐘や笛の自由なソースとしてよく見えます。

1

1つのイメージで気泡を分離するか、イメージストリームから同じ気泡を追跡しますか?

「バブル」を分離するには、画像に畳み込み行列を使用してエッジを検出してみてください。画像の性質に基づいてエッジ検出畳み込みを選択する必要があります。ここには、gimpで行われたlaplaceエッジ検出の例がありますが、コードで実装するのは簡単ではありません。

Laplace edge detection

これは、気泡の縁部を分離するのに役立つことができます。

ストリームから同じバブルをトラッキングしている場合、液体を通って流れるときにバブルが歪むため、これはより困難です。フレームレートが十分に高い場合は、フレームごとに違いを見るのが簡単で、どのバブルか(位置の違いに基づいて)判断することができます。つまり、現在のフレームと前のフレームを比較し、何らかの情報を使用して、どのバブルがフレームごとに同じであるかを調べる必要があります。参照点を与えるのに役立つ基準を使用することも有用であろう。画像の下部にあるノズルは、ノズルが形を変えないように署名を生成することができ、毎回そのことを確認することができます。バブルのシグネチャは、ある画像から次の画像に大きく変化する可能性があるため、あまり効果がありません。その代わりに、画像内のブロブとその可能性の高い位置を1つのフレームから次のフレームに処理します。

For more information on how convolution matrices work see here

For more information on edge detection see here.

が、これは、幸運をお役に立てば幸いです。

関連する問題