Esiste "diff" per le immagini?


51

Puoi confrontare due file di testo in modo molto semplice diffe persino migliore con meld:

esempio di fusione

Se usi diff per le immagini, ottieni un esempio come questo:

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

Ecco un esempio:

Originale da http://commons.wikimedia.org/wiki/File:Tux.svg

Immagine originale

Modificato:

modificato

Ho aggiunto uno sfondo bianco a entrambe le immagini e applicato il filtro "Difference" di GIMP per ottenere questo:

differenza

È un metodo molto semplice su come un diff potrebbe funzionare, ma posso immaginarne di migliori (e più complicati).

Conosci un programma che funziona per immagini come la fusione fa per i testi?

(Se esistesse un programma in grado di fornire una percentuale (0% della stessa immagine - 100% della stessa immagine), sarei anche interessato a questo, ma ne sto cercando uno che mi dia suggerimenti visivi in ​​merito alle differenze.)


Sembra che tu stia collegando a un'immagine SVG. In realtà è un testo XML valido. Lo stesso non vale per altri formati di immagine.
ζ--

Risposte:


58

Sì, esiste un programma del genere!

ImageMagick ha l' compareutilità, che ha diversi modi per confrontare le immagini.

Per installarlo:

sudo apt-get install imagemagick imagemagick-doc

Confronto visivo di due immagini:

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

tux_orig.png & tux_modified.png

tux_orig.png tux_modified.png

Dà questa immagine:

La differenza dell'immagine

Confronto di due immagini tramite metriche:

Esistono anche molti modi per generare le differenze tramite alcune metriche, ad esempio:

# 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

Alcune opzioni metriche:

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)

Esistono molti modi per confrontare le immagini, vedere la sezione ImageMagicks sul confronto per ulteriori metodi.


C'è un modo per unire? O patch la differenza rispetto all'originale per ottenere il bersaglio?
CMCDragonkai,

@CMCDragonkai ImageMagick è molto potente. Non conosco l'esatta invocazione, ma puoi filtrare e concatenare le operazioni sulle immagini e crearne di nuove. Quindi sono abbastanza sicuro che potresti "unire" con uno script ImageMagick.
HRJ,

1
imagemagick è davvero una magia!
Brain90,

Che ne dici di usare il confronto con AE, ma senza generare un'immagine di differenza?
user643722

6

Questa domanda è stata posta nel 2012 ed è il 2017. Ora abbiamo il programma non open source Beyond Compare per confrontare le immagini e si integra in Nautilus. Abbiamo anche avuto Geeqie da sempre per trovare immagini simili in una struttura di directory (ricorsivamente).

I. Trovare differenze di immagine con Beyond Compare

Fare clic su questo collegamento per scaricare i pacchetti .deb Beyond Compare .

Installa il pacchetto accedendo alla directory in cui hai scaricato anche il pacchetto e digitando: sudo dpkg -i YourPackageName.deb che in questo momento si chiama bcompare-4.2.2.22384_amd64.deb , in modo da digitare: sudo dpkg -i bcompare- 4.2.2.22384_amd64.deb

Per completare l'installazione e far funzionare il plugin in Nautilus, dovrai disconnetterti e quindi riconnetterti, poiché Nautilus è in esecuzione in background anche se non lo hai aperto.

Una volta installato e il plugin funziona correttamente, tu:

  1. Apri Nautilus e cerca la prima immagine
  2. Fai clic con il pulsante destro del mouse sulla prima immagine per visualizzare il menu di scelta rapida e seleziona Seleziona il file sinistro per confrontare / Unire
  3. Passa alla seconda immagine
  4. Fare clic con il tasto destro del mouse sulla seconda immagine e selezionare Confronta con 'NameOfFirstImageFile' dove NameOfFirstImageFile è il nome del file selezionato al passaggio 2.
  5. Le immagini si apriranno in Beyond Compare e appariranno in questo modo:

Beyond Compare Confronto di immagini

II. Trovare immagini simili / duplicate con Geeqie

  1. Installa Geeqie collegandolo a un terminale: sudo apt install geeqie
  2. Apri Geeqie e cerca la directory che desideri scansionare.
  3. Fare clic con il tasto destro del mouse sul nome della directory che si desidera scansionare e selezionare Trova duplicati ... per scansionare semplicemente quella directory, oppure selezionare Trova ricorsivi duplicati ... per scansionare quella directory e tutte le directory sottostanti.

inserisci qui la descrizione dell'immagine

  1. Utilizzando l' elenco a discesa Confronta per nell'angolo in basso a sinistra, è possibile scegliere di trovare duplicati per Checksum, Nome file o Livelli di somiglianza. La funzione di somiglianza è fantastica se hai ritagliate, ruotate o ridimensionate immagini, non è più necessario, come molti di noi acquisiscono, quando ritagliamo / ridimensioniamo le immagini da pubblicare sui social media e simili.


0

Ho finito con il seguente:

~/.gitconfig

Aggiungere

[diff "image"]
    command = simple-imagediff

semplice-ImageDiff

Ho aggiunto quanto segue a ~/.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()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.