Pergunta

Nós temos uma coleção de imagens fotográficas dimensionamento algumas centenas de shows. Um grande número das fotos são visualmente duplicatas, mas com filesizes diferentes, resolução, compressão etc.

É possível usar qualquer imagem específica métodos de processamento para procurar e remover essas imagens duplicadas?

Foi útil?

Solução

Recentemente queria realizar esta tarefa para uma galeria de imagens PHP. Eu queria ser capaz de gerar uma impressão digital "difusa" para uma imagem enviada, e verificar um banco de dados para todas as imagens que tiveram a mesma impressão digital, indicando que eles eram semelhantes, e depois compará-los mais de perto para determinar como similar.

Eu realizei-o redimensionamento da imagem enviada para 150 pixels de largura, reduzindo-à escala de cinzentos, arredondando o valor de cada cor off para o próximo múltiplo de 16 (dando 17 possíveis tons de cinza entre 0 e 255), normalizá-los e armazená-los em uma matriz, criando assim um "fuzzy" histograma de cores, em seguida, criar um md5sum do histograma que eu poderia, então, procurar no meu banco de dados. Este foi extremamente eficaz no estreitamento imagens que eram visualmente muito semelhante ao arquivo enviado.

Em seguida, para comparar o arquivo carregado contra cada imagem "similar" no banco de dados, eu levei as duas imagens, redimensionado-los para 16x16, e analisou-los pixel por pixel e tomou o valor RGB de cada pixel longe do valor do correspondente pixel na outra imagem, adicionando todos os valores juntos e dividindo pelo número de pixels dando-me um desvio médio de cor. Nada menos do que valor específico foi determinado como sendo uma duplicata.

A coisa toda é escrito em PHP usando o módulo GD, e uma comparação contra milhares de imagens leva apenas algumas centenas de milissegundos por arquivo enviado.

Meu código, ea metodologia está aqui: http://www.catpa.ws / php-duplicado-image-finder /

Outras dicas

Tente PerceptualDiff para comparar 2 imagens com as mesmas dimensões. Permite threshholds como considerar imagens, com apenas um número X de pixels diferentes para ser visualmente indistinguíveis.

Se duplicatas visuais podem ter diferentes dimensões, devido à escala, ou diferentes tipos de arquivos, você pode querer fazer um formato padrão para comparações. Por exemplo, eu poderia usar ImageMagick para dimensionar todas as imagens para 100x100 e salvá-los como arquivos PNG.

Uma abordagem muito simples é o seguinte:

  • Converter a imagem para tons de cinza na memória, de modo que cada pixel é apenas um número entre 0 (preto) e 255 (branco).

  • dimensionar a imagem para um tamanho fixo. Encontrar o tamanho certo é importante, você deve brincar com tamanhos diferentes. Por exemplo. você poderia dimensionar cada imagem para 64x64 pixels, mas você pode obter melhores ou piores resultados tanto com imagens menores ou maiores.

  • Uma vez que você tenha feito isso para todas as imagens (sim, isso vai demorar um pouco), carregar sempre duas imagens na memória e subtrair-los um do outro. Isso é subtrair o valor de pixel (0,0) em uma ob o valor de pixel (0,0) na imagem B, agora fazer o mesmo para (0,1) em ambos e assim por diante. O valor resultante pode ser positivo ou negativo, você deve sempre guardar o valor absoluto (assim 5 resultados em 5, -8 no entanto resulta em 8).

  • Agora você tem uma terceira imagem ser a "imagem diferença" (imagem delta) da imagem A e B. Se eles eram idênticos, a imagem delta é todo preto (todos os valores irá subtrair a zero). O "menos negro" é, os menos idênticas as imagens são. Você precisa encontrar um limite bom, uma vez que mesmo se as imagens são de facto idênticas (para os olhos), pela escala, alterando o brilho e assim por diante, a imagem delta não será totalmente preto, ele vai, porém, têm greytones só é muito escuras. Então você precisa de um limiar que diz: "Se o erro médio (delta imagem brilho) está abaixo de um determinado valor, ainda há uma boa chance de que eles possam ser idênticos, porém se estiver acima desse valor, eles são muito provavelmente não. Encontrando-se o direito limiar é tão difícil como encontrar o tamanho de escala direita. Você sempre terá falsos positivos (imagens considerados idênticos, embora eles não são de todo) e falsos negativos (imagens consideradas não idênticos, embora eles são).

Este algoritmo é ultra lenta. Na verdade, apenas criando as imagens em tons de cinza leva toneladas de tempo. Em seguida, você precisa comparar cada imagem GS para o outro um, novamente, toneladas de tempo. armazenar também todas as imagens GS tem um monte de espaço em disco. Portanto, este algoritmo é muito ruim, mas os resultados não são tão ruins, mesmo que a sua simples. Embora os resultados não são surpreendentes, eles são melhores do que eu tinha pensado inicialmente.

A única maneira de obter resultados ainda melhores é usar processamento de imagem avançado e aqui começa a ficar realmente complicado. Trata-se de um monte de matemática (muito real dele); existem boas aplicações (Finders dupe) para muitos sistemas que tenham estes implementadas, a menos que você deve programar-lo sozinho, você é provavelmente melhor fora de usar uma dessas soluções. Eu li um monte artigos sobre este tema, mas eu tenho medo a maior parte deste vai além de meu horizonte. Mesmo os algoritmos que eu poderia ser capaz de implementar de acordo com estes documentos estão além dela; Isso significa que eu entender o que precisa ser feito, mas não tenho idéia por que ela funciona ou como ele realmente funciona, é apenas a magia; -)

Na verdade, eu escrevi um aplicativo que faz isso mesmo.

Eu comecei com um pedido anterior que usou um algoritmo Levenshtein Distância para semelhança de imagem de computação, mas este método é indesejável por uma série de razões. Sem dúvida, o algoritmo mais rápido que você vai encontrar para determinar similaridade imagem é ou erro quadrático média absoluta erro (ambos têm uma duração de o (n), onde n é o número de pixels na imagem, e também seria trivial para enfiar uma implementação de qualquer algoritmo em uma série de maneiras diferentes). O post de Mecki é realmente apenas uma implementação Erro Médio Absoluto, que meu aplicativo pode executar (código também está disponível para o seu prazer de navegação, se assim o desejar).

Em qualquer caso, em nossa aplicação, nós first down-sample imagens (por exemplo, tudo é dimensionado para, digamos, 32 * 32 pixels), em seguida, converter em escala de cinza, e depois executar as imagens resultantes através de nossos algoritmos de comparação. Também estamos trabalhando em alguns algoritmos mais avançados de pré-processamento para mais imagens normalizar, mas ... não completamente lá ainda.

Há definitivamente melhores algoritmos que MSE / MAE (na verdade, os problemas com esses dois algoritmos aplicados às informações visuais tem sido bem documentado), como SSIM , mas ele vem com um custo. Outras pessoas tentam comparar outras qualidades visuais da imagem, tais como a luminosidade, contraste, histogramas de cor, etc., mas é tudo caro em comparação com simplesmente medir o sinal de erro.

Meu aplicativo força trabalho, dependendo quantas imagens são nessas pastas. É multi-threaded (eu vi isso carregar totalmente oito núcleos de processador que executam comparações), mas eu nunca tinha testado contra um banco de dados de imagem maior do que algumas centenas de imagens. A poucas centenas de shows de imagens soa proibitivamente grande. (Simplesmente lê-los a partir do disco, downsampling, converter para escala de cinza e armazenar na memória - supondo que você tem memória suficiente para tudo espera, que você provavelmente não - pode levar um par de horas).

Esta ainda é uma área de pesquisa, eu acredito. Se você tem algum tempo em suas mãos, algumas palavras-chave relevantes são:

  • cópia Imagem detecção
  • imagem baseada em conteúdo de recuperação
  • indexação Imagem
  • Imagem remoção duplicado

Basicamente, cada imagem é processada (indexado) para produzir uma "assinatura de imagem". Imagens similares têm assinaturas semelhantes. Se as imagens são apenas redimensionada então, provavelmente, a sua assinatura são quase idênticas, então eles agrupar bem. Algumas assinaturas populares são os MPEG-7 descritores. Para cluster, eu acho K-Means ou qualquer de suas variantes podem ser o suficiente. No entanto, você provavelmente terá que lidar com milhões de imagens, este pode ser um problema.

Aqui está um link para a entrada principal da Wikipédia:
http://en.wikipedia.org/wiki/CBIR

Espero que isso ajude.

semelhança de imagem é provavelmente uma sub-área de processamento de imagem / AI.

Esteja preparado para implementar algoritmos / fórmulas de papéis, se você está procurando uma excelente solução (ou seja, performance e escalável).

Se você quer algo rápido n sujo, pesquisa no Google para imagem Similaridade

Aqui está um aplicativo de imagem semelhança C # que pode fazer o que você quer.

Basicamente, todos os algoritmos de extrair e comparar as características. Como eles definem "recurso" depende do modelo matemático que está baseado.

Um hack rápido para isso é escrever um programa que irá calcular o valor do pixel média em cada imagem, em tons de cinza, ordenar por este valor, e depois compará-los visualmente. imagens semelhantes Muito deve ocorrer perto uns dos outros na ordem de classificação.

Você vai precisar de uma ferramenta de linha de comando para lidar com tantos dados.

Comparando cada par possível de imagens não será ampliado para um grande conjunto de imagens, tais. Você precisa classificar todo o conjunto de imagens de acordo com alguns tão métrica que ainda comparações só são necessários em imagens vizinhos.

Um exemplo de uma métrica simples é o valor médio de todos os pixels de uma imagem, expresso como um único valor de escala de cinzentos. Isso deve funcionar somente se as duplicatas não tive quaisquer alterações visuais. Usando um formato de arquivo com perdas também pode resultar em alterações visuais.

Pensar fora da caixa, você pode ser capaz de usar metadados de imagem para afinar a sua dataset. Por exemplo, as imagens podem ter campos que mostram a data e hora a imagem foi tirada, para o segundo mais próximo. Duplicatas são susceptíveis de ter valores idênticos. Uma ferramenta como exiv2 poderia ser usado para despejar esses dados para um formato de texto mais conveniente e classificáveis ??(com um pouco de conhecimento de batch / shell script).

Mesmo campos tais como o fabricante e modelo da câmera poderia ser usada para reduzir um conjunto de 1.000.000 de imagens para dizer 100 conjuntos de 10.000 imagens, uma melhoria significativa.

O programa GQview tem uma opção para encontrar duplicatas, de modo que você pode tentar olhar lá. No entanto, não é infalível, por isso só seria adequado como uma heurística para duplicatas presentes a um ser humano, para confirmação manual.

A parte mais importante é fazer com que os arquivos comparáveis.

A solução genérica poderia ser a de escalar todas as imagens para um determinado tamanho fixo e escala de cinzentos. Em seguida, salve as imagens resultantes em um diretório separado com mesmo nome para consulta posterior. Seria, então, possível classificar por tamanho do arquivo e comparar visualmente entradas vizinhos.

As imagens resultantes podem ser quantificadas em certas formas de detectar programaticamente semelhanças (média de blocos, linhas, etc.).

Eu imagino o método mais escalonável seria armazenar uma impressão digital com cada imagem. Então, quando uma nova imagem é adicionada, é um simples caso de SELECT id FROM photos where id='uploaded_image_id' para verificar se há duplicatas (ou impressões digitais de todas as imagens, em seguida, fazer uma consulta para duplicado

Obviamente, um simples arquivo de hash não iria funcionar como os difere de conteúdo reais ..

Acústico fingerprinting / neste artigo pode ser um bom começo no conceito, pois há muitas implementações deste. Aqui é um papel em impressões digitais de imagem.

Dito isso, você pode ser capaz de fugir com algo mais simples. Algo tão básico como o redimensionamento da imagem a mesma largura ou a altura, subtraindo image_a de image_b, e soma da diferença. Se a diferença total é abaixo de um limiar, a imagem é uma duplicata.

O problema com isso é que você precisa para comparar cada imagem a todos os outros. O tempo necessário irá aumentar exponencialmente ..

Se você puder vir acima com uma maneira de comparar imagens que obedece à desigualdade triangular (por exemplo, se d (a, b) é a diferença entre as imagens a e b, então D (a, b) BK- árvore seria uma forma eficaz de indexar as imagens de tal forma que você pode encontrar correspondências em o (log n) em vez de o (n) para cada imagem.

Se os seus jogos são restritas à mesma imagem depois de quantidades variáveis ??de compressão / redimensionar / etc, em seguida, converter para algum equilíbrio tamanho canônica / cor / etc e simplesmente somando as diferenças praças de-de cada pixel pode ser uma boa métrica e este obedece à desigualdade do triângulo, então você poderia usar um BK-árvore por um acesso eficiente.

Se você tem um pouco de dinheiro para gastar, e talvez uma vez que você executar um primeiro passo para determinar quais as imagens são talvez jogos, você poderia escrever um teste para Mechanical Turk da Amazon.

https://www.mturk.com/mturk/welcome

Essencialmente, você estaria criando um pequeno widget que AMT iria mostrar aos usuários humanos reais, que seria, então, basicamente, apenas tem que responder à pergunta "são estas duas imagens o mesmo?". Ou você pode mostrar-lhes uma grade de imagens 5x5 dizer e pedir-lhes "Qual dessas imagens correspondem?". Você iria em seguida, coletar os dados.

Outra abordagem seria usar os princípios da computação humana que foram mais famosa defendidos por Luis Von Ahn ( http://www.cs.cmu.edu/~biglou/ ) com reCaptcha, que usa respostas cAPTCHA para determinar as palavras ilegíveis que foram executados através de reconhecimento óptico de caracteres, ajudando a digitalizar livros. Você poderia fazer um captcha que pediu aos usuários para ajudar a refinar as imagens.

Parece ser um problema processual em vez de um problema de programação. Que envie as fotos? Você ou os clientes? Se você estiver carregando a foto, padronizar as dimensões para um formato de escala e de arquivo fixo. Dessa forma, as comparações será mais fácil. No entanto, tal como está, a menos que você tem dias - ou mesmo semanas de tempo livre - Eu sugiro que você em vez remover manualmente as duplicatas imagens por você mesmo ou sua equipe, comparando visualmente as imagens

.

Talvez você deve agrupar as imagens por localização, pois é um imagens turísticas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top