"Diff" une image utilisant ImageMagick

Comment puis-je obtenir la différence entre deux images? J'ai l'image d'origine. Quelqu'un a écrit sur un duplicata exact de l'image originale. Maintenant, je dois comparer l'original à l'écrit sur l'image et extraire juste l'écriture au format d'image.

Exemple: j'ai une photo d'une maison. Quelqu'un a pris une copie et a écrit " Bonjour!"sur la copie. Je veux en quelque sorte comparer les deux images, enlever la maison,et être laissé avec une image des mots " Bonjour!".

Est-ce possible avec ImageMagick? Je sais qu'il existe des moyens d'obtenir la différence statistique entre les images, mais ce n'est pas ce que je cherche.

137
demandé sur MvG 2011-02-27 13:46:55

2 réponses

Mes propres favoris sont ces deux:

 compare image1 image2 -compose src diff.png
 compare image1 image2 -compose src diff.pdf

La seule différence entre les 2 commandes ci-dessus: la première montre la différence visuelle entre les deux images sous forme de fichier PNG, la seconde sous forme de PDF.

Le fichier diff résultant affiche tous les pixels qui sont différents en couleur rouge. Ceux qui sont inchangés apparaissent blancs.

Court et doux.

Remarque, vos images doivent pas être du même type. Vous pouvez même mélanger JPEG, TIFF, PNG-sous une condition: les images doivent être de la même taille (dimension de l'image en pixels). Le format de sortie est déterminé par l'extension du nom de fichier de sortie.

Si, pour une raison quelconque, vous avez besoin d'une résolution plus élevée que celle par défaut (72 dpi) - ajoutez simplement un paramètre -density Approprié:

 compare -density 300 image1 image2 -compose src diff.jpeg

Exemples Illustrés

Voici quelques illustrations des résultats des variations de la commande ci-dessus. Remarque: les deux fichiers ont même comparé PDF fichiers, il fonctionne donc avec ces trop (tant qu'ils sont 1-pages)!


À Gauche: Image avec du texte Centre: image d'Origine Droit: Différences (=texte) en pixels rouges. Pixels de différence rouges seulement; les pixels identiques sont blancs

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -compose src \
        diff-compose-default.pdf

C'est la même commande que j'ai suggérée plus haut.


À Gauche: Image avec du texte Centre: image d'Origine Droit: Différences dans les "seagreen' pixels. Pixels de différence Seagreen seulement; les pixels identiques sont blancs

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -compose src \
       -highlight-color seagreen \
        diff-compose-default.pdf

Cette commande ajoute un paramètre pour faire la différence pixels 'seagreen' au lieu du rouge par défaut.


Gauche: Image avec texte Centre: image originale droite: diffs bleus (mais avec un arrière-plan contextuel) Pixels de différence bleue seulement; première des images comparées en arrière-plan allégél

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -highlight-color blue \
        diff-compose-default.pdf

Cette commande supprime la partie -compose src - le résultat est le comportement par défaut de {[7] } qui conserve comme arrière-plan allégé la première des 2 images diffées. (Cette fois avec paramètre ajouté pour faire apparaître les pixels diff bleu.)

273
répondu Kurt Pfeifle 2013-06-26 18:52:29

Alors que compare fait un bon travail pour de nombreuses applications, j'ai trouvé que parfois je préfère une approche différente, en particulier lorsque l'on compare des images qui sont principalement en niveaux de gris:

convert '(' file1.png -flatten -grayscale Rec709Luminance ')' \
        '(' file2.png -flatten -grayscale Rec709Luminance ')' \
        '(' -clone 0-1 -compose darken -composite ')' \
        -channel RGB -combine diff.png

L'idée est la suivante: convertissez file1.png et file2.png en niveaux de gris. Puis trat le premier comme le canal rouge de l'image résultante, le second comme le canal vert. Le canal bleu est formé à partir de ces deux en utilisant l'opérateur darken compose, ce qui signifie essentiellement prendre le minimum.

Donc les choses qui sont blancs dans les deux images restent blancs. Les choses qui sont noires dans les deux images restent noires. Les choses qui sont blanches dans la première image mais noires dans la seconde deviennent rouges, et les choses qui sont blanches dans la seconde mais noires dans la première deviennent vertes.

Le résultat vous donne une image joliment codée par couleur où vous pouvez facilement associer le vert à la première entrée et le rouge à la seconde. Voici un exemple où j'utilise ceci pour comparer la sortie de LaTeX à celle de KaTeX (avant que je correction d'un bug pour améliorer cela):

entrez la description de l'image ici

Vous pouvez combiner les approches, en utilisant compare pour voir quelque chose a changé, puis en utilisant ce qui précède pour voir plus en détail comment cela a changé.

42
répondu MvG 2016-03-16 12:23:46