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