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 .
Respostas:
A captura de tela ou o ícone pode ser transformada (dimensionada, girada, inclinada ...)? Existem alguns métodos em cima da minha cabeça que podem ajudá-lo:
A maioria deles já está implementada no OpenCV - veja, por exemplo, o método cvMatchTemplate (usa correspondência de histograma): http://dasl.mem.drexel.edu/~noahKuntz/openCVTut6.html . Os detectores de ponto / área salientes também estão disponíveis - consulte OpenCV Feature Detection .
fonte
Eu enfrento os mesmos problemas recentemente, para resolver esse problema (algoritmo simples e rápido para comparar duas imagens) de uma vez por todas, contribuo com um módulo img_hash para opencv_contrib, você pode encontrar os detalhes neste link .
O módulo img_hash fornece seis algoritmos de hash de imagem, bastante fáceis de usar.
Exemplo de códigos
origem lena
blur lena
redimensionar lena
turno lena
Nesse caso, o ColorMomentHash nos fornece o melhor resultado
Prós e contras de cada algoritmo
O desempenho de img_hash também é bom
Comparação de velocidade com a biblioteca PHash (100 imagens de ukbench)
Se você deseja conhecer os limites de recomendação para esses algoritmos, verifique esta postagem ( http://qtandopencv.blogspot.my/2016/06/introduction-to-image-hash-module-of.html ). Se você tiver interesse em saber como faço para medir o desempenho dos módulos img_hash (incluindo velocidade e ataques diferentes), verifique este link ( http://qtandopencv.blogspot.my/2016/06/speed-up-image-hashing-of -opencvimghash.html ).
fonte
A captura de tela contém apenas o ícone? Nesse caso, a distância L2 das duas imagens pode ser suficiente. Se a distância L2 não funcionar, o próximo passo é tentar algo simples e bem estabelecido, como: Lucas-Kanade . O que tenho certeza está disponível no OpenCV.
fonte
Se você deseja obter um índice sobre a semelhança das duas imagens, sugiro a partir das métricas o índice SSIM. É mais consistente com o olho humano. Aqui está um artigo sobre isso: Índice de Similaridade Estrutural
Também é implementado no OpenCV e pode ser acelerado com a GPU: OpenCV SSIM with GPU
fonte
Se você tiver certeza de ter um alinhamento preciso do seu modelo (o ícone) com a região de teste, qualquer soma antiga de diferenças de pixel funcionará.
Se o alinhamento for apenas um pouquinho menor, você poderá passar ambas as imagens com cv :: GaussianBlur antes de encontrar a soma das diferenças de pixel.
Se a qualidade do alinhamento for potencialmente ruim, eu recomendaria um histograma de gradientes orientados ou um dos convenientes algoritmos de detecção / descritor de ponto-chave do OpenCV (como SIFT ou SURF ).
fonte
Se para combinar imagens idênticas - codifique a distância L2
Rápido. Mas não robusta para alterações na iluminação / ponto de vista etc. Fonte
fonte
Se você deseja comparar imagens por similaridade, sugiro que você use o OpenCV. No OpenCV, existem poucas características correspondentes e modelos correspondentes. Para correspondência de recursos, existem SURF, SIFT, RÁPIDO e assim por diante. Você pode usar isso para detectar, descrever e combinar a imagem. Depois disso, você pode usar o índice específico para encontrar o número de correspondências entre as duas imagens.
fonte