Более быстрый способ прикрепления картинки к перекрывающимся блокам - PullRequest
0 голосов
/ 08 ноября 2018

Я ищу БЫСТРЫЙ (и, если возможно, эффективный способ памяти) переписать функцию, которую я создал как часть алгоритма Visual bag of words:

def get_pic_patches(pic, l, s):  # "s" stands for stride

    r, c = pic.shape
    i, j = [0, 0]
    x_range = list(range(0, r, s  ) )
    y_range = list(range(0, c ,  s ) )
    patches = []
    patches_location = []
    for x in x_range:  # without last two since it will exceed dimensions
        for y in y_range:  # without last two since it will exceed dimensions
            if x+ l<= r and y+l <= c:
                patch = pic[x:x +  l , y:y + l ]
                patches_location.append([x, y])  # patch location is the upper left pixel
                patches.append(  patch   )

    return patches, patches_location

требуется изображение в оттенках серого (НЕ RGB!), Желаемая длина патча и значение шага, и возвращает все патчи в виде списка массива numpy .

По другим вопросам я нашел это:

def patchify(img, patch_shape):
    img = np.ascontiguousarray(img)  # won't make a copy if not needed
    X, Y = img.shape
    x, y = patch_shape
    shape = ((X-x+1), (Y-y+1), x, y) # number of patches, patch_shape 
    strides = img.itemsize*np.array([Y, 1, Y, 1])
    return np.lib.stride_tricks.as_strided(img, shape=shape, strides=strides)

чтобы вернуть список, я использовал его так:

def patchify(img, patch_shape):
    img = np.ascontiguousarray(img)  # won't make a copy if not needed
    X, Y = img.shape
    x, y = patch_shape
    shape = ((X-x+1), (Y-y+1), x, y) # number of patches, patch_shape 
    strides = img.itemsize*np.array([Y, 1, Y, 1])
    patches = np.lib.stride_tricks.as_strided(img, shape=shape, strides=strides)
    a,b,c,d = patches.shape
    patches = patches.reshape(((a*b),c,d))
    patches = patches.tolist()
    return 

но на самом деле это было намного медленнее, чем моя первоначальная функция! Другая проблема заключается в том, что он работает только с шагом = 1, и я хочу иметь возможность использовать все виды значений шага.

...