Est-ce que «diff» existe pour les images?

43

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

Sivousutilisezdiffpourlesimages,vousobtenezunexemplecommecelui-ci:

$diffzivi-besch.tifzivildienst.tifBinaryfileszivi-besch.tifandzivildienst.tifdiffer

Voiciunexemple:

Originalde lien

Modifié:

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

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 de la même manière que meld le fait pour les textes?

(S'il existait un programme pouvant donner un pourcentage (0% de la même image - 100% de la même image), cela m'intéresserait également, mais je recherche un programme qui me donne des indices visuels indiquant les différences.)

    
posée Martin Thoma 30.10.2012 - 10:29
la source

4 réponses

48

Oui, un tel programme existe!

ImageMagick contient l'utilitaire compare , qui permet de comparer les images de plusieurs manières.

Pour l'installer:

sudo apt-get install imagemagick imagemagick-doc

Comparaison visuelle de deux images:

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

tux_orig.png & tux_modified.png

donne cette image:

Comparaisondedeuximagesviadesmétriques:

Ilexisteégalementdenombreusesfaçonsdegénérerlesdifférencesviacertainesmétriques,parexemple:

#compare-verbose-metricPSNRtux_orig.pngtux_modified.pngtux_difference.pngtux_orig.pngPNG200x232200x232+0+08-bitsRGB20.6KB0.000u0:00.000tux_modified.pngPNG200x232200x232+0+08-bitsRGB22.2KB0.010u0:00.000Image:tux_orig.pngChanneldistortion:PSNRred:19.5485green:19.5973blue:19.6507alpha:16.1568all:18.4517tux_orig.png=>tux_difference.pngPNG200x232200x232+0+08-bitsRGB12.3KB0.030u0:00.020

Certainesoptionsdemétrique:

AEabsoluteerrorcount,numberofdifferentpixels(-fuzzeffected)FUZZmeancolordistanceMAEmeanabsoluteerror(normalized),averagechannelerrordistanceMEPPmeanerrorperpixel(normalizedmeanerror,normalizedpeakerror)MSEmeanerrorsquared,averageofthechannelerrorsquaredNCCnormalizedcrosscorrelationPAEpeakabsolute(normalizepeakabsolute)PSNRpeaksignaltonoiseratioRMSErootmeansquared(normalizedrootmeansquared)

Ilexistedenombreusesfaçonsdecomparerlesimages.Pourplusd'informationssurlesméthodes,consultezla section ImageMagicks sur la comparaison .

    
réponse donnée phoibos 30.10.2012 - 11:39
la source
4

Cette question a été posée en 2012 et remonte à 2017. Nous disposons maintenant du programme Beyond Compare , qui ne consiste pas en open-source, qui permet de comparer des images et qui s'intègre dans Nautilus. Nous avons également eu Geeqie pour trouver des images similaires dans une structure de répertoires (de manière récursive).

je. Trouver des différences d’image avec au-delà de la comparaison

Cliquez sur ce lien pour télécharger les packages de 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 à présent bcompare-4.2.2.22384_amd64. deb , vous devez donc saisir: 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'est pas ouvert.

Une fois installé et que le plug-in 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 sur la deuxième image, puis sélectionnez Comparer à '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:

II.Recherched’imagessimilaires/endoubleavecGeeqie

  1. InstallezGeeqieenl'attachantàunterminal:sudoaptinstallgeeqie
  2. OuvrezGeeqieetaccédezaurépertoirequevoussouhaitezanalyser.
  3. Cliquezavecleboutondroitdelasourissurlenomdurépertoireàanalyser,puissélectionnezRechercherlesdoublons...pouranalyseruniquementcerépertoireousélectionnezRechercherlesdoublonsrécursifs....pouranalysercerépertoireettoussesrépertoires.

  • À 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, nom de fichier ou niveaux 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 rogner / redimensionner des images pour les publier sur les médias sociaux, etc.
  • .
    réponse donnée SunnyDaze 22.07.2017 - 04:57
    la source
    2
    1. La commande idiff est incluse dans le package. openimageio-tools .
    2. La commande perceptualdiff (package perceptualdiff ).
    3. La commande uprightdiff (package uprightdiff ).
    réponse donnée Rudolf Dovičín 23.09.2017 - 21:30
    la source
    0

    Je me suis retrouvé avec ce qui suit:

    ~/.gitconfig

    Ajouter

    [diff "image"]
        command = simple-imagediff
    

    simple-imagediff

    J'ai ajouté les éléments suivants à ~/.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()
    
        
    réponse donnée Martin Thoma 14.04.2017 - 10:51
    la source

    Lire d'autres questions sur les étiquettes