Có phải diff diff khác tồn tại cho hình ảnh?


51

Bạn có thể so sánh hai tệp văn bản rất dễ dàng diffvà thậm chí tốt hơn với meld:

ví dụ

Nếu bạn sử dụng diff cho hình ảnh, bạn sẽ có được một ví dụ như thế này:

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

Đây là một ví dụ:

Bản gốc từ http: //commons.wik mega.org/wiki/File:Tux.svg

Ảnh gốc

Đã chỉnh sửa:

đã chỉnh sửa

Tôi đã thêm một nền trắng cho cả hai hình ảnh và bộ lọc "Sự khác biệt" của GIMP được áp dụng để có được điều này:

Sự khác biệt

Đó là một phương pháp rất đơn giản làm thế nào một diff có thể hoạt động, nhưng tôi có thể tưởng tượng những cái tốt hơn (và phức tạp hơn).

Bạn có biết một chương trình hoạt động cho hình ảnh như meld làm cho văn bản không?

.


Có vẻ như bạn đang liên kết đến một hình ảnh SVG. Nó thực sự là văn bản XML hợp lệ. Điều tương tự không đi với các định dạng hình ảnh khác.
ζ--

Câu trả lời:


57

Vâng, một chương trình như vậy tồn tại!

ImageMagickcomparetiện ích, có một số cách so sánh hình ảnh.

Để cài đặt nó:

sudo apt-get install imagemagick imagemagick-doc

So sánh hai hình ảnh trực quan:

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

tux_orig.png & tux_modified.png

tux_orig.png tux_modified.png

Cho hình ảnh này:

Sự khác biệt hình ảnh

So sánh hai hình ảnh qua số liệu:

Cũng có nhiều cách để tạo ra sự khác biệt thông qua một số số liệu, ví dụ:

# 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

Một số tùy chọn số liệu:

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)

Có nhiều cách để so sánh hình ảnh, xem phần ImageMagicks trên so sánh để biết thêm phương pháp.


Có cách nào để hợp nhất? Hoặc vá sự khác biệt với bản gốc để có được mục tiêu?
CMCDragonkai

@CMCDragonkai ImageMagick rất mạnh. Tôi không biết cách gọi chính xác, nhưng bạn có thể lọc và xâu chuỗi các thao tác trên hình ảnh và tạo các thao tác mới. Vì vậy, tôi khá chắc chắn rằng bạn có thể "hợp nhất" với một tập lệnh ImageMagick.
HRJ

1
fantemagick thực sự là một phép thuật!
Brain90

Làm thế nào về việc sử dụng so sánh với AE, nhưng không tạo ra một hình ảnh khác biệt?
dùng643722

6

Câu hỏi này đã được hỏi lại vào năm 2012 và đó là năm 2017. Hiện tại chúng tôi có chương trình không phải là nguồn mở Beyond So sánh để so sánh các hình ảnh và nó tích hợp vào Nautilus. Chúng tôi cũng đã có Geeqie cùng nhau để tìm các hình ảnh tương tự trong suốt cấu trúc thư mục (đệ quy).

I. Tìm sự khác biệt về hình ảnh với sự so sánh vượt trội

Nhấp vào liên kết này để tải xuống Beyond So sánh các gói .deb.

Cài đặt gói bằng cách vào thư mục bạn cũng đã tải gói đó và gõ: sudo dpkg -i YourPackageName.deb mà tại thời điểm này được gọi là bcompare-4.2.2.22384_amd64.deb , vì vậy bạn sẽ gõ: sudo dpkg -i bcompare- 4.2.2.22384_amd64.deb

Để hoàn tất cài đặt và để plugin hoạt động trong Nautilus, bạn sẽ cần phải đăng xuất và sau đó quay lại, vì Nautilus đang chạy trong nền ngay cả khi bạn không mở.

Khi nó được cài đặt và plugin hoạt động bình thường, bạn:

  1. Mở Nautilus và duyệt đến hình ảnh đầu tiên
  2. Nhấp chuột phải vào hình ảnh đầu tiên để hiển thị menu ngữ cảnh và chọn Chọn tệp trái để so sánh / hợp nhất
  3. Duyệt đến hình ảnh thứ hai
  4. Nhấp chuột phải vào hình ảnh thứ hai và chọn So sánh với 'NameOfFirstImageFile' trong đó NameOfFirstImageFile là tên của tệp bạn đã chọn trong bước 2.
  5. Các hình ảnh sau đó sẽ mở ra trong Beyond So sánh, và nó sẽ trông giống như thế này:

Ngoài việc so sánh so sánh hình ảnh

II. Tìm hình ảnh tương tự / trùng lặp với Geeqie

  1. Cài đặt Geeqie bằng cách nhập cái này vào một thiết bị đầu cuối: sudo apt cài đặt geeqie
  2. Mở Geeqie và duyệt đến thư mục bạn muốn quét.
  3. Nhấp chuột phải vào tên của thư mục bạn muốn quét và chọn Tìm bản sao ... để chỉ quét thư mục đó hoặc chọn Tìm bản sao đệ quy ... để quét thư mục đó và tất cả các thư mục trong đó.

nhập mô tả hình ảnh ở đây

  1. Sử dụng danh sách So sánh theo thả xuống ở góc dưới bên trái, bạn có thể chọn tìm các bản sao bằng Tổng kiểm tra, theo Tên tệp hoặc theo cấp độ Tương tự. Tính năng tương tự là tuyệt vời nếu bạn đã cắt, xoay hoặc thay đổi kích thước hình ảnh, bạn không còn cần, như nhiều người trong chúng ta có được, khi chúng ta cắt / thay đổi kích thước hình ảnh để đăng lên phương tiện truyền thông xã hội và như vậy.


0

Tôi đã kết thúc với những điều sau đây:

~/.gitconfig

Nối

[diff "image"]
    command = simple-imagediff

hình ảnh đơn giản

Tôi đã thêm vào như sau ~/.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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.