1

形状を見つけるために、2値化された画像のすべてのピクセルを反復処理する必要があります。ただし、この方法で各画像ピクセルを反復処理するには長い時間がかかります。より高速な方法で画像ピクセルを反復する他の方法はありますか?

dimension = im.shape
rows = dimension[0]
cols = dimension[1]
for i in range(0,rows):
    for j in range(0,cols):
        doSomeOperation(im[i,j])
4

2 に答える 2

1

一般に、何をするdoSomeOperationかによって、どれだけ高速化できるかが決まります。

形状を見つけることへの前述の関心が実際に接続されたコンポーネントを見つけることを意味する場合、ソリューションを高速化する簡単な方法は、パッケージのndimage.labelに続いてndimage.find_objectsscipyを使用することです。

于 2012-12-08T13:53:55.367 に答える
1

rubik のコメントが言ったように、python ループは、ベクトル化された関数が動作する速度に比べて遅いです。ベクトル化された関数を使用して、単一の要素 (より複雑なベクトル化された関数に入ると、より多くの要素) で機能し、単一の値を返す関数を定義します。一般的なベクトル化された関数は、加算や乗算のように既に定義されています。

例えば。

arr = numpy.arange(10)
arr = arr * numpy.arange(10, 20) 
# times all elements arr by the respective element in other array 
arr = arr + 1 
# add 1 to all elements

@numpy.vectorize
def threshold(element):
    if element < 20:
        return 0
    else:
        return element

# @ notation is the same as 
# threshold = numpy.vectorize(threshold)

arr = threshold(arr)
# sets all elements less than 20 to 0

ただし、形状を見つけようとしているので、見ているピクセルの領域を示す価値があるかもしれません。そのため、探しているものを見つけようとするより良い方法があるかもしれません。

于 2012-12-08T14:09:37.760 に答える