Gibt es "diff" für Bilder?

51

Sie können zwei Textdateien sehr einfach diffmit meld vergleichen und noch besser mit meld:

Beispiel meld

Wenn Sie diff für Bilder verwenden, erhalten Sie ein Beispiel wie das folgende:

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

Hier ist ein Beispiel:

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

Original Bild

Bearbeitet:

bearbeitet

Ich habe beiden Bildern einen weißen Hintergrund hinzugefügt und den "Unterschied" -Filter von GIMP angewendet, um Folgendes zu erhalten:

Unterschied

Es ist eine sehr einfache Methode, wie ein Diff funktionieren könnte, aber ich kann mir viel bessere (und kompliziertere) vorstellen.

Kennen Sie ein Programm, das für Bilder funktioniert wie für Texte?

(Wenn es ein Programm gäbe, das einen Prozentsatz ergeben könnte (0% das gleiche Bild - 100% das gleiche Bild), wäre ich auch daran interessiert, aber ich suche ein Programm, das mir visuelle Hinweise gibt, wo Unterschiede bestehen.)

Martin Thoma
quelle
Es scheint, dass Sie eine Verknüpfung zu einem SVG-Bild herstellen. Es ist tatsächlich gültiger XML-Text. Gleiches gilt nicht für andere Bildformate.
ζ--
related: stackoverflow.com/questions/5132749/…
Ciro Santilli wurde

Antworten:

57

Ja, ein solches Programm gibt es!

ImageMagick verfügt über das compareDienstprogramm, mit dem Sie Bilder auf verschiedene Arten vergleichen können.

So installieren Sie es:

sudo apt-get install imagemagick imagemagick-doc

Zwei Bilder visuell vergleichen:

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

tux_orig.png & tux_modified.png

tux_orig.png tux_modified.png

Gibt dieses Bild:

Der Bildunterschied

Vergleichen von zwei Bildern über Metriken:

Es gibt auch viele Möglichkeiten, die Unterschiede über einige Metriken auszugeben, z.

# 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

Einige metrische Optionen:

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)

Es gibt viele Möglichkeiten, Bilder zu vergleichen. Weitere Methoden finden Sie im Abschnitt ImageMagicks zum Vergleichen .

Phoibos
quelle
Gibt es eine Möglichkeit zum Zusammenführen? Oder den Unterschied zum Original ausbessern, um das Ziel zu erhalten?
CMCDragonkai
@ CMCDragonkai ImageMagick ist sehr mächtig. Ich kenne den genauen Aufruf nicht, aber Sie können Vorgänge für Bilder filtern und verketten und neue erstellen. Daher bin ich mir ziemlich sicher, dass Sie mit einem ImageMagick-Skript "zusammenführen" können.
HRJ
1
imagemagick ist wirklich eine Magie!
Brain90
Wie wäre es mit Vergleichen mit AE, aber ohne ein Differenzbild zu erzeugen?
user643722
6

Diese Frage wurde 2012 gestellt und es ist 2017. Wir haben jetzt das Nicht-Open-Source-Programm Beyond Compare , um Bilder zu vergleichen, und es ist in Nautilus integriert. Wir hatten auch schon immer Geeqie , um ähnliche Bilder in einer Verzeichnisstruktur (rekursiv) zu finden.

I. Finden von Bildunterschieden mit Beyond Compare

Klicken Sie auf diesen Link, um Beyond Compare .deb-Pakete herunterzuladen .

Installieren Sie das Paket, indem Sie in das Verzeichnis gehen, in das Sie das Paket heruntergeladen haben, und Folgendes eingeben: sudo dpkg -i IhrPaketname.deb , derzeit bcompare-4.2.2.22384_amd64.deb . Geben Sie also Folgendes ein : sudo dpkg -i bcompare- 4.2.2.22384_amd64.deb

Um die Installation abzuschließen und das Plugin in Nautilus zum Laufen zu bringen, müssen Sie sich abmelden und dann wieder anmelden, da Nautilus im Hintergrund ausgeführt wird, auch wenn Sie es nicht geöffnet haben.

Sobald es installiert ist und das Plugin ordnungsgemäß funktioniert, haben Sie folgende Möglichkeiten:

  1. Öffnen Sie Nautilus und navigieren Sie zum ersten Bild
  2. Klicken Sie mit der rechten Maustaste auf das erste Bild, um das Kontextmenü aufzurufen, und wählen Sie Linke Datei zum Vergleichen / Zusammenführen auswählen
  3. Navigieren Sie zum zweiten Bild
  4. Klicken Sie mit der rechten Maustaste auf das zweite Bild und wählen Sie Mit 'NameOfFirstImageFile' vergleichen, wobei NameOfFirstImageFile der Name der in Schritt 2 ausgewählten Datei ist.
  5. Die Bilder werden dann in Beyond Compare geöffnet und sehen ungefähr so ​​aus:

Beyond Compare Bildvergleich

II. Suchen nach ähnlichen / doppelten Bildern mit Geeqie

  1. Installieren Sie Geeqie, indem Sie Folgendes an ein Terminal binden: sudo apt install geeqie
  2. Öffnen Sie Geeqie und navigieren Sie zu dem Verzeichnis, das Sie durchsuchen möchten.
  3. Klicken Sie mit der rechten Maustaste auf den Namen des Verzeichnisses, das Sie durchsuchen möchten, und wählen Sie Duplikate suchen ..., um nur dieses Verzeichnis zu durchsuchen, oder wählen Sie Duplikate rekursiv suchen ... , um dieses Verzeichnis und alle darunter liegenden Verzeichnisse zu durchsuchen.

Bildbeschreibung hier eingeben

  1. In der Dropdown-Liste Vergleichen nach in der unteren linken Ecke können Sie auswählen, ob Duplikate nach Prüfsumme, nach Dateiname oder nach Ähnlichkeitsstufen gesucht werden sollen. Die Ähnlichkeitsfunktion ist fantastisch, wenn Sie Bilder beschnitten, gedreht oder in der Größe geändert haben. Dies ist nicht mehr erforderlich, wie viele von uns dies tun, wenn Sie Bilder beschneiden / in der Größe ändern, um sie in sozialen Medien und dergleichen zu veröffentlichen.
SunnyDaze
quelle
0

Am Ende hatte ich Folgendes:

~/.gitconfig

Anhängen

[diff "image"]
    command = simple-imagediff

Simple-Imagediff

Ich habe Folgendes hinzugefügt ~/.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
quelle