Pergunta

Eu estou tentando construir um script para percorrer o meu original, alto-res fotos e substituir os antigos, de baixa resolução que eu enviados para o Flickr antes eu tinha uma conta Pro.

Para muitos deles eu posso apenas usar as informações EXIF ??como data tomadas para determinar uma partida. Mas alguns são muito antigo, e quer o arquivo original não tinha informação de EXIF, ou ele foi derrotado por qualquer software de redimensionamento estúpida que eu usei na época.

Assim, incapaz de confiar em metadados, eu sou forçado a recorrer ao próprio conteúdo. O problema é que os originais estão em diferentes resoluções do que os no Flickr (que é o ponto de todo esse esforço). Então, há uma maneira para que eu compará-los com algum tipo de medida de similaridade fuzzy que me permitiria definir um limite para requerer intervenção humana ou não?

Eu acho que saber uma imagem é uma versão redimensionada do outro pode produzir melhores resultados do que similaridade geral. Uma solução em qualquer idioma vai fazer, mas o Ruby seria um plus:)

Foi útil?

Solução

problema Interessante, btw:)

-ish lenta solução - excelente chance de sucesso

Use um detector de recurso escala invariante para encontrar recursos correspondentes em ambas as imagens. Se os recursos são combinados com com uma pontuação elevada em locais semelhantes, então você tem o seu jogo.

Eu recomendo SIFT que gera uma escala e rotação invariante descritor de 128 inteiro para um recurso encontrado em uma imagem. SURF (disponível em OpenCV) é outro (mais rápido) detector ponto de recurso.

Você pode combinar recursos através de duas imagens via bruteforce (comparar cada descritor para um descritor na outra imagem), que é O (n ^ 2), mas muito rápido (especialmente na implementação VL SIFT). Mas se você precisa comparar as características de uma imagem para várias imagens (que você pode ter que) você deve construir uma árvore de características para consultá-lo com características da outra imagem. árvores K-D são úteis, e OpenCV tem uma implementação agradável.

Solução rápida - trabalho poderia

Downsample sua imagem em alta resolução para as dimensões de baixa resolução e usar uma medida de similaridade como SAD (onde a soma das diferenças entre o bloco de, digamos, 3x3 pixels em torno de um pixel em ambas as imagens é a pontuação) para determinar uma partida.

Outras dicas

Eu recomendo script uma solução fora do ImageMagick. O seguinte (a partir da documentação sobre comparando imagens com IM ) iria produzir um valor comparativo que você pode usar.

convert image1 image2 \
        -compose difference -composite -colorspace gray miff:- |\
  identify -verbose - |\
    sed -n '/^.*Mean: */{s//scale=2;/;s/(.*)//;s/$/*100\/32768/;p;q;}' | bc

Calcule o normalizada histograma cor de imagens e compará-los usando algum método (intersecção histograma, por exemplo - veja o link acima). Observe o histograma normalizado é necessária porque as imagens apresentam diferentes resoluções. Se as imagens são tão diferentes, eles não são a mesma imagem. Mas se eles são semelhantes, você tem um desses dois casos: (i) são a mesma imagem ou (ii) são imagens diferentes, mas presente distribuições semelhantes globais de cor.

Para o caso (ii), dividir as imagens e azulejos retangulares e repita o processo, comparando azulejos correspondentes. Você está tentando conta para locais Propriedades da imagem. Rank os resultados e escolher o melhor jogo.

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