maneira mais rápida de patchify uma imagem de blocos sobrepostos

votos
0

Estou à procura de um jejum (e se possível afficiant memória) maneira de reescrever uma função que eu crerated como parte do Visual saco do algoritmo palavras:

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

é preciso uma imagem em tons de cinza (NÃO RGB!), comprimento de patch desejado e valor stride, e dá de volta todos os patches como uma lista de matriz numpy .

Em outras qestions, eu encontrei este:

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)

a fim de obter para retornar uma lista, eu usei-o assim:

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 

mas este foi realmente muito mais lento do que a minha função original! Outro problema é que só funciona com o passo = 1, e eu quero ser capaz de usar todos os tipos de valores tranco.

Publicado 08/11/2018 em 06:33
fonte usuário
Em outras línguas...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more