2016-08-15 51 views
1

我正在使用移動GLCM(灰度級共生矩陣)窗口來生成6641x2720圖像以生成其特徵圖像(像對比度,二次矩等Haralick功能)。但它需要永遠運行。 該代碼工作正常,因爲我已經在較小的圖像上進行了測試。但是,我需要讓它運行得更快。將尺寸縮小至25%(1661x680)需要30分鐘才能運行。我怎樣才能讓它跑得更快?下面的代碼:使用GLCM減少紋理分析中的運行時間[Python]

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) 
+0

也許你應該試試你的數據到4位[0-16],而不是使用所有的256灰度值。查看http://scikit-image.org/docs/dev/api/skimage.feature.html#skimage.feature.greycomatrix中的選項級別。 –

+0

減少垃圾箱數量不會改變計算時間。 – FiReTiTi

+0

'greycomatrix'在它的實現中有4個'for'循環,這意味着這個代碼可能有大約O(n ** 6)的執行時間。我不確定是否可以在不改寫'greycomatrix'和'greycoprops'功能的情況下減少這個特殊功能。 – callyalater

回答

0

填寫一個GLCM是線性運算:你剛纔通過你的圖像/窗口上的所有像素,並填寫匹配的矩陣情況。你的問題是你對每個像素執行操作,而不僅僅是對圖像。所以在你的情況下,如果圖像尺寸是寬x高,窗尺寸是N×N,那麼總的複雜度是寬x高x(NxN + FeaturesComplexity),這非常糟糕。

有一個更快的解決方案,但實施起來比較困難。目標是減少矩陣填充操作。這個想法是逐行工作,前向前沿和後向前沿(原理已經用於獲得快速的數學形態學算子,參見herehere)。當你爲兩個連續的像素填充矩陣時,你重用了大部分的像素,實際上只有左邊和右邊的像素是不同的,所以分別是前向前和後向前。

這裏是尺寸3×3的一GLCM窗口的圖示:

X1 X2 X3 X4

X5 P1,P2,5233

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) 。這大大減少了計算時間(線性代替數學形態學運算的二次方程)。這裏是該算法:

  1. 對於每一行:
  2. -----填充基質(如通常)用於該行中的第一像素和你計算特徵
  3. -----對於以下每個像素
  4. ----- -----添加前鋒(窗口中的新像素)
  5. ----- -----刪除後方前方(像素號更長的窗口)
  6. ----- -----計算功能