Recentemente baixei um pacotão de fotos (~11.000) de fontes diversas, para deixar rodando no widget "Picture Frame", do KDE. Para que todas as fotos tivessem a mesma chance de aparecer, eu quis localizar e remover as imagens repetidas.
Procurando um pouco no VOL, recomendaram o
fdupes. Scriptzinho interessante, mas ele analisa (AFAIK) pelo tamanho e MD5. Mas no caso de uma imagem, é algo mais complexo, não pode resumir-se ao nome, tamanho, ou md5; afinal, você pode ter a mesma imagem diversas vezes, variando a qualidade, tamanho, resolução etc.
Procurando mais um pouco, encontrei o
GQview (ou Geeqie). Bom programa (bem leve!). Totalmente GUI, tem uma funcionalidade que lhe permite encontrar imagens duplicadas, acessado pelo menu "Arquivo > Procurar por Duplicatas", e em modo de comparação, selecione "Similaridade". Para instalá-lo no Debian GNU/Linux, simplesmente use:
sudo apt-get install gqview
Bom programa, faz o que deve ser feito, apresenta um "relatório" completo das imagens em um grid, com dimensão, tamanho, miniatura etc.
Em matéria de desempenho, levou aproximadamente 20 minutos para comparar as 11.000 imagens (em um laptop AMD AthlonX2 1.9 / 2GB RAM). Mas achei um pouquinho ruim de usar... Esse negócio de navegar até a pasta, selecionar os arquivos, clicar-e-arrastar os arquivos para comparação... não me agradou (Ssu chato pra caramba com isso :P).
Além disso, não encontrei uma maneira de salvar os resultados da procura por imagens. Isso é ruim! Tem que remover uma por uma, "na unha"!
Procurando agora no apt-cache, encontrei o
findimagedupes. Ele não tem front-end, precisa ser acessado via linha de comando. É um script em Perl que cria "fingerprints" das imagens usando ImageMagick. Então, faz uma procura baseado nesses fingerprints.
IMHO, findimagedupes é um bom exemplo de programa para Unix: você chama ele, ele fica processado... quieto... sem dar alertas, mensagens, ou medidores de progresso. Só dá alertas caso ocorram erros.
Para instalá-lo no Debian, também é bem simples:
sudo apt-get install findimagedupes
E para utilizá-lo:
findimagedupes /home/você/path/das/imagens
A questão do desempenho, ele pecou um pouco... Fez o mesmo trabalho em quase meia hora. Mas os resultados foram muito melhores! Muito mais precisos e eficientes que o GQview. Ele não apresenta um relatório completo como o GQview. Ao invés disso, ele joga no terminal o nome das duas imagens similares, uma ao lado da outra. Isso é ótimo, pois possibilita redirecionar a saída do termina para um txt e excluir as imagens repetidas com um simples scriptzinho.
Página do criador do script:
Obrigado por compartilhar, é realmente uma ótima ferramenta.
Se você tem uma base muito grande de imagens, é interessante gerar um arquivo de fingerprint, caso queira comparar apenas uma nova imagem com uma coleção já existente
Para gerar um fingerprint de maneira recursiva para posterior comparação:
findimagedupes -f=/home/voce/colecao.txt -n -R *
Se deseja saber se um arquivo qualquer já está em sua coleção:
findimagedupes -a -f=/home/voce/colecao.txt /tmp/qualquer.jpg
Para ver todos os duplicados em sua coleção
findimagedupes -f=/home/voce/colecao.txt
Se deseja filtrar alguns tipos de arquivo para não serem analisados
find -type f \( -iname "*" ! -iname "*.ini" ! -iname "thumb_*" ! -iname "normal_*" ! -iname "*.html" \) -print0 | findimagedupes -f=/home/voce/colecao.txt -n -0 -- -
Existe também uma biblioteca chamada pHash, eficiente até mesmo para comparação de recortes, parece ser a melhor ferramenta
http://www.phash.org/.
Uma boa comparação de ferramentas e algoritmos semelhantes pode ser encontrada em
http://hackerlabs.org/blog/2012/07/30/organizing-photos-with-duplicate-and-similarity-checking/