Como saber se duas imagens são iguais? [fechadas]

20

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?

Aistis
fonte
Formatos com compactação com perdas levarão a imagens que não são 100% idênticas às versões sem perdas. Você deve ter um utilitário de linha de comando ou executar um programa de GUI que faça sugestões e depois mostre as imagens com, digamos,> 90% de pixels semelhantes (calcule um desvio médio)? (e, claro, tamanho do pixel deve ser idêntica em qualquer formato)
Thorsten Müller
1
Quantos teriam o mesmo nome de arquivo, mas extensão diferente?
JeffO 14/07
4
Resposta útil que não requer semanas de codificação: stackoverflow.com/questions/596262/...
mac

Respostas:

17

Os hashes perceptivos podem ser a resposta:

http://www.phash.org/

Um hash perceptivo é uma impressão digital de um arquivo multimídia derivado de vários recursos de seu conteúdo. Diferentemente das funções de hash criptográfico, que dependem do efeito avalanche de pequenas alterações na entrada, levando a mudanças drásticas na saída, os hashes perceptivos estão "próximos" um do outro, se os recursos forem semelhantes.

Joe
fonte
9
  1. Verifique as dimensões. Se diferentes => imagens não forem iguais.
  2. Verifique os formatos. Se o mesmo => Faça uma comparação precisa, pixel por pixel.
  3. Se diferentes formatos fizerem isso:

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.

Boris Yankov
fonte
6

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.

Loren Pechtel
fonte
1
Normalmente, o YUV é melhor que o RGB, menos sensível a pequenas alterações no equilíbrio de cores.
Martin Beckett
Essa técnica de miniaturas para pré-selecionar possíveis correspondências é válida, o YUV é um toque agradável e vi que ele se transformou em um mapa de luminância pura pelas mesmas razões.
Patrick Hughes
@Martin Beckett: A soma dos quadrados da diferença de RGB foi a primeira coisa que tentei e funcionou bem o suficiente para não tentar melhorá-la - e por isso estava enganando a edição. Com uma definição estrita de dupe, era bom o suficiente para permitir a exclusão automática.
Loren Pechtel
@ Loren, se fossem pequenas edições de pixel da mesma imagem que deveriam funcionar. É que coisas como jpeg bagunçam mais o RGB do que um espaço de cores YUV. Apenas uma dica ;-) #
Martin Beckett
Por natureza, imagens muito sombrias tendem a ter menor soma de quadrados de diferenças, mesmo que não sejam nada semelhantes. O limite pode ser ajustado com a luminosidade média da imagem. Uso essa luminosidade média como pré-filtro para evitar comparações de imagens O (n ^ 2), por isso já está lá.
Gabriel
1

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.

Onno
fonte