"Diff" existe-t-il pour les images?

51

Vous pouvez comparer deux fichiers texte très facilement avec diffet même mieux avec meld:

exemple de fusion

Si vous utilisez diff pour les images, vous obtenez un exemple comme celui-ci:

$ diff zivi-besch.tif zivildienst.tif 
Binary files zivi-besch.tif and zivildienst.tif differ

Voici un exemple:

Original de http://commons.wikimedia.org/wiki/File:Tux.svg

Image originale

Édité:

édité

J'ai ajouté un fond blanc aux deux images et appliqué le filtre "Différence" de GIMP pour obtenir ceci:

différence

C'est une méthode très simple, comment un diff pourrait fonctionner, mais je peux en imaginer de bien meilleures (et plus compliquées).

Connaissez-vous un programme qui fonctionne pour les images comme Meld le fait pour les textes?

(Si un programme existait pouvait donner un pourcentage (0% de la même image - 100% de la même image), je serais également intéressé, mais je cherche un programme qui me donne des indices visuels indiquant les différences.)

Martin Thoma
la source
Il semble que vous vous connectiez à une image SVG. C'est en fait un texte XML valide. La même chose ne va pas pour d'autres formats d'image.
ζ--
liées: stackoverflow.com/questions/5132749/…
Ciro Santilli a annoncé

Réponses:

58

Oui, un tel programme existe!

ImageMagick a l' compareutilitaire, qui a plusieurs façons de comparer des images.

Pour l'installer:

sudo apt-get install imagemagick imagemagick-doc

Comparer visuellement deux images:

compare -compose src tux_orig.png tux_modified.png tux_difference.png

tux_orig.png Et tux_modified.png

tux_orig.png tux_modified.png

Donne cette image:

La différence d'image

Comparer deux images via des métriques:

Il existe également de nombreuses façons d’exporter les différences via certaines métriques, par exemple:

# compare -verbose -metric PSNR tux_orig.png tux_modified.png tux_difference.png
tux_orig.png PNG 200x232 200x232+0+0 8-bit sRGB 20.6KB 0.000u 0:00.000
tux_modified.png PNG 200x232 200x232+0+0 8-bit sRGB 22.2KB 0.010u 0:00.000
Image: tux_orig.png
  Channel distortion: PSNR
    red: 19.5485
    green: 19.5973
    blue: 19.6507
    alpha: 16.1568
    all: 18.4517
tux_orig.png=>tux_difference.png PNG 200x232 200x232+0+0 8-bit sRGB 12.3KB 0.030u 0:00.020

Quelques options métriques:

AE     absolute error count, number of different pixels (-fuzz effected)
FUZZ   mean color distance
MAE    mean absolute error (normalized), average channel error distance
MEPP   mean error per pixel (normalized mean error, normalized peak error)
MSE    mean error squared, average of the channel error squared
NCC    normalized cross correlation
PAE    peak absolute (normalize peak absolute)
PSNR   peak signal to noise ratio
RMSE   root mean squared (normalized root mean squared)

Il existe de nombreuses façons de comparer les images. Consultez la section ImageMagicks sur la comparaison pour connaître d'autres méthodes.

phoibos
la source
Y a-t-il un moyen de fusionner? Ou corrigez la différence avec l'original pour obtenir la cible?
CMCDragonkai
@CMCDragonkai ImageMagick est très puissant. Je ne connais pas l'invocation exacte, mais vous pouvez filtrer et chaîner les opérations sur les images et en créer de nouvelles. Je suis donc à peu près sûr que vous pourriez "fusionner" avec un script ImageMagick.
HRJ
1
imagemagick est vraiment une magie!
Brain90
Pourquoi ne pas comparer avec AE, mais sans générer d’image de différence?
user643722
6

Cette question avait été posée en 2012 et en 2017. Nous avons maintenant le programme non-open source Beyond Compare pour comparer les images, qui s'intègre dans Nautilus. Nous avons également eu Geeqie pour trouver des images similaires dans une structure de répertoires (récursive).

I. Trouver des différences d'image avec au-delà de comparer

Cliquez sur ce lien pour télécharger les packages Beyond Compare .deb.

Installez le paquet en allant dans le répertoire dans lequel vous l'avez téléchargé, et en tapant: sudo dpkg -i YourPackageName.deb, qui s'appelle pour le moment bcompare-4.2.2.22384_amd64.deb , vous taperez donc: sudo dpkg -i bcompare- 4.2.2.22384_amd64.deb

Pour terminer l’installation et faire fonctionner le plug-in dans Nautilus, vous devez vous déconnecter, puis vous y reconnecter, car Nautilus s’exécute en arrière-plan, même s’il n’a pas été ouvert.

Une fois installé et que le plugin fonctionne correctement, vous:

  1. Ouvrez Nautilus et accédez à la première image.
  2. Cliquez avec le bouton droit sur la première image pour afficher le menu contextuel, puis sélectionnez Sélectionner le fichier de gauche pour comparer / fusionner.
  3. Accédez à la deuxième image
  4. Cliquez avec le bouton droit de la souris sur la deuxième image, puis sélectionnez Comparer avec 'NameOfFirstImageFile' où NameOfFirstImageFile est le nom du fichier sélectionné à l'étape 2.
  5. Les images s'ouvriront ensuite dans Beyond Compare et ressembleront à ceci:

Au-delà de la comparaison d'images

II. Trouver des images similaires / en double avec Geeqie

  1. Installez Geeqie en le liant à un terminal: sudo apt install geeqie
  2. Ouvrez Geeqie et naviguez jusqu'au répertoire que vous souhaitez analyser.
  3. Cliquez avec le bouton droit de la souris sur le nom du répertoire que vous souhaitez analyser et sélectionnez Rechercher les doublons ... pour analyser uniquement ce répertoire ou sélectionnez Rechercher les doublons récursifs ... pour analyser ce répertoire et tous ses répertoires.

entrez la description de l'image ici

  1. À l'aide de la liste déroulante Comparer par située dans le coin inférieur gauche, vous pouvez choisir de rechercher les doublons par somme de contrôle, par nom de fichier ou par niveau de similarité. La fonctionnalité de similarité est géniale si vous avez des images recadrées, pivotées ou redimensionnées, vous n’avez plus besoin, comme beaucoup d’entre nous l’achetons, de recadrer / redimensionner des images pour les publier sur les médias sociaux, etc.
SunnyDaze
la source
0

J'ai fini avec ce qui suit:

~/.gitconfig

Ajouter

[diff "image"]
    command = simple-imagediff

simple imagediff

J'ai ajouté ce qui suit à ~/.local/bin/simple-imagediff:

#!/usr/bin/env python

# Simple Image Diffs
# ==================
#
# How to Install
# --------------
#
# Download the script somewhere on $PATH as 'simple-imagediff' with +x:
#
# $ cd ~/bin
# $ wget -O simple-imagediff https://raw.github.com/gist/1716699/simple-imagediff.py
# $ chmod +x simple-imagediff
#
# Prerequisites
# -------------
#
# The script should work out-of-the box on Ubuntu 11.10. On other OS'es you may
# need to install PIL and Gtk3.
#
# Git Setup
# ---------
#
# In ~/.gitconfig, add:
#
# [diff "image"]
#   command = simple-imagediff
#
# In your project, create .gitattributes file and add (this enables the custom
# diff tool above):
#
# *.gif diff=image
# *.jpg diff=image
# *.png diff=image
#
# Try It
# ------
#
# $ git diff path/to/file.png
#
# NOTE: file.png must be versioned and the working copy must be different.

import os
import sys

import Image

from gi.repository import Gdk, Gtk


class SimpleImageDiffWindow(Gtk.Window):
    def __init__(self, left, right):
        Gtk.Window.__init__(self,
                            title="Simple Image Diff (%s, %s)" % (left, right))
        self.set_default_size(640, 480)
        align = Gtk.Alignment()
        align.set_padding(10, 10, 10, 10)
        box = Gtk.HBox(homogeneous=True, spacing=10)
        box.add(self._create_image_box(left))
        box.add(self._create_image_box(right))
        align.add(box)
        self.add(align)
        self.resize(1, 1)
        self.set_position(Gtk.WindowPosition.CENTER)

    def _create_image_box(self, image_file):
        box = Gtk.VBox(spacing=10)
        frame = Gtk.Frame()
        image = Gtk.Image()
        image.set_from_file(image_file)
        title = Gtk.Label(label="W: %dpx  |  H: %dpx" %
                          Image.open(image_file).size)
        frame.add(image)
        box.pack_start(frame, True, True, 0)
        box.pack_end(title, False, False, 10)
        return box


def _halt(message, code):
    sys.stderr.write("[ERROR] %s\n" % message)
    sys.exit(0 << code)


def _verify_file_exists(target):
    if not os.path.exists(target):
        _halt("The file '%s' does not exists." % target, 2)

if __name__ == '__main__':
    if len(sys.argv) < 3:
        _halt('Not enough arguments.', 1)
    _verify_file_exists(sys.argv[1])
    _verify_file_exists(sys.argv[2])
    app = SimpleImageDiffWindow(sys.argv[1], sys.argv[2])
    app.connect('delete-event', Gtk.main_quit)
    app.show_all()
    Gtk.main()
Martin Thoma
la source