O OpenCV suporta a comparação de duas imagens, retornando algum valor (talvez uma porcentagem) que indica o quão semelhantes essas imagens são? Por exemplo, 100% seria retornado se a mesma imagem fosse passada duas vezes, 0% seria retornado se as imagens fossem totalmente diferentes.
Eu já li muitos tópicos semelhantes aqui no StackOverflow. Eu também fiz bastante pesquisa no Google. Infelizmente, não consegui encontrar uma resposta satisfatória.
image
opencv
comparison
similarity
Boris
fonte
fonte
Respostas:
Este é um tópico enorme, com respostas de três linhas de código a revistas de pesquisa inteiras.
Vou descrever as técnicas mais comuns e seus resultados.
Comparando histogramas
Um dos métodos mais simples e rápidos. Há décadas, proposto como um meio de encontrar semelhanças de imagens. A ideia é que uma floresta tenha muito verde e um rosto humano muito rosa, ou o que seja. Portanto, se você comparar duas fotos com florestas, obterá uma semelhança entre os histogramas, porque possui muito verde nas duas.
Correspondência de modelos
Um bom exemplo aqui é matchTemplate, encontrando uma boa correspondência . Convolve a imagem de pesquisa com a que está sendo pesquisada. Geralmente é usado para encontrar partes menores da imagem em uma maior.
Correspondência de recursos
Considerada uma das maneiras mais eficientes de fazer a pesquisa de imagens. Vários recursos são extraídos de uma imagem, de forma a garantir que os mesmos recursos sejam reconhecidos novamente, mesmo quando girados, redimensionados ou inclinados. Os recursos extraídos dessa maneira podem ser comparados com outros conjuntos de recursos de imagem. Outra imagem que possui uma alta proporção dos recursos correspondentes à primeira é considerada representando a mesma cena.
Encontrar a homografia entre os dois conjuntos de pontos também permitirá que você encontre a diferença relativa no ângulo de disparo entre as imagens originais ou a quantidade de sobreposição.
No site de perguntas e respostas do OpenCV, estou falando sobre a diferença entre descritores de recursos, que são ótimos ao comparar imagens inteiras e descritores de textura, que são usados para identificar objetos como rostos humanos ou carros em uma imagem.
fonte
absdiff
codota.com/code/java/methods/org.opencv.core.Core/absdiff Limiar o resultado produz uma máscara que permite destacar as regiões que mudaram de cena para cena.Se for para combinar imagens idênticas (mesmo tamanho / orientação)
Fonte
fonte
A solução de Sam deve ser suficiente. Eu usei a combinação da diferença do histograma e da correspondência de modelos, porque nenhum método estava funcionando para mim 100% das vezes. Dei menos importância ao método histograma. Aqui está como eu implementei no script python simples.
fonte
Um pouco fora de tópico, mas útil é a
numpy
abordagem pitônica . É robusto e rápido, mas apenas compara pixels e não os objetos ou dados que a imagem contém (e requer imagens do mesmo tamanho e forma):Uma abordagem muito simples e rápida para fazer isso sem o openCV e qualquer biblioteca de visão computacional é padronizar as matrizes de imagem
Após definir as duas imagens (ou matrizes), você pode somar a multiplicação das imagens que deseja comparar:
1) Se você comparar imagens semelhantes, a soma retornará 1:
2) Se não forem semelhantes, você obterá um valor entre 0 e 1 (uma porcentagem se multiplicar por 100):
Observe que, se você tiver imagens coloridas, precisará fazer isso nas três dimensões ou apenas comparar uma versão em escala de cinza. Costumo comparar grandes quantidades de fotos com conteúdo arbitrário e essa é uma maneira muito rápida de fazer isso.
fonte