Czy dla obrazów istnieje „diff”?


51

Możesz porównać dwa pliki tekstowe bardzo łatwo, diffa jeszcze lepiej dzięki Meld:

przykład meld

Jeśli używasz diff do obrazów, otrzymujesz taki przykład:

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

Oto przykład:

Oryginał z http://commons.wikimedia.org/wiki/File:Tux.svg

Oryginalny obraz

Edytowane:

edytowane

Dodałem białe tło do obu obrazów i zastosowałem filtr „Różnica” GIMP, aby uzyskać:

różnica

Jest to bardzo prosta metoda, w której mógłby działać diff, ale mogę sobie wyobrazić znacznie lepsze (i bardziej skomplikowane).

Czy znasz program, który działa dla obrazów takich jak meld dla tekstów?

(Jeśli istniałby program, który mógłby dawać procent (0% ten sam obraz - 100% ten sam obraz), również byłbym zainteresowany, ale szukam takiego, który dałby mi wizualne wskazówki, gdzie są różnice.)


Wygląda na to, że łączysz się z obrazem SVG. Jest to właściwie poprawny tekst XML. To samo nie dotyczy innych formatów obrazów.
ζ--

Odpowiedzi:


57

Tak, taki program istnieje!

ImageMagick ma comparenarzędzie, które ma kilka sposobów porównywania obrazów.

Aby zainstalować:

sudo apt-get install imagemagick imagemagick-doc

Porównywanie wizualne dwóch zdjęć:

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

tux_orig.png I tux_modified.png

tux_orig.png tux_modified.png

Daje to zdjęcie:

Różnica obrazu

Porównywanie dwóch obrazów za pomocą metryk:

Istnieje również wiele sposobów na wyprowadzenie różnic za pomocą niektórych wskaźników, np .:

# 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

Niektóre opcje metryczne:

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)

Istnieje wiele sposobów porównywania obrazów, patrz sekcja ImageMagicks na temat porównywania w celu uzyskania dalszych metod.


Czy istnieje sposób na połączenie? Lub załatać różnicę do oryginału, aby uzyskać cel?
CMCDragonkai

@CMCDragonkai ImageMagick jest bardzo potężny. Nie znam dokładnego wywołania, ale możesz filtrować i łączyć operacje na obrazach oraz tworzyć nowe. Jestem więc pewien, że możesz „scalić” się ze skryptem ImageMagick.
HRJ,

1
imagemagick to naprawdę magia!
Brain90

Co powiesz na użycie porównania z AE, ale bez generowania obrazu różnicowego?
user643722,

6

To pytanie zostało zadane w 2012 r., A jest to rok 2017. Mamy teraz program do porównywania obrazów inny niż open source Beyond Compare , który integruje się z Nautilus. Przez cały czas mieliśmy Geeqie do wyszukiwania podobnych obrazów w strukturze katalogów (rekurencyjnie).

I. Znajdowanie różnic w obrazach za pomocą Beyond Compare

Kliknij ten link, aby pobrać pakiety .deb Beyond Compare .

Zainstaluj pakiet, przechodząc do katalogu, w którym pakiet został pobrany, i wpisując: sudo dpkg -i YourPackageName.deb, który w tym momencie nazywa się bcompare-4.2.2.22384_amd64.deb , więc wpisz: sudo dpkg -i bcompare- 4.2.2.22384_amd64.deb

Aby ukończyć instalację i uruchomić wtyczkę w Nautilus, musisz się wylogować, a następnie zalogować ponownie, ponieważ Nautilus działa w tle, nawet jeśli nie masz go otwartego.

Po zainstalowaniu i poprawnym działaniu wtyczki:

  1. Otwórz Nautilus i przejdź do pierwszego obrazu
  2. Kliknij prawym przyciskiem myszy pierwszy obraz, aby wyświetlić menu kontekstowe, i wybierz Wybierz lewy plik do porównania / scalenia
  3. Przejdź do drugiego obrazu
  4. Kliknij drugi obraz prawym przyciskiem myszy i wybierz opcję Porównaj z „NameOfFirstImageFile”, gdzie NameOfFirstImageFile to nazwa pliku wybranego w kroku 2.
  5. Obrazy otworzą się w Beyond Compare i będą wyglądały mniej więcej tak:

Więcej niż porównanie zdjęć

II. Znajdowanie podobnych / zduplikowanych zdjęć za pomocą Geeqie

  1. Zainstaluj Geeqie, wiążąc to z terminalem: sudo apt install geeqie
  2. Otwórz Geeqie i przejdź do katalogu, który chcesz przeskanować.
  3. Kliknij prawym przyciskiem myszy nazwę katalogu, który chcesz przeskanować i wybierz Znajdź duplikaty ... aby po prostu zeskanować ten katalog lub wybierz Znajdź duplikaty rekurencyjne ... aby przeskanować ten katalog i wszystkie znajdujące się w nim katalogi.

wprowadź opis zdjęcia tutaj

  1. Korzystając z listy rozwijanej Porównaj według w lewym dolnym rogu, możesz znaleźć duplikaty według sumy kontrolnej, nazwy pliku lub poziomów podobieństwa. Funkcja podobieństwa jest niesamowita, jeśli przycinałeś, obracałeś lub zmieniałeś rozmiar zdjęć, nie potrzebujesz już, jak wielu z nas, kiedy przycinamy / zmieniamy rozmiar zdjęć, aby opublikować je w mediach społecznościowych i tym podobne.


0

Skończyło się na tym, że:

~/.gitconfig

Dodać

[diff "image"]
    command = simple-imagediff

simple-imagediff

Dodałem następujące elementy ~/.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()
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.