スライディング ウィンドウを使用して、画像に対して何らかの操作 (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==2
y[0,0]
ndim==4
ndim == 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])
処理時間が増える…