2016-05-21 10 views
0

基本的に、複数のバイナリイメージがあり、それぞれに1つの接続コンポーネントが含まれています。これらの接続されたコンポーネントはイメージから取得されました。つまり、接続されているすべてのコンポーネントを1つのイメージファイルに描画する場合、空白はなく、接続されたコンポーネントが重複しません。 私は接続されたコンポーネントからエッジピクセルを高速に抽出する方法を探しています。接続されたコンポーネントは、現在、1つの画像に保存されています。位置(x、y)の番号iはi番目の接続コンポーネントに対応します。 400-2000の範囲で最大数の接続コンポーネントがたくさんあるので、私は各コ​​ンポーネントのエッジピクセルを素早く取得する方法を探しています。ここで私は、アルゴリズムから期待するもの説明するためのイメージです。 ExamplePython:複数(> 400)のバイナリイメージからエッジを高速に取得

私はいくつかのエッジ検出アルゴリズムがあることを承知していますが、彼らはグレースケール画像を扱うと大きな画像に小さなオブジェクトのために何か良いではありません大量の画像で助言がありますか?

+0

すべての画像が1つのだけの小さなオブジェクトは、オブジェクトのサイズにあなたのイメージをトリミングまたはのROIを使用含まれている場合。あなたの仕事へのあなたのアプローチはあまり精巧ではないようです... – Piglet

+0

k-meansクラスタリング - >エッジ検出 –

答えて

0

これは、モルフォロジー演算と最小/最大フィルタをより具体的に使用して解決できます。構成要素の数に関係なく、画像全体を2回だけ処理する必要があるので、速度は許容可能でなければならない。

次のコードの最も大きな部分は、サンプル画像を生成するためのものです。国境を取得するための関連する行を以下に示す:

# imports 
import numpy as np 
import scipy as sp 
import scipy.ndimage 

# size of test image 
L=50  
# number of components 
I=20  
# auxiliary array 
array=np.zeros((I,L,L)) 

# for each component 
for i in range(I): 

    # draw random coordinates 
    x,y=sp.random.randint(0,L,size=2) 

    # set coordinate in auxiliary array to index of i-th component 
    array[i,x,y]=i 

    # create 'box' around coordinate 
    array[i]=sp.ndimage.maximum_filter(array[i],size=20) 

# create actual test image from auxiliary array 
image=np.nanmax(array,axis=0) 

# RELEVANT LINES: check if pixel belongs to border 
imax=(sp.ndimage.maximum_filter(image,size=3)!=image) 
imin=(sp.ndimage.minimum_filter(image,size=3)!=image) 
icomb=np.logical_or(imax,imin) 

# keep only pixels of original image at borders 
edges=np.where(icomb,image,np.nan) 

関連する問題