Apakah "diff" ada untuk gambar?

51

Anda dapat membandingkan dua file teks dengan sangat mudah diffdan bahkan lebih baik dengan berbaur:

contoh berbaur

Jika Anda menggunakan diff untuk gambar, Anda mendapatkan contoh seperti ini:

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

Berikut ini sebuah contoh:

Asli dari http://commons.wikimedia.org/wiki/File:Tux.svg

Gambar asli

Diedit:

diedit

Saya telah menambahkan latar belakang putih pada kedua gambar dan menerapkan filter "Perbedaan" GIMP untuk mendapatkan ini:

perbedaan

Ini adalah metode yang sangat sederhana bagaimana diff bisa bekerja, tetapi saya bisa membayangkan yang lebih baik (dan lebih rumit).

Apakah Anda tahu program yang berfungsi untuk gambar seperti berbaur untuk teks?

(Jika ada program yang dapat memberikan persentase (0% gambar yang sama - 100% gambar yang sama) Saya juga akan tertarik, tetapi saya mencari yang memberikan petunjuk visual di mana perbedaannya.)

Martin Thoma
sumber
Tampaknya Anda menautkan ke gambar SVG. Ini sebenarnya teks XML yang valid. Hal yang sama tidak berlaku untuk format gambar lainnya.
ζ--
terkait: stackoverflow.com/questions/5132749/...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

58

Ya, program semacam itu ada!

ImageMagick memiliki compareutilitas, yang memiliki beberapa cara untuk membandingkan gambar.

Untuk menginstalnya:

sudo apt-get install imagemagick imagemagick-doc

Membandingkan dua gambar secara visual:

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

tux_orig.png & tux_modified.png

tux_orig.png tux_modified.png

Memberi gambar ini:

Perbedaan gambar

Membandingkan dua gambar melalui metrik:

Ada juga banyak cara untuk menampilkan perbedaan melalui beberapa metrik, misalnya:

# 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

Beberapa opsi metrik:

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)

Ada banyak cara untuk membandingkan gambar, lihat bagian ImageMagicks di bandingkan untuk metode lebih lanjut.

phoibos
sumber
Apakah ada cara untuk bergabung? Atau tambal perbedaan dengan aslinya untuk mendapatkan target?
CMCDragonkai
@CMCDragonkai ImageMagick sangat kuat. Saya tidak tahu doa yang tepat, tetapi Anda dapat memfilter dan menyambung operasi pada gambar, dan membuat yang baru. Jadi saya cukup yakin Anda bisa "bergabung" dengan skrip ImageMagick.
HRJ
1
imagemagick benar-benar ajaib!
Brain90
Bagaimana kalau menggunakan bandingkan dengan AE, tetapi tanpa menghasilkan perbedaan gambar?
user643722
6

Pertanyaan ini ditanyakan kembali pada tahun 2012, dan ini tahun 2017. Kami sekarang memiliki program non-open-source Beyond Compare untuk membandingkan gambar, dan diintegrasikan ke dalam Nautilus. Kami juga memiliki Geeqie selama ini untuk menemukan gambar yang serupa di seluruh struktur direktori (secara rekursif).

I. Menemukan Perbedaan Gambar Dengan Luar Bandingkan

Klik tautan ini untuk mengunduh paket Beyond Compare .deb.

Instal paket dengan masuk ke direktori yang Anda unduh juga, dan ketikkan: sudo dpkg -i YourPackageName.deb yang saat ini disebut bcompare-4.2.2.22384_amd64.deb , jadi Anda akan mengetik: sudo dpkg -i bcompare- 4.2.2.22384_amd64.deb

Untuk menyelesaikan pemasangan dan membuat plugin berfungsi di Nautilus, Anda harus keluar, lalu kembali, karena Nautilus berjalan di latar belakang meskipun Anda tidak membukanya.

Setelah diinstal dan plugin berfungsi dengan baik, Anda:

  1. Buka Nautilus, dan ramban ke gambar pertama
  2. Klik kanan gambar pertama untuk membuka menu konteks, dan pilih Pilih File Kiri untuk Bandingkan / Gabungkan
  3. Telusuri ke gambar kedua
  4. Klik kanan gambar kedua, dan pilih Bandingkan dengan 'NameOfFirstImageFile' di mana NameOfFirstImageFile adalah nama file yang Anda pilih pada langkah 2.
  5. Gambar akan terbuka di Beyond Compare, dan akan terlihat seperti ini:

Di Luar Bandingkan Perbandingan Gambar

II Menemukan Mirip / Gandakan Gambar Dengan Geeqie

  1. Instal Geeqie dengan mengikat ini ke terminal: sudo apt install geeqie
  2. Buka Geeqie, dan ramban ke direktori yang ingin Anda pindai.
  3. Klik kanan nama direktori yang ingin Anda pindai dan pilih Temukan duplikat ... untuk hanya memindai direktori itu, atau pilih Temukan duplikat rekursif ... untuk memindai direktori itu dan semua direktori di bawahnya.

masukkan deskripsi gambar di sini

  1. Dengan menggunakan daftar turun bawah Compare by di sudut kiri bawah, Anda dapat memilih untuk menemukan duplikat dengan Checksum, dengan Nama file, atau dengan tingkat Kesamaan. Fitur kesamaan luar biasa jika Anda telah memotong, memutar, atau mengubah ukuran gambar, Anda tidak perlu lagi, seperti yang banyak dari kita dapatkan, ketika kami memotong / mengubah ukuran gambar untuk dikirim di media sosial dan semacamnya.
SunnyDaze
sumber
0

Saya berakhir dengan yang berikut ini:

~/.gitconfig

Menambahkan

[diff "image"]
    command = simple-imagediff

imagediff sederhana

Saya telah menambahkan yang berikut ini ke ~/.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
sumber