65 votes

Est-ce que "diff" existe pour les images ?

Vous pouvez comparer deux fichiers texte très facilement avec diff et encore mieux avec la fusion :

example meld

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

Original image

Édité :

edited

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

difference

Il s'agit d'une méthode très simple de fonctionnement d'un diff, 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 ?

(S'il existait un programme capable de donner un pourcentage (0% la même image - 100% la même image), il m'intéresserait aussi, mais je cherche un programme qui me donne des indications visuelles sur les différences).

80voto

phoibos Points 19941

Oui, un tel programme existe !

ImageMagick a le compare qui permet de comparer les images de plusieurs façons.

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

tux_orig.pngtux_modified.png

Donne cette image :

The image difference

Comparaison de deux images par le biais de métriques :

Il existe également de nombreuses façons de sortir 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 des images, voir Section d'ImageMagicks sur la comparaison pour d'autres méthodes.

8voto

Rudolf Dovičín Points 117
  1. Il y a une commande idiff dans le paquet openimageio-tools .
  2. Il y a une commande Différence perceptuelle (paquet Différence perceptuelle ).
  3. Il y a une commande Différentiel vertical (paquet Différentiel vertical ).

6voto

SunnyDaze Points 1251

Cette question a été posée en 2012, et nous sommes en 2017. Nous avons maintenant le programme non-open-source Au-delà de la comparaison pour comparer des images, et il s'intègre à Nautilus. Nous avons également Geeqie depuis le début pour trouver des images similaires dans une structure de répertoire (de manière récursive).

I. Trouver des différences d'image avec Beyond Compare

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

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

Pour terminer l'installation et faire fonctionner le plugin dans Nautilus, vous devrez vous déconnecter, puis vous reconnecter, car Nautilus fonctionne en arrière-plan même si vous ne l'avez pas ouvert.

Une fois qu'il est installé et que le plugin fonctionne correctement, vous.. :

  1. Ouvrez Nautilus, et naviguez vers la première image
  2. Cliquez avec le bouton droit de la souris sur la première image pour faire apparaître le menu contextuel, puis sélectionnez Sélectionnez le fichier de gauche pour la comparaison/fusion
  3. Naviguez jusqu'à 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 que vous avez sélectionné à l'étape 2.
  5. Les images s'ouvriront alors dans Beyond Compare, et cela ressemblera à ceci :

Beyond Compare Image Comparison

II. Recherche d'images similaires/doublons avec Geeqie

  1. Installez Geeqie en le reliant à un terminal : sudo apt install geeqie
  2. Ouvrez Geeqie, et naviguez jusqu'au répertoire que vous voulez analyser.
  3. Cliquez avec le bouton droit de la souris sur le nom du répertoire que vous voulez numériser et sélectionnez Trouver les doublons... pour analyser uniquement ce répertoire, ou sélectionnez Recherche de doublons récursifs... pour analyser ce répertoire et tous les répertoires qui s'y trouvent.

enter image description here

  1. Utilisation de la Comparer par Dans la liste déroulante 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 similitude. La fonction de similarité est géniale si vous avez recadré, fait pivoter ou redimensionné des images, dont vous n'avez plus besoin, comme beaucoup d'entre nous l'acquièrent, lorsque nous recadrons/redimensionnons des images pour les publier sur les médias sociaux et autres.

1voto

Je me suis retrouvé 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()

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X