6

は=== ===あなたの提案やコメントのシンプルな物体認識

感謝を解決しました。 Beginning Python Visualization本(第9章 - 画像処理)に記載されているflood_fillアルゴリズムを使って、私が望むものを実装しました。私はオブジェクトを数えることができ、各オブジェクト(したがって高さと幅)を囲む矩形を取得し、最後にNumPyの配列や行列をそれぞれ作成することができます。

最適化されたアプローチではありませんが、私がしたいのですが。私が使用しているソースコード(lab2.py)とpngファイル(lab2-particles.png)はhttp://code.google.com/p/ccnworks/source/browse/#svn/trunk/AtSc450の下に置かれています。

ヒストグラムを表示するには、NumPyとPILがインストールされており、matplotlibが必要です。コードのコアは、主な再帰オブジェクト検索アクションが発生するobjfind関数内にあります。

ワンさらに更新:

scipyのダウンロードのndimage.label()は、あまりにも、私が欲しいまさにありません。私の目には、この権利を指し示すためのnumpyのscipyのダウンロードとメーリングリストからデビッド・Wardeファーリーザカリー・ピンカスため

乾杯:)

=========== ==

こんにちは、

私は、粒子分析器で測定した氷粒子の影が含まれているイメージを持っています。それぞれのオブジェクトを識別できるようにしたいので、後でそれらを分類してさらに計算で使用することができます。

本質的に、私がやりたいことは、単に各エンティティを選択できるファジー選択ツールを実装することです。

どうすればこの問題を簡単に解決できますか? (できればPythonを使用)

ありがとう。

注:私の質問では、オブジェクトまたはエンティティとしてそれぞれの特定の接続ピクセルを参照しています。私はそれらを抽出し、以下に示すようにNumPyの配列表現を作成するつもりです。 (ここでは、左上のオブジェクトを使用しています;ピクセルが存在する場合、0を使用しない場合は1を使用します)このオブジェクトの形状は3 x 3ピクセル幅です。 、彼らのある球面と等価半径の仮定の下で(高さ+幅)/ 2であり、以降実際のサイズと体積の計算にはいくつかのスケーリング--from画素が続く)ここ

import numpy as np 

np.array([[1,1,1], [1,1,1], [0,0,1]]) 

array([[1, 1, 1], 
     [1, 1, 1], 
     [0, 0, 1]]) 

から区間であります私が使用しようとしている画像。

screenshot http://img43.imageshack.us/img43/2327/particles.png

+5

単純なオブジェクトの認識は、私にとっては矛盾のように聞こえる。 – Joren

+0

何をお勧めしますか? –

+3

あなたの質問に「解決済み」と言ってはいけません。最高の答えを受け入れるか、自分の質問に答えてそれを受け入れます。 – Soviut

答えて

2

OpenCVあなたが役に立つかもしれませんPythonインタフェースを持っています。

+0

これを見つけた:http://opencv.willowgarage.com/documentation/python/pattern_recognition.html 私には多少混乱しますが、例はそれほど役に立ちません。 –

5
  1. あなたは青い四角を打つ左上、左から右、上から下)

  2. から:

    。この正方形を新しいオブジェクトの場所として記録します。

    b。 (など、この広場の隣人を見て、例えば、それらの隣人の隣人、)他のすべての連続した青色の正方形を見つけ、

  3. をスキャンし続け、同じオブジェクトの一部としてそれらをマークし

  4. 別の青い正方形が見つかったら、手順2に進む前に既知のオブジェクトの一部であるかどうかをテストします。あなたが提供された画像を見てみるとオブジェクト

+0

私はあなたがここで言及したのと似たようなものを実装しようと考えていました。私よりもはっきりとレイアウトしていただきありがとうございます:) –

+0

いくつかの助けを借りて、私は単純なflood_fillの実装を書いて、与えられたイメージのオブジェクト(氷粒子の影)の数を数えることができます。そして、はい、それは私が期待したように再帰を含みます。今私は各オブジェクトを表す単純なnumpy配列を構築できるようにしたい。 (私の質問でさらに実証されたように)最後に、これらの配列をすべて配列に追加することを考えています。後で単純にループしてその形状を得ることができます。形状は、氷粒子オブジェクトの高さと幅に使用するため重要です。 –

3

と、それに関連した後、代わりのステップ2bに、任意の四角形を消去し、あなたが次に何をする必要があるすべては、単純なregion growing algorithmを適用することです。

私はMATLABを使用していた場合、私はbwlabel/bwboundaries機能を使用します。私は顕微鏡写真でこの種の分析を行うために使用し、最終的に私は、画像処理に必要なすべてのものを入れて、同等の機能がnumpyのは、のどこかにあります信じるか@kwatford

+0

SciPyパッケージには、すべてのラベルを付けることができる同様のラベル機能(http://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.measurements.label.html#scipy.ndimage.measurements.label)があります。ピクセルを正しく使用してください。しかしそれは問題の最初の部分を解決するだけです。私は各エンティティを別々に区別できるはずです。残念ながら、このための機能はありません。書かれる必要があります:) –

+0

私がそれを理解する方法は、画像内の各青いオブジェクトは実体です、そうですか? 次に、すべてのピクセルを領域にラベリングすることによって、1つのラベルが付けられたピクセル、2つのラベルが付けられたピクセルなどを選択して各オブジェクトを取得します。 次のステップでは、形状、面積、大きさ、...)であり、監督された分類作業で使用される。 – Amro

+0

私は私の質問でエンティティの私の使用を明確にしました。今のところ、私がしなければならないことは、それぞれのオブジェクトの幅と高さによっては境界矩形または四角形が得られることです。 –

3

によって提案されたPythonラッパーでOpenCVのを使用しますCで書かれた解析パッケージで、Tclを介して駆動されます。 (これは512 x 512画像のみで動作し、なぜ512が収穫されるのかを説明しています。さまざまなサイズのピクセルが割り当てられた画像がありましたが、ほとんどの作業は8ビットピクセルで行われました。 0xff、イメージ上で最大の意味のあるカウント254)

簡単に言えば、Tclコマンドの最初の 'zz'は、残りの行をパッケージのパーサに送信します。このパーサーは、指定された引数を持つ適切なCルーチンを呼び出します。 'zz'の直後には、コマンドの入力と出力を示す引数があります。 (複数の入力がありますが、出力は1つだけです) 'r'は512 x 512 x 8ビットのイメージを示します。 3番目の単語は、呼び出されるコマンドの名前です。下のテキストで説明されているように、 'graphs'はイメージをマークアップします。したがって、 'zz rr graphs'は 'ZZパーサを呼び出します。グラフコマンドにrイメージを入力し、rイメージを取得します。 Tclコマンドラインの残りの部分は、事前に割り当てられたイメージのどれを使用するかを指定します。 ( 'g'イメージはROI、つまり関心領域、イメージです;ほとんどすべてのZZオプションはROIコントロール下で行われます)したがって 'r1 r1 g8'は 'r1を入力として使用し、r1を出力として使用しますすなわち、入力画像そのものをマークアップする)、画像g8上の対応するピクセル、すなわちROIとして使用されるr8が0より大きい場合はいつでも操作を実行します。

私はそれがどこでもオンラインで利用可能であるとは思わないが、あなたがソースコードを選ぶ、あるいは全体シェバングをコンパイルしたい場合、私はあなたにそれを送信させていただきます。マニュアルから抜粋したものです(しかし、この後のマニュアルにはいくつかの誤りがあると思います...):

例6カウント機能。

問題

カウントは、一般的なタスクです。カウントされるアイテムは「フィーチャー」と呼ばれ、フィーチャーが実際のオブジェクトと1対1で対応するように、イメージを慎重に準備する必要があります。しかしここでは、画像の準備を無視して、代わりに計数の仕組みを検討します。最初のカウント演習では、ディレクトリ./cells内の画像上にいくつの機能があるかを調べることです。

アプローチ

まず、「feature」を定義しましょう。フィーチャは、「セットされた」(ゼロでない)ピクセルの最大のグループであり、すべてのピクセルは、南北 - 東 - 西(上から下 - 右 - 左)のルートに沿って、所与のセット画素から得られる。画像上のそのような特徴を検出してマークするzzコマンドは、「zz rr graphs R:src R:dest G:ROI」であり、そのような特徴の数学的用語は「グラフ」であるため、呼び出される。イメージ上のすべてのピクセルが設定されている場合、イメージには1つのグラフしかありませんが、262144ピクセル(512 * 512)が含まれています。チェッカーボードパターンでピクセルが設定され、クリア(ゼロに等しい)されている場合、 は131072(512 * 512/2)のグラフがありますが、それぞれ1ピクセルしか含まれません。 簡単に説明すると、画像の左上隅から "zr rr graphs"が始まり、設定されたピクセルが見つかるまで左から右に順に各 をスキャンし、北、南、東を経由して設定されたピクセルをすべて検索します、または西の国境(「4接続」)。次に、そのグラフのすべてのピクセルを1(0x01)に設定します。グラフ1を見つけてマーキングした後、グラフ1を最初に発見したピクセルの後のピクセルで再びスキャンを開始するが、今回は既にグラフに属するピクセルを無視する。発見した最初の254個のグラフは一意にマークされます。ただし、それ以降に見つかったすべてのグラフは値255(0xff) とマークされ、したがって互いに区別することはできません。任意の数のグラフを正確に数えるための鍵は、各画像を段階的に処理することです。すなわち、画像上のグラフの数を見つけ、254を超える場合は、見つかった254個のグラフを消去し、 254以下のグラフが見つかるまで処理してください。 Tcl言語は、この操作の制御を設定する手段を提供します。

Z画像ファイルをR画像に読み込み、グラフを検出してマークすることで、必要なコマンドを作成しましょう。処理ループの前に、画像系列の特徴の総数を保持する変数を宣言してゼロにします。処理ループ内で、画像ファイルをR画像に読み込み、グラフを検出してマーク付けすることから始めます。

zz ur to $inDir/$img r1 
zz rr graphs r1 r1 g8 

次に、我々は254の以上のグラフが検出されたかどうかを調べるために、「RA最大」コマンドを使用し、その後、カウントを追跡するためのいくつかの変数をゼロに。

set nGraphs [ zz ra max r1 a1 g1 ] 

nGraphsが等しい255ない場合254を正確にグラフが全体に加えられるべき数え、次いで、1から254を介してグラフを消去する必要があり、それが低減するのにかかるよう回数が何回について繰り返します255

while {$nGraphs == 255} { 
    incr sumGraphs 254 
    zz rbr lt r1 155 r1 g1 0 255 
    set sumGraphs 0 
    zz rr graphs r1 r1 g8 
    set nGraphs [ zz ra max r1 a1 g8 ] 
} 

以下のグラフの数のループが終了「しながら」、変数nGraphsが255未満の数を保持する必要があり、それは、正確にカウントグラフの数です。これは、画像シリーズの特徴の数の上昇する合計に加えられる。

incr sumGraphs $nGraphs 

処理ループの後に、一連の機能の合計数を表示します。

puts “Total number of features in $inDir \ 
images $beginImg through $endImg is $sumGraphs.” 

処理ループの後に、一連の機能の合計数を表示します。

+0

これは非常に長い回答です。あなたの説明を理解するのに時間がかかるでしょう:) –

+0

パッケージのTclコマンドライン構文の小説の紹介としてpara 2を追加しました。それはあなたの「把握」を助けるかもしれません。 ところで、このマニュアルには、形態学的操作を使って画像を準備する方法を示し、特徴を見つけて数えた後、それらのサイズ分布を作るなどの作業を行う例があります。 私は真剣にPythonにそれを適用しようとしたことはありませんでしたが、しばらく私の頭の中にいました。 – behindthefall

+0

また、BTW: 'graphs'は、基本的にPaul HeckbertのGraphics Gems、Vol.I、p.721のアルゴリズムを使用しています。 – behindthefall

2

Connected component analysisあなたが探しているものかもしれません。

+0

私はこのテクニックのために新しいがなければならないことを知っていた:)ポインタのおかげで。 Pygraph(http://code.google.com/p/python-graph/)とPython包みを使ったopencvの両方でこれらのアルゴリズムがサポートされていますが、それらの使用法はあまり明確ではありません。あなたはこれらの機能を使いましたか? –