1

移動する GLCM(Grey level Co-occurrence matrix) ウィンドウを使用して、6641x2720 画像の特徴画像 (コントラスト、2 番目のモーメントなどの Haralick 特徴) を生成する作業を行っています。しかし、実行するには永遠に時間がかかります。小さな画像でテストしたので、コードは正常に動作します。しかし、私はそれをより速く実行する必要があります。サイズを 25% (1661x680) に縮小すると、実行に30 分かかります。より速く実行するにはどうすればよいですか? コードは次のとおりです。

from skimage.feature import greycomatrix, greycoprops
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
import time
start_time = time.time()
img = Image.open('/home/student/python/test50.jpg').convert('L')
y=np.asarray(img, dtype=np.uint8)
#plt.imshow(y, cmap = plt.get_cmap('gray'), vmin = 0, vmax = 255)
contrast = np.zeros((y.shape[0], y.shape[1]), dtype = float)

for i in range(0,y.shape[0]):
    for j in range(0,y.shape[1]):
        if i < 2 or i > (y.shape[0]-3) or j < 2 or j > (y.shape[1]-3):
            continue
        else:
            s = y[(i-2):(i+3), (j-2):(j+3)]
            glcm = greycomatrix(s, [1], [0],  symmetric = True, normed = True )
            contrast[i,j] = greycoprops(glcm, 'contrast')
print("--- %s seconds ---" % (time.time() - start_time))
plt.imshow(contrast, cmap = plt.get_cmap('gray'), vmin = 0, vmax = 255)
4

1 に答える 1

0

GLCM の塗りつぶしは線形操作です。画像/ウィンドウ上のすべてのピクセルを調べて、一致するマトリックス ケースを塗りつぶします。あなたの問題は、画像だけでなく、各ピクセルに対して操作を実行することです。したがって、あなたの場合、画像の寸法が幅 x 高さで、ウィンドウの寸法が NxN の場合、全体の複雑さは幅 x 高さ x (NxN + FeaturesComplexity) であり、これは非常に悪いことです。

はるかに高速なソリューションがありますが、実装するのは難しいです。目標は、マトリックス充填操作を減らすことです。アイデアは、Forward Front と Backward Front を使用して行ごとに作業することです (原則は、高速な数学的形態演算子を取得するために既に使用されています。ここここを参照してください)。2 つの連続するピクセルのマトリックスを埋める場合、ほとんどのピクセルを再利用します。実際には、左右のピクセルのみが異なるため、それぞれ後ろ向きと前向きになります。

以下は、寸法が 3x3 の GLCM ウィンドウの図です。

x1 x2 x3 x4

x5 p1 p2 x6

x7 x8 x9 x10

ウィンドウが p1 の中心にある場合、ピクセル x1、x2、x3、x5、p2、x7、x8、x9 を使用します。ウィンドウが p2 の中央にある場合は、ピクセル x2、x3、4、p1、x6、x8、x9、x10 を使用します。したがって、p1 には x1、x5、および x7 を使用しますが、p2 には使用しませんが、他のすべてのピクセルは同じです。

アルゴリズムの考え方は、p1 の行列を通常どおり計算することですが、p2 に移動すると、後方前方 (x1、x2、x5) を削除し、前方前方 (x4、x6、x10) を追加します。これにより、計算時間が大幅に短縮されます (数学的モルフォロジー操作では、2 次ではなく線形になります)。アルゴリズムは次のとおりです。

  1. 行ごとに:
  2. ----- 行の最初のピクセルの行列を (通常どおり) 埋めて、特徴を計算します。
  3. ----- 次の各ピクセルについて
  4. ----- ----- 前面を追加します (ウィンドウ内の新しいピクセル)
  5. ----- ----- 後方前面を削除します (ウィンドウ内にピクセルがなくなりました)
  6. ----- ----- 特徴を計算する
于 2016-08-15T17:37:18.053 に答える