web-dev-qa-db-fra.com

“Diff” une image en utilisant ImageMagick

Comment puis-je obtenir la différence entre deux images? J'ai l'image originale. Quelqu'un a écrit sur une copie exacte de l'image d'origine. Maintenant, je dois comparer l'original à l'image écrite et extraire uniquement l'écriture au format 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, supprimer 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 recherche.

155
Justin Noel

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 fichier PDF.

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

Court et doux.

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

Si, pour une raison quelconque, vous avez besoin d’une résolution supérieure à celle par défaut (72 dpi), ajoutez simplement un fichier -density paramètre:

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

Exemples illustrés

Voici quelques illustrations de résultats pour les variantes de la commande ci-dessus. Remarque: les deux fichiers comparés étaient pairs fichiers PDF , donc cela fonctionne aussi avec ceux-ci ( tant qu'ils sont 1-pagers)!


Gauche: Image avec du texte Centre: Image originale Droite: Différences (= texte) en pixels rouges. Red difference pixels only; identical pixels are white

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 le texte Centre: Image originale Droite: Différences de pixels 'vert'. Seagreen difference pixels only; identical pixels are white

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

Cette commande ajoute un paramètre pour que la différence de pixels soit "seagreen" au lieu du rouge par défaut.


Gauche: Image avec le texte Centre: Image originale Droite: Bleu diffs (mais avec un peu de fond de contexte) Blue difference pixels only; first of the compared images as a lightened-up backgroundl

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

Cette commande supprime le -compose src part - le résultat est le comportement par défaut de compare qui conserve comme fond clair la première des deux images différées. (Cette fois avec l'ajout d'un paramètre permettant d'afficher les pixels diff en bleu.)

298
Kurt Pfeifle

Alors que compare fait un bon travail pour de nombreuses applications, j'ai constaté que je préférais parfois une approche différente, notamment lorsque l'on comparait des images 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: convertir les deux file1.png et file2.png en niveaux de gris. Ensuite, traitez 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 canaux à l’aide de l’opérateur de composition darken, ce qui revient essentiellement à prendre le minimum.

Ainsi, les éléments blancs dans les deux images restent blancs. Les éléments noirs dans les deux images restent noirs. Les choses qui sont blanches dans la première image mais noires dans la seconde deviennent rouges, et celles qui sont blanches dans la seconde mais noires dans la première deviennent vertes.

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

enter image description here

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é.

49
MvG