Skip to content

Criando um banco de dados de imagens

    Resultado da consulta

    Olá, pessoal!

    Bem-vindos a mais um tutorial prático sobre processamento de imagens. Hoje, vamos explorar a criação de um sistema de busca de imagens através da técnica chamada “fingerprinting”. Com essa abordagem, é possível identificar imagens semelhantes ou quase idênticas usando seus “hashes”, o que simplifica a detecção de duplicatas em conjuntos amplos de imagens.

    Passo 1: Fingerprinting de um Conjunto de Dados de Imagens

    Para começar, é fundamental criar um banco de dados de “hashes” que representarão as imagens. Em seguida, iniciaremos a geração dos “hashes” para cada imagem no conjunto de dados e os armazenaremos no banco de dados:

    # Importe as bibliotecas necessárias
    from PIL import Image
    import imagehash
    import shelve
    import glob
    
    # Defina os valores dos argumentos
    args = {"dataset": "D:/Blog_Acadian/Imagens_Posts/Old", "shelve": "banco_de_dados.shelve"}
    
    # Abra o banco de dados shelve e limpe-o
    db = shelve.open(args["shelve"], writeback=True)
    db.clear()
    
    # Percorra o conjunto de imagens
    for imagePath in glob.glob(args["dataset"] + "/*.png"):
        # Carregue a imagem e calcule o "hash" de diferença
        image = Image.open(imagePath)
        h = str(imagehash.dhash(image))
    
        # Extraia o nome do arquivo do caminho e atualize o banco de dados
        filename = imagePath[imagePath.rfind("/") + 1:]
        db[h] = db.get(h, []) + [filename]
    
    # Feche o banco de dados shelve
    db.close()

    Passo 2: Busca em um Conjunto de Dados

    Agora que temos os “hashes” das imagens em nosso banco de dados, podemos buscar por imagens semelhantes. Vamos criar outro código e iniciar a busca.

    No exemplo vou buscar esta imagem:

    # Importe as bibliotecas necessárias
    from PIL import Image
    import imagehash
    import shelve
    import argparse
    
    # Defina os valores dos argumentos
    args = {
        "dataset": "D:/Blog_Acadian/Imagens_Posts",
        "shelve": "banco_de_dados.shelve",
        "query": "D:/Blog_Acadian/Imagens_Posts/Educativos/filtro6.PNG"
    }
    
    # Abra o banco de dados shelve
    db = shelve.open(args["shelve"])
    
    # Carregue a imagem de consulta, calcule o "hash" e encontre imagens semelhantes
    query = Image.open(args["query"])
    h = str(imagehash.dhash(query))
    filenames = db.get(h, [])
    print("Encontradas %d imagens semelhantes" % (len(filenames)))
    
    # Percorra as imagens encontradas
    for filename in filenames:
        # Substitua as barras invertidas pelo caractere de barra normal
        filename = filename.replace("\\", "/")
        image = Image.open(args["dataset"] + "/" + filename)
        image.show()
    
    # Feche o banco de dados shelve
    db.close()
    

    E assim concluímos!

    Com a execução destes passos, você tem agora a capacidade de desenvolver um sistema altamente eficaz para a busca de imagens similares em conjuntos de dados. É crucial relembrar que o “fingerprinting” de imagens emerge como uma técnica de grande potencial, extensível a várias esferas, como a identificação de duplicatas, a busca visual e muito mais.

    Minha expectativa é que este tutorial tenha se demonstrado esclarecedor, guiando-o no entendimento da criação de um sistema de busca de imagens através do método “fingerprinting”. Obrigado e até o próximo encontro!

    Outras Referências

    Link para a documentação do objeto shelve: https://docs.python.org/3/library/shelve.html

    Leave a Reply

    Your email address will not be published. Required fields are marked *