2016-08-15 102 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. ----- -----计算功能