1

スライディング ウィンドウを使用して、画像に対して何らかの操作 (GLCM) を計算したいと考えています。それを達成するためのコードは次のとおりです。

import numpy as np
from skimage.feature import greycomatrix, greycoprops

from numpy.lib.stride_tricks import as_strided

image = np.arange(36).reshape((6,6))

window = 5

result = np.zeros(image.shape)
for i in xrange(window/2,image.shape[0]-window/2):
    for j in xrange(window/2,image.shape[1]-window/2):
        sample = image[i-(window/2):i+(window/2)+1, j - (window/2):j+(window/2)+1]
        glcm = greycomatrix(sample, [1], [0], 256, symmetric=False, normed=True)
        result[i,j] = greycoprops(glcm, 'contrast')[0, 0]

動作しますが、2 つの for ループは非常に高価です。速度を上げたいので、Web を見回して、as_strideトリックを使用しようとしました。

from numpy.lib.stride_tricks import as_strided

image = np.arange(36).reshape((6,6))

window = 5

y = as_strided(image,shape=(image.shape[0] - window + 1,\
                            image.shape[1] - window + 1,) +\
               (window,window),  strides=image.strides * 2)

たとえば、最初のウィンドウの GLCM を計算するには:

glcm = greycoprops(greycomatrix(y[0,0], [1], [0], 256, symmetric=False, normed=True))[0][0]

すべてのスライディング ウィンドウを次のように適用しようとしました。

glcm[:,:] = greycoprops(greycomatrix(y[:,:], [1], [0], 256, symmetric=False, normed=True))[0][0]

しかし、この場合、 にはas butなどy[:,:]はありません。( greycomatrix関数で必要とされる)を維持しながら、すべてのサブセットをスマートに反復処理する方法が見つかりません。ndim==2y[0,0]ndim==4ndim == 2

編集

私はravelを使用して1Dベクトルで作業しようとしたので、forループは1つだけです。これはコードです:

a = y.ravel()
print a.shape
glcm=np.zeros(a.shape[0]/(window*window))
for i in np.arange(a.shape[0]/(window*window)):
    glcm[i] = greycoprops(greycomatrix(a[i*25:i*25+25].reshape(5,5), [1], [0], 256, symmetric=False, normed=True))[0][0]

result= glcm.reshape(y.shape[0],y.shape[1])

処理時間が増える…

4

2 に答える 2

1

あなたは実際に質問するのを忘れたので、私はそれがあったと仮定します

これを高速に実行するにはどうすればよいですか?

さて、この場合の厳しい真実は、Python が得ようとしているのと同じくらいfor、多くのスライスで Python ループを実行することは、個々のピクセル操作と比較して常に比較的高価になるということです。

したがって、ここで速度が問題になる場合は、Python バインディングを取得できる言語 (例: C with cpython) で何らかの関数を実装し、その関数を使用する必要があります。

于 2015-01-16T13:36:40.647 に答える