"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.
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.
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.
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) 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.)
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):
Vous pouvez combiner les approches, en utilisant compare
pour voir où quelque chose a changé, puis en utilisant ce qui précède pour voir plus en détail comment cela a changé.