localize imagens que contenham fragmento dado

0

No meu disco rígido local, eu tenho um diretório com milhares de imagens. Eu tenho uma imagem pequena (por exemplo, 200x100 px). Eu tenho que encontrar todas as imagens que contenham esse fragmento. Como posso fazer isso? Ferramentas sugeridas em perguntas semelhantes - por exemplo, em Pesquisa de imagens locais contra uma imagem de origem? - não funcionam no meu caso, porque (tanto quanto eu entendo) eles procuram imagens inteiras semelhantes, enquanto eu quero encontrar imagens contendo fragmento dado.

    
por user983447 26.07.2017 / 06:27

1 resposta

1

Como ainda não há respostas, fornecerei uma solução possível (observe, no entanto, que isso é computacionalmente caro).

Você pode instalar o OpenCV e compilar um programa para realizar essa tarefa.

Para mais detalhes, consulte o link

O código relevante está abaixo:

def find_image(im, tpl):
    im = np.atleast_3d(im)
    tpl = np.atleast_3d(tpl)
    H, W, D = im.shape[:3]
    h, w = tpl.shape[:2]

    # Integral image and template sum per channel
    sat = im.cumsum(1).cumsum(0)
    tplsum = np.array([tpl[:, :, i].sum() for i in range(D)])

    # Calculate lookup table for all the possible windows
    iA, iB, iC, iD = sat[:-h, :-w], sat[:-h, w:], sat[h:, :-w], sat[h:, w:] 
    lookup = iD - iB - iC + iA
    # Possible matches
    possible_match = np.where(np.logical_and(*[lookup[..., i] == tplsum[i] for i in range(D)]))

    # Find exact match
    for y, x in zip(*possible_match):
        if np.all(im[y+1:y+h+1, x+1:x+w+1] == tpl):
            return (y+1, x+1)

    raise Exception("Image not found")

e

>>> from skimage import data
>>> im = gray2rgb(data.coins())
>>> tpl = im[170:220, 75:130].copy()

>>> fig, ax = plt.subplots()
>>> imshow(im)
>>> rect = Rectangle((x, y), tpl.shape[1], tpl.shape[0], edgecolor='r', facecolor='none')
>>> ax.add_patch(rect)
    
por 26.07.2017 / 19:19

Tags