【问题标题】:Reduce running time in Texture analysis using GLCM [Python]使用 GLCM [Python] 减少纹理分析的运行时间
【发布时间】:2016-12-21 17:04:15
【问题描述】:

我正在处理 6641x2720 图像以使用移动的 GLCM(灰度共现矩阵)窗口生成其特征图像(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 位 [0-16],而不是使用所有 256 个灰度值。查看scikit-image.org/docs/dev/api/…中的选项级别。
  • 减少 bin 的数量不会改变计算时间。
  • greycomatrix 在其实现中有 4 个嵌套的 for 循环,这意味着这段代码可能有大约 O(n**6) 的执行时间。我不确定是否可以在不重写 greycomatrixgreycoprops 函数的情况下减少此特定函数。

标签: python image-processing scikit-image glcm


【解决方案1】:

填充 GLCM 是一种线性操作:您只需遍历图像/窗口上的所有像素,然后填充匹配的矩阵情况。您的问题是您对每个像素执行操作,而不仅仅是图像。所以在你的情况下,如果图像尺寸是 Width x Height 并且窗口尺寸是 NxN,那么总复杂度是 Width x Height x (NxN + FeaturesComplexity),这真的很糟糕。

有一个更快的解决方案,但实施起来更棘手。目标是减少矩阵填充操作。这个想法是使用前向前端和后向前端逐行工作(原理已经用于获得快速的数学形态学运算符,请参阅herehere)。当你为连续两个像素填充矩阵时,你复用了大部分像素,实际上只有左右不同,所以分别是后前和前前。

这是一个尺寸为 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)。这大大减少了计算时间(数学形态学运算的线性而不是二次)。这是算法:

  1. 对于每一行:
  2. ----- 为行中的第一个像素填充矩阵(通常),然后计算特征
  3. ----- 对于以下每个像素
  4. ----- ----- 添加前面(窗口中的新像素)
  5. ----- ----- 移除后前(像素不再在窗口中)
  6. ----- ----- 计算特征

【讨论】:

    猜你喜欢
    • 2020-06-13
    • 2016-10-14
    • 1970-01-01
    • 2016-06-03
    • 2019-10-07
    • 1970-01-01
    • 2016-06-30
    • 2012-05-23
    • 2018-10-11
    相关资源
    最近更新 更多