Preciso de uma maneira simples e rápida de comparar duas imagens por similaridade. Ou seja, eu quero obter um valor alto se eles contêm exatamente a mesma coisa, mas podem ter um fundo ligeiramente diferente e podem ser movidos / redimensionados por alguns pixels.
(Mais concreto, se isso importa: a imagem é um ícone e a outra é uma subárea de uma captura de tela e eu quero saber se essa subárea é exatamente o ícone ou não.)
Eu tenho o OpenCV em mãos, mas ainda não estou acostumado.
Uma possibilidade que pensei até agora: divida as duas imagens em células 10x10 e, para cada uma dessas 100 células, compare o histograma de cores. Então eu posso definir algum valor de limite inventado e, se o valor que obtiver estiver acima desse limite, presumo que eles sejam semelhantes.
Ainda não tentei o quão bem isso funciona, mas acho que seria bom o suficiente. As imagens já são bastante semelhantes (no meu caso de uso), para que eu possa usar um valor limite bastante alto.
Eu acho que existem dezenas de outras soluções possíveis para isso, que funcionariam mais ou menos (como a tarefa em si é bastante simples, pois eu só quero detectar semelhanças se elas forem realmente muito parecidas). O que você sugeriria?
Existem algumas perguntas muito relacionadas / similares sobre como obter uma assinatura / impressão digital / hash de uma imagem:
- OpenCV / SURF Como gerar uma hash / impressão digital / assinatura de imagem a partir dos descritores?
- Impressão digital da imagem para comparar a semelhança de muitas imagens
- Detecção de imagem quase duplicada
- OpenCV: Imagem de impressão digital e comparação com o banco de dados .
- mais , mais , mais , mais , mais , mais , mais
Além disso, deparei-me com essas implementações que têm essas funções para obter uma impressão digital:
- pHash
- imgSeek ( GitHub repo ) (GPL) com base no documento Consulta rápida de imagens com várias soluções
- correspondência de imagem . Muito parecido com o que eu estava procurando. Semelhante ao pHash, baseado em Uma assinatura de imagem para qualquer tipo de imagem, Goldberg et al . Usa Python e Elasticsearch.
- iqdb
- ImageHash . suporta pHash.
- Desduplicador de imagem (com imagem) . Suporta CNN, PHash, DHash, WHash, AHash.
Algumas discussões sobre hashes de imagem perceptivos: aqui
Um pouco offtopic: existem muitos métodos para criar impressões digitais de áudio. O MusicBrainz , um serviço da web que fornece pesquisa de músicas com base em impressões digitais, tem uma boa visão geral em seu wiki . Eles estão usando o AcoustID agora. Isso é para encontrar correspondências exatas (ou na maioria exatas). Para encontrar correspondências semelhantes (ou se você tiver apenas alguns trechos ou ruído alto), dê uma olhada no Echoprint . Uma questão SO relacionada está aqui . Parece que isso foi resolvido para o áudio. Todas essas soluções funcionam muito bem.
Uma pergunta um pouco mais genérica sobre a busca difusa em geral está aqui . Por exemplo, existe um hash sensível à localidade e a pesquisa de vizinhos mais próxima .