Pergunta

Gostaria de comparar uma captura de tela de um aplicativo (pode ser uma página da Web) com uma captura de tela feita anteriormente para determinar se o aplicativo está sendo exibido corretamente.Não quero uma comparação exata, pois o aspecto pode ser um pouco diferente (no caso de um aplicativo Web, dependendo do navegador, algum elemento pode estar em um local um pouco diferente).Deve dar uma medida de quão semelhantes são as capturas de tela.

Existe alguma biblioteca/ferramenta que já faz isso?Como você implementaria isso?

Foi útil?

Solução

Isso depende inteiramente de quão inteligente você deseja que o algoritmo seja.

Por exemplo, aqui estão alguns problemas:

  • imagens recortadas vs.uma imagem não cortada
  • imagens com um texto adicionado vs.outro sem
  • imagens espelhadas

O mais fácil e simples algoritmo O que vi para isso é apenas seguir os seguintes passos para cada imagem:

  1. dimensionar para algo pequeno, como 64x64 ou 32x32, desconsiderar a proporção, usar um algoritmo de escala combinado em vez do pixel mais próximo
  2. dimensione as faixas de cores para que o mais escuro seja preto e o mais claro seja branco
  3. gire e vire a imagem para que a cor mais clara fique no canto superior esquerdo e, em seguida, o canto superior direito seja o próximo mais escuro e o canto inferior esquerdo seja o próximo mais escuro (na medida do possível, é claro)

Editar A combinando algoritmo de escala é aquele que, ao reduzir 10 pixels para um, fará isso usando uma função que pega a cor de todos esses 10 pixels e os combina em um.Pode ser feito com algoritmos como média, valor médio ou outros mais complexos, como splines bicúbicas.

Em seguida, calcule a distância média pixel por pixel entre as duas imagens.

Para procurar uma possível correspondência em um banco de dados, armazene as cores dos pixels como colunas individuais no banco de dados, indexe vários deles (mas não todos, a menos que você use uma imagem muito pequena) e faça uma consulta que use um intervalo para cada valor de pixel, ou seja.cada imagem em que o pixel na imagem pequena está entre -5 e +5 da imagem que você deseja procurar.

Isso é fácil de implementar e bastante rápido de executar, mas é claro que não lidará com as diferenças mais avançadas.Para isso você precisa de algoritmos muito mais avançados.

Outras dicas

A maneira 'clássica' de medir isso é dividir a imagem em algum número canônico de seções (digamos, uma grade 10x10) e então calcular um histograma de valores RGB dentro de cada célula e comparar os histogramas correspondentes.Este tipo de algoritmo é preferido devido à sua simplicidade e à sua invariância em relação ao dimensionamento e à (pequena!) tradução.

Use um histograma de cores normalizado.(Leia a seção sobre aplicativos aqui), eles são comumente usados ​​em sistemas de recuperação/correspondência de imagens e são uma forma padrão de correspondência de imagens que é muito confiável, relativamente rápida e muito fácil de implementar.

Essencialmente, um histograma de cores capturará a distribuição de cores da imagem.Isso pode então ser comparado com outra imagem para ver se as distribuições de cores correspondem.

Este tipo de correspondência é bastante resistente ao dimensionamento (uma vez que o histograma é normalizado) e à rotação/deslocamento/movimento, etc.

Evite comparações pixel por pixel, pois se a imagem for girada/deslocada ligeiramente, isso pode levar ao relato de uma grande diferença.

Histogramas seriam fáceis de gerar (supondo que você possa obter acesso aos valores de pixel), mas se você não quiser, o OpenCV biblioteca é um ótimo recurso para fazer esse tipo de coisa. Aqui é uma apresentação em PowerPoint que mostra como criar um histograma usando OpenCV.

Algoritmos de codificação de vídeo como o MPEG não calculam a diferença entre cada quadro de um vídeo para que possam apenas codificar o delta?Você pode ver como os algoritmos de codificação de vídeo calculam essas diferenças de quadro.

Veja este aplicativo de pesquisa de imagens de código aberto http://www.semanticmetadata.net/lire/.Descreve vários algoritmos de similaridade de imagens, três dos quais são do padrão MPEG-7:ScalableColor, ColorLayout, EdgeHistogram e Auto Color Correlogram.

Você poderia usar uma abordagem matemática pura de O(n^2), mas será útil apenas se você tiver certeza de que não há deslocamento ou algo parecido.(Embora se você tiver alguns objetos com cores homogêneas, ainda funcionará muito bem.)

De qualquer forma, a ideia é calcular o produto escalar normalizado das duas matrizes.C = sum(Pij*Qij)^2/(sum(Pij^2)*sum(Qij^2)).

Esta fórmula é na verdade o "cosseno" do ângulo entre as matrizes (estranho).Quanto maior a semelhança (digamos Pij=Qij), C será 1 e, se forem completamente diferentes, digamos para cada i,j Qij = 1 (evitando divisão zero), Pij = 255, então para tamanho nxn, o maior n será, mais perto de zero chegaremos.(Por cálculo aproximado: C=1/n^2).

Você precisará reconhecimento de padrões por isso.Para determinar pequenas diferenças entre duas imagens, Redes Hopfield funcionam razoavelmente bem e são bastante fáceis de implementar.Não conheço nenhuma implementação disponível.

Uma solução de rubi pode ser encontrado aqui

Do leia-me:

Phashion é um wrapper Ruby em torno da biblioteca pHash, "hash perceptual", que detecta arquivos multimídia duplicados e quase duplicados

Como medir a semelhança entre duas imagens depende inteiramente do que você gostaria de medir, por exemplo:contraste, brilho, modalidade, ruído...e então escolha a medida de similaridade mais adequada que existe para você.Você pode escolher LOUCO (média da diferença absoluta), MSD (diferença média quadrática) que são bons para medir o brilho... também está disponível CR (coeficiente de correlação), que é bom para representar a correlação entre duas imagens.Você também pode escolher medidas de similaridade baseadas em histograma, como DSS (desvio padrão do histograma de imagem de diferença) ou medidas de similaridade multimodal como MI (informação mútua) ou MNI (informação mútua normalizada).

Como essas medidas de similaridade custam muito tempo, é aconselhável reduzir a escala das imagens antes de aplicar essas medidas a elas.

Eu me pergunto (e estou apenas lançando a ideia para ser derrubada) se algo poderia ser derivado subtraindo uma imagem da outra e, em seguida, compactando a imagem resultante como um jpeg ou gif e tomando o tamanho do arquivo como uma medida de similaridade.

Se você tivesse duas imagens idênticas, obteria uma caixa branca, que seria muito bem compactada.Quanto mais as imagens diferiam, mais complexo seria representá-lo e, portanto, menos compressível.

Provavelmente não é um teste ideal e provavelmente muito mais lento que o necessário, mas pode funcionar como uma implementação rápida e suja.

Você pode olhar o código da ferramenta de código aberto encontrar imagemdupes, embora pareça ter sido escrito em perl, então não posso dizer quão fácil será analisar...

Lendo a página findimagedupes que gostei, vejo que existe um Implementação C++ do mesmo algoritmo.Presumivelmente, isso será mais fácil de entender.

E parece que você também pode usar gqview.

Bem, não para responder diretamente à sua pergunta, mas já vi isso acontecer.A Microsoft lançou recentemente uma ferramenta chamada FotoSintetizador que faz algo muito semelhante para determinar áreas sobrepostas em um grande número de imagens (que podem ter proporções diferentes).

Eu me pergunto se eles têm alguma biblioteca ou trecho de código disponível em seu blog.

para expandir a nota de Vaibhav, abraço é um 'autostitcher' de código aberto que deve ter algumas dicas sobre o problema.

Existe um software para recuperação de imagens baseada em conteúdo, que faz (parcialmente) o que você precisa.Todas as referências e explicações estão vinculadas no site do projeto e há também um pequeno livro de texto (Kindle): LIA

Bem, um método realmente básico para usar poderia passar por cada cor de pixel e compará-la com a cor de pixel correspondente na segunda imagem - mas isso provavelmente é muito muito solução lenta.

Se isso é algo que você fará ocasionalmente e não precisa de automação, você pode fazê-lo em um editor de imagens que suporte camadas, como Photoshop ou Paint Shop Pro (provavelmente GIMP ou Paint.Net também, mas eu ' não tenho certeza sobre isso).Abra as duas capturas de tela e coloque uma como camada sobre a outra.Mude o modo de mesclagem da camada para Diferença e tudo o que for igual entre as duas ficará preto.Você pode mover a camada superior para minimizar quaisquer diferenças de alinhamento.

Você pode usar a Rede Siamesa para ver se as duas imagens são semelhantes ou diferentes seguindo este tutorial.Este tutorial agrupa imagens semelhantes enquanto você pode usar L2 distância para medir a semelhança de duas imagens.

Sem comparação tem comparação pixel por pixel para imagens, por exemplo,

enter image description here

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