Сократите время выполнения анализа текстур с помощью GLCM [Python]

Я работаю над изображением 6641x2720, чтобы создать его характерные изображения (функции Haralick, такие как контраст, второй момент и т. Д.), Используя движущееся окно GLCM (матрица совпадения уровней серого). Но чтобы бежать, нужна вечность. Код работает нормально, так как я тестировал его на изображениях меньшего размера. Но мне нужно заставить его работать быстрее. При уменьшении размеров до 25% (1661 x 680) запуск занимает 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)

person Abhi    schedule 15.08.2016    source источник
comment
Может быть, вам стоит попробовать разделить ваши данные на 4 бита [0-16] и не использовать все 256 значений серого. Посмотрите на уровни параметров в scikit-image. org / docs / dev / api /.   -  person Amitay Nachmani    schedule 15.08.2016
comment
Уменьшение количества бинов не меняет времени вычислений.   -  person FiReTiTi    schedule 15.08.2016
comment
greycomatrix имеет 4 вложенных for цикла в своей реализации, что означает, что этот код, вероятно, имеет время выполнения приблизительно O (n ** 6). Я не уверен, можно ли сократить эту конкретную функцию, не переписывая функции greycomatrix и greycoprops.   -  person callyalater    schedule 15.08.2016


Ответы (1)


Заполнение GLCM - это линейная операция: вы просто просматриваете все пиксели на вашем изображении / окне и заполняете соответствующий регистр матрицы. Ваша проблема в том, что вы выполняете операцию для каждого пикселя, а не только для изображения. Итак, в вашем случае, если размеры изображения - Ширина x Высота, а размеры окна - NxN, тогда общая сложность составляет Ширина x Высота x (NxN + FeaturesComplexity), что действительно плохо.

Есть гораздо более быстрое решение, но его сложнее реализовать. Цель состоит в том, чтобы уменьшить количество операций по заполнению матрицы. Идея состоит в том, чтобы работать строка за строкой с передним фронтом и задним фронтом (принцип, который уже используется для получения быстрых операторов математической морфологии, см. здесь и здесь). Когда вы заполняете матрицу двумя последовательными пикселями, вы повторно используете большую часть пикселей, на самом деле только те, которые слева и справа различаются, так что задний передний и передний передний соответственно.

Вот иллюстрация окна GLCM размером 3x3:

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. ----- ----- Вычислить характеристики
person FiReTiTi    schedule 15.08.2016