Comment savoir exactement ce qui a changé entre deux images?

28

Par exemple, pour une conversation récente sur la compression JPEG, je voulais comparer pixel par pixel ce qui a changé entre deux JPEG (une avec un niveau de compression 100 et une avec un niveau de compression 95).

Comment générer de bonnes cartes visuelles de ce qui a changé sans une programmation logicielle personnalisée fastidieuse?

cabbey
la source
2
Ne pas soumettre cela comme réponse car ce n'est probablement pas une solution viable pour les photos, mais GitHub (site d'un programmeur) a quelques façons intéressantes de comparer les images: github.com/cameronmcefee/Image-Diff-View-Modes/commit/… Essayez de cliquer "2-up", "Swipe", "Onion Skin" et "Difference".
Henrik N

Réponses:

35

Photoshop + Layers FTW. (Oui, vous pouvez également utiliser Gimp ou tout autre logiciel d'édition avec les mêmes fonctions.)

Commencez avec votre image de base, dans le cas ci-dessus, j'ai utilisé l'image 100 de qualité jpeg.

  1. créer un nouveau calque au-dessus
  2. collez la deuxième image dans ce calque
  3. définissez le style de calque sur "différence" (voir flèche rose gauche dans la 1ère image ci-dessous)
  4. créer un calque d'effet par-dessus (Calque> Nouveau calque de réglage> Seuil)
  5. réglez l'effet au seuil (voir flèche rose droite dans la 1ère image ci-dessous)
  6. définissez la valeur de seuil sur 1

Dans l'image résultante, tout pixel différent de quelque manière que ce soit entre les deux images sera blanc. Vous pouvez l'ajuster pour permettre aux choses d'être "un peu différentes" en modifiant la valeur de seuil.

Exemple montrant BEAUCOUP de différence entre jpeg 92 et 100 de Lightroom. comparaison de jpeg 92 et 100 de LR avec des calques Photoshop

Exemple ne montrant aucune différence entre 95 et 100. comparaison de jpeg 95 et 100 de LR avec des calques Photoshop

Non seulement cela montre un binaire "modifié ou non", et si vous vouliez plus de détails sur son évolution, par exemple par canal de couleur?

  1. remplacer la couche de réglage du seuil par une couche de réglage des courbes.
  2. éditer la courbe
  3. activer le découpage de l'émission
  4. saisissez la poignée d'entrée blanche sous le coin inférieur droit et faites-la glisser vers la gauche, aussi loin que possible
  5. reculer lentement vers la droite jusqu'à ce que vous ne voyiez aucun écrêtage (l'image d'aperçu est entièrement noire)
  6. désactiver l'écrêtage et enregistrer le changement de courbe

Plus les pixels résultants sont clairs, plus ils sont différents dans cette couleur. L'inconvénient est que vous vous retrouvez avec beaucoup de boue grise ... il est donc parfois plus facile de simplement le seuil pour voir où sont les différences. C'est pourquoi je construis les deux et je bascule celui qui est visible.

vue plus descriptive de la différence

cabbey
la source
Nouvelle question, mais comment faire l'étape 4, "créer un calque d'effet par-dessus"? Je ne le trouve nulle part. C'est aussi 7 ans plus tard et j'utilise la dernière version pour peut-être qu'ils ont également changé le nom?
whitneyland
14

Si vous utilisez Photoshop, voici comment je le ferais:

Mettez les deux jpeg dans le même fichier psd, dans deux couches distinctes. Ils doivent se chevaucher exactement, car leurs dimensions sont les mêmes. (lequel va en haut n'a pas d'importance).

Réglez le mode de fusion des calques sur "Différence". Vous verriez un résultat principalement noir. Dépend de la différence de qualité entre les deux couches d'origine, vous pouvez voir plus ou moins de bruit.

entrez la description de l'image ici

Jin
la source
La différence seule n'aide pas vraiment beaucoup quand on se retrouve avec un grand vide noir comme ça. :)
cabbey
@cabbey bien sûr, en comparant 100% à 95%, vous obtiendrez probablement un noir solide. Mais c'est ce que votre question demandait, n'est-ce pas? Dans la réponse de votre propriétaire, vous modifiez les valeurs des originaux comparés, ce qui les empêche d'avoir les paramètres de compression d'origine.
Jin
Vous obtenez un noir pratiquement solide sur à peu près n'importe quelle comparaison, car les différences sont si petites. La couche de seuil / courbe après la différence ne fait rien aux paramètres de compression, elle aide simplement à visualiser les limites inférieures de cette soupe noire préparée par cette différence. (Je ne suis pas sûr à 100% de ce que vous vouliez dire par là, donc je pourrais partir dans une direction différente là-bas ...)
cabbey
@cabbey si vous demandez une opération purement bit par bit de la différence entre les 2 images, alors le mode de fusion "Différence" vous le donne. Lorsque vous ajustez le seuil / la courbe, le résultat est plus évident à l'œil nu, mais ce n'est pas une représentation précise de ce qui a changé. Quand faites-vous cela, vous ne comparez plus un 100% à un 95%.
Jin
Évidemment que tu l'es. Le niveau de compression a cessé de compter que le deuxième photoshop a chargé l'image du disque dans ses tampons internes, c'est maintenant un tableau de pixels non compressés en mémoire ... si ces pixels y sont arrivés parce que l'image avait un blob carré ou parce qu'ils sont un artefact du niveau de compression n'est pas pertinent.
cabbey
13

Tous les packages de traitement d'image devraient faciliter cela. Je vais vous montrer comment le faire dans Mathematica, si vous avez accès à ce système. Mathematica est un langage de programmation, mais il est vraiment facile de faire ce genre de manipulations, donc si vous y avez accès (par exemple via une licence de site universitaire), je vous recommande de l'essayer!

Tout d'abord, importez l'image:

img = Import["http://farm1.staticflickr.com/62/171463865_36ee36f70e.jpg"]

Recompressez-le en utilisant la compression JPEG

img2 = ImportString@ExportString[img, "JPEG", "CompressionLevel" -> 0.35]

Graphiques Mathematica

Prenez maintenant la différence des valeurs de pixels, convertissez-les d'abord en nombres à virgule flottante pour vous assurer que les valeurs négatives sont préservées.

diff = ImageSubtract[Image[img, "Real"], Image[img2, "Real"]]

Graphiques Mathematica

Peu de choses sont visibles sur l'image de différence (la différence est minuscule) et les valeurs négatives sont écrêtées en noir. Redimensionnons donc toutes les valeurs pour remplir toute la plage dynamique (le minimum sera mis à l'échelle à 0, le maximum à 1):

ImageAdjust[diff]

Graphiques Mathematica

ImageDifferencedonne la différence absolue des deux images et ne produit aucun nombre négatif. C'est l'opération que vous êtes le plus susceptible de trouver dans les packages de traitement d'image, en particulier ceux de l'interface graphique (Photoshop, GIMP).

ImageDifference[img, img2]

Graphiques Mathematica

Nous pouvons également prendre un seul canal RVB, par exemple le rouge, et visualiser les différences positives et négatives en utilisant des couleurs «opposées»:

ArrayPlot[0.5 + ImageData[First@ColorSeparate[diff, "Red"]], 
 ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]

Graphiques Mathematica

Voici la même chose, avec des différences amplifiées 5 fois. Les artefacts JPEG sont désormais plus reconnaissables.

ArrayPlot[0.5 + 5 ImageData[First@ColorSeparate[diff, "Red"]], 
 ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]

Graphiques Mathematica

L'avantage d'utiliser un langage de programmation est que nous pouvons facilement automatiser cela et voir comment la différence change pour les "niveaux de compression" entre 0,1 et 1,0:

Grid@Partition[Table[
   ArrayPlot[
    0.5 + ImageData[
      First@ColorSeparate[
        ImageSubtract[Image[img, "Real"], 
         Image[ImportString@
           ExportString[img, "JPEG", "CompressionLevel" -> c], 
          "Real"]], "Red"]], ColorFunction -> "RedGreenSplit", 
    ColorFunctionScaling -> False],
   {c, 0.1, 1, 0.1}
   ], 5]

Graphiques Mathematica

Szabolcs
la source
C'est toujours bien de voir une option scriptée / automatisée! :)
jrista
5

Vous pouvez utiliser les outils de ligne de commande Imagemagick.

composite imagesrc1.jpg imagesrc2.jpg -compose difference diffs.jpg

fournira la valeur absolue des différences pour chaque canal RVB.

mikael
la source
0
  1. Ouvrez l'une des images dans GIMP ou Photoshop.
  2. Ajoutez la deuxième image en tant que nouveau calque au-dessus de la première.
  3. Réglez le mode de fusion du calque supérieur sur "Différence"

Dans l'image résultante, les parties noires montrent où les images originales sont identiques et tout ce qui est plus clair montre des différences.

Dan
la source
La différence seule n'aide pas vraiment beaucoup quand on se retrouve avec un grand vide noir comme ça. :)
cabbey
Vous pouvez toujours ajuster les niveaux sur l'image résultante. Chaque fois que j'ai utilisé cette technique, j'ai eu des images suffisamment différentes pour pouvoir voir les changements :)
Dan