6

===解決済み===

ご提案とコメントをありがとうございます。Beginning Python Visualization book (第 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 関数内にあります。

もう1つの更新:

SciPy のndimage.label()も、私が望んでいることを正確に実行します。

NumPy および SciPy メーリングリストのDavid-Warde FarleyZachary Pincusに乾杯、これを私の目に向けてください :)

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

こんにちは、

粒子分光計で測定された氷の粒子の影を含む画像があります。後で分類して計算でさらに使用できるように、各オブジェクトを識別できるようにしたいと考えています。

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

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

ありがとう。

注: 私の質問では、特定の接続された各ピクセルをオブジェクトまたはエンティティと呼んでいます。以下に示すように、それらを抽出して NumPy 配列表現を作成するという私の意図。(ここでは左上のオブジェクトを使用しています。ピクセルが存在する場合は 1 を使用し、存在しない場合は 0 を使用します。このオブジェクトの形状は 3 x 3 で、対応して高さ 3 ピクセル、幅 3 ピクセルです。これらは、2D ドメインへの実際の氷粒子の投影です。 、それらが球状であり、同等の半径が (高さ + 幅)/2 であるという仮定の下で、後でいくつかのスケーリング -- ピクセルから実際のサイズまで、および体積の計算が続きます)

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]])

これは、使用する画像の一部です。

スクリーンショット http://img43.imageshack.us/img43/2327/particles.png

4

5 に答える 5

5
  1. すべての正方形をスキャンします(たとえば、左上、左から右、上から下から)

  2. 青い四角に当たると、次のようになります。

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

    b。他のすべての隣接する青い正方形を見つけ(たとえば、この正方形の隣人、およびそれらの隣人の隣人などを見て)、それらを同じオブジェクトの一部としてマークします

  3. スキャンを続行します

  4. 別の青い正方形を見つけたら、手順2に進む前に、それが既知のオブジェクトの一部であるかどうかをテストします。または、手順2bで、正方形をオブジェクトに関連付けた後、正方形を消去します。

于 2009-09-19T18:29:19.207 に答える
3

提供した画像を見て、次に行う必要があるのは、単純な領域拡張アルゴリズムを適用することだけです。

MATLABを使用している場合は、bwlabel / bwboundaries関数を使用します。Numpyのどこかに同等の関数があると思います。または、@kwatfordが提案するようにPythonラッパーでOpenCVを使用します。

于 2009-09-19T18:31:15.007 に答える
3

以前は顕微鏡写真でこの種の分析を行っていましたが、最終的に必要なものはすべて、Tcl を介して C で記述された画像処理および分析パッケージに入れました。(512 x 512 の画像のみで機能したため、512 が頻繁にクロップされる理由が説明されています。さまざまなサイズのピクセルが割り当てられた画像がありましたが、ほとんどの作業は 8 ビット ピクセルで行われました。 0xff と、画像の意味のある最大カウントは 254 です。)

簡単に言うと、Tcl コマンドの先頭にある 'zz' は、行の残りをパッケージのパーサーに送信し、パーサーは、指定された引数で適切な C ルーチンを呼び出します。「zz」の直後は、コマンドの入出力を示す引数です。(複数の入力が可能ですが、出力は 1 つだけです。) 'r' は 512 x 512 x 8 ビットのイメージを示します。3 番目の単語は、呼び出されるコマンドの名前です。'graphs' は、以下のテキストで説明されているように画像をマークアップします。したがって、「zz rr グラフ」は「ZZ パーサーを呼び出す」という意味です。グラフ コマンドに r 画像を入力すると、r 画像が返されます。Tcl コマンド ラインの残りの部分では、事前に割り当てられたどのイメージを使用するかを指定します。('g' 画像は ROI、つまり関心領域の画像です。ほとんどすべての ZZ 操作は ROI 制御下で行われます。)

どこからでもオンラインで入手できるとは思いませんが、ソース コードを選択したり、シバン全体をコンパイルしたりしたい場合は、喜んでお送りします。これはマニュアルからの抜粋です (しかし、この遅い日付でマニュアルにいくつかの誤りがあると思います --- それは恥ずかしいことです...):

例 6. 機能のカウント。

問題

カウントは一般的なタスクです。数えたものを「素性」と呼び、素性と実際の数えたいものとが1対1で対応するように画像を用意する必要があります。ただし、ここでは画像の準備を無視し、代わりにカウントの仕組みを検討します。最初のカウント演習は、ディレクトリ ./cells? 内の画像にいくつの特徴があるかを調べることです。

アプローチ

まず、「機能」を定義しましょう。フィーチャは、「セット」(非ゼロ) ピクセルの最大のグループであり、そのすべては、あるセット ピクセルから別のセット ピクセルへと移動することによって到達できます。指定された設定ピクセルから。画像上のそのような特徴を検出してマークする zz コマンドは、「zz rr graphs R:src R:dest G:ROI」です。これは、そのような特徴の数学用語が「グラフ」であるためです。画像のすべてのピクセルが設定されている場合、画像には 1 つのグラフしかありませんが、262144 ピクセル (512 * 512) が含まれています。ピクセルがチェッカーボード パターンで設定され、クリア (ゼロに等しい) されている場合、131072 (512 * 512 / 2) のグラフが存在しますが、それぞれには 1 つのピクセルのみが含まれます。簡単に説明すると、「zz rr グラフ」は、画像の左上隅から開始し、一連のピクセルが見つかるまで各行を左から右にスキャンし、東西南北の境界線 ( 「4連結」)。次に、そのグラフのすべてのピクセルを 1 (0x01) に設定します。グラフ 1 を見つけてマークした後、グラフ 1 を最初に発見したピクセルの次のピクセルから再度スキャンを開始します。今回は、既にグラフに属しているピクセルは無視します。検出された最初の 254 個のグラフは一意にマークされます。ただし、その後に見つかったすべてのグラフは、値 255 (0xff) でマークされるため、互いに区別できません。任意の数のグラフを正確にカウントできるようにするための鍵は、各画像を段階的に処理することです。つまり、画像上のグラフの数を見つけ、その数が 254 を超える場合は、見つかった 254 個のグラフを消去し、254 個以下のグラフが見つかるまでこのプロセスを繰り返します。Tcl 言語は、この操作の制御をセットアップする手段を提供します。

ZZ 画像ファイルを R 画像に読み込み、グラフを検出してマークすることで必要なコマンドの作成を始めましょう。処理ループの前に、変数を宣言してゼロに設定し、画像シリーズのフィーチャの総数を保持します。処理ループ内で、画像ファイルを R 画像に読み込み、グラフを検出してマークすることから始めます。

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

次に、いくつかの変数をゼロにしてカウントを追跡し、「ra max」コマンドを使用して、254 を超えるグラフが検出されたかどうかを調べます。

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 ]
}

「while」ループが終了すると、変数 nGraphs は 255 未満の数、つまり正確にカウントされたグラフの数を保持する必要があります。これは、画像シリーズのフィーチャ数の増加合計に追加されます。

incr sumGraphs $nGraphs

処理ループの後、シリーズで見つかった機能の総数を出力します。

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

処理ループの後、シリーズで見つかった機能の総数を出力します。

于 2009-09-20T14:27:17.210 に答える
2

OpenCVには、便利なPythonインターフェースがあります。

于 2009-09-19T18:23:26.387 に答える
2

連結成分分析は、あなたが探しているものかもしれません。

于 2009-09-20T14:32:23.273 に答える