web-dev-qa-db-fra.com

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

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

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 GIMP pour obtenir ceci:

difference

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?

(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.)

50
Martin Thoma

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

Tux_orig.pngTux_modified.png

Donne cette image:

The image difference

Comparaison de deux images via des métriques:

Il existe également de nombreuses façons de générer 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, voir section ImageMagicks sur la comparaison pour connaître les autres méthodes.

56
phoibos

Cette question a été posée en 2012 et en 2017. Nous avons maintenant le programme Beyond Compare permettant de comparer des images, et il s'intègre dans Nautile. Nous avons également eu Geeqie tout au long de notre recherche d'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 Beyond Compare Forfaits .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 en ce moment bcompare -4.2.2.22384_AMD64.deb , vous devez donc taper: 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électionnez Fichier gauche pour la comparaison/fusion .
  3. Accédez à la deuxième image
  4. Cliquez avec le bouton droit sur la deuxième image, puis sélectionnez Comparez à '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:

Beyond Compare Image Comparison

II. Trouver des images similaires/en double avec Geeqie

  1. Installez Geeqie en le connectant à 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 sur le nom du répertoire que vous souhaitez analyser et sélectionnez Rechercher les doublons ... uniquement pour analyser ce répertoire ou sélectionnez Trouver les doublons récursifs ... pour scanner ce répertoire et tous les répertoires qu'il contient.

enter image description here

  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, nom de fichier ou 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'acquérons, lorsque nous recadrons/redimensionnons des images pour les publier sur les médias sociaux, etc.
6
SunnyDaze
  1. Il y a une commande idiff dans le paquet openimageio-tools .
  2. Il y a commande perceptualdiff (paquet perceptualdiff ).
  3. Il y a commande prightdiff (paquet (uprightdiff ).
3
Rudolf Dovičín

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 __== '__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()
0
Martin Thoma