Tenho mais de 10000 imagens, das quais cerca de 2000 são duplicadas em outros formatos (como JPEG, PNG, GIF). Ambos os números estão aumentando a cada dia. Preciso excluir essas duplicatas e, para isso, preciso saber como encontrá-las primeiro.
Meu primeiro pensamento foi verificar os pixels das imagens e encontrar outras imagens que tenham os mesmos pixels coloridos nas mesmas coordenadas. Mas essa opção nem sempre funciona. Digamos que eu procure uma duplicata. Quanto ao objeto pesquisável, escolho um arquivo PNG de 8 bits. Ele encontrará todas as duplicatas dessa imagem, mas apenas o PNG de 8 bits, às vezes GIF de 8 bits e raramente JPEG (por causa das imagens algorítmicas, suponho?).
Meu segundo pensamento foi duplicar todas essas imagens e recolori-las em uma paleta estrita de duas cores (digamos em preto e branco) e fazer a mesma digitalização conforme indicado acima. Mais uma vez, a imagem JPEG não é 100% semelhante ao formato PNG ou GIF (o mesmo motivo acima).
O terceiro pensamento era diminuir a porcentagem de quanto a imagem precisa ser familiar e aumentar o quanto as cores podem variar, resultando na remoção indesejada de imagens ...
Alguma ideia?
fonte
Respostas:
Os hashes perceptivos podem ser a resposta:
http://www.phash.org/
fonte
Não compare RGB (vermelho, verde, azul). Compare o brilho como metade do peso e compare a cor / matiz com a outra metade (ou 2 / 3rds vs 1/3). Calcule a diferença de valores e, dependendo do valor de 'tolerância', eles são iguais ou não.
O JPEG compacta fortemente as informações de cores, mas tenta não arruinar os valores das limitações.
fonte
Há alguns anos, quando eu estava exibindo um monte de imagens para duendes, descobri que reduzir tudo para miniaturas 8x8 e depois calcular uma pontuação de similaridade com base no quadrado da distância (tratando as três cores separadamente) entre as miniaturas funcionava muito bem. Observe que você pode armazenar MUITAS miniaturas de 8x8 na memória.
Praticamente todos os burros pontuaram abaixo dos não burros, com os únicos problemas sendo algumas imagens com muito baixo contraste e similares no geral, mesmo que o conteúdo real tenha variado (o fundo em cada caso era areia da praia).
Isso também era eficaz na captura de imagens que eram falsas, exceto que alguém havia reduzido a resolução ou a qualidade de uma para reduzir o tamanho do arquivo.
fonte
Talvez você deva escrever algum código que verifique as imagens em busca de semelhança. Você pode converter todas as fotos para o formato ARGB e compará-las. (em memória)
Uma abordagem possível poderia ser assim: divida as imagens em zonas. Digitalize a cor e / ou brilho médios das zonas para comparar duas fotos para obter semelhanças.
Se mais de 90% das zonas corresponderem, você escolheu uma para ir para a lista de candidatos a exclusão. Dessa forma, você tem uma lista de candidatos. Você pode usar a proporção das imagens para categorizar as imagens em horizontal e vertical para acelerar as comparações. Dessa forma, você pode compensar os algoritmos com perdas que não reproduzem as cores certas pixel por pixel. Você executa o programa da noite para o dia e, de manhã, faz :) :) no .Net, isso pode ser feito facilmente com o GDI + lib.
fonte