Существует ли «diff» для изображений?

51

Вы можете сравнить два текстовых файла очень легко diffи даже лучше с meld:

пример слияния

Если вы используете diff для изображений, вы получите такой пример:

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

Вот пример:

Оригинал от http://commons.wikimedia.org/wiki/File:Tux.svg

Исходное изображение

Отредактировано:

отредактированный

Я добавил белый фон для обоих изображений и применил фильтр «Разница» в GIMP, чтобы получить следующее:

разница

Это очень простой метод работы diff, но я могу представить себе гораздо лучшие (и более сложные).

Знаете ли вы программу, которая работает для изображений, как Meld делает для текстов?

(Если бы существовала программа, которая могла бы дать процент (0% того же изображения - 100% того же изображения), я бы тоже заинтересовался этим, но я ищу ту, которая дает мне визуальные подсказки, где есть различия.)

Мартин Тома
источник
Похоже, вы ссылаетесь на изображение SVG. Это действительно правильный текст XML. То же самое не касается других форматов изображений.
ζ--
связанные: stackoverflow.com/questions/5132749/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

58

Да, такая программа существует!

ImageMagick имеет compareутилиту, которая имеет несколько способов сравнения изображений.

Чтобы установить его:

sudo apt-get install imagemagick imagemagick-doc

Сравнение двух изображений визуально:

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

tux_orig.png & tux_modified.png

tux_orig.png tux_modified.png

Дает это изображение:

Разница в изображении

Сравнение двух изображений с помощью метрик:

Есть также много способов вывести различия с помощью некоторых метрик, например:

# 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

Некоторые метрические параметры:

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)

Есть много способов сравнить изображения, см. Раздел ImageMagicks для сравнения других методов.

Phoibos
источник
Есть ли способ слияния? Или исправить разницу с оригиналом, чтобы получить цель?
CMCDragonkai
@CMCDragonkai ImageMagick очень мощный. Я не знаю точного вызова, но вы можете фильтровать и связывать операции с изображениями и создавать новые. Так что я уверен, что вы могли бы «слиться» со сценарием ImageMagick.
HRJ
1
imagemagick действительно волшебство!
Brain90
Как насчет использования сравнения с AE, но без создания разностного изображения?
user643722
6

Этот вопрос был задан еще в 2012 году, а сейчас 2017 год. Теперь у нас есть программа Beyond Compare, не имеющая открытого исходного кода, для сравнения изображений, и она интегрируется в Nautilus. У нас также был Geeqie для поиска похожих изображений в структуре каталогов (рекурсивно).

I. Нахождение различий в изображениях с Beyond Compare

Нажмите на эту ссылку, чтобы загрузить Beyond Compare .deb пакеты.

Установите пакет, перейдя в каталог, в который вы его скачали, и набрав: sudo dpkg -i YourPackageName.deb, который в данный момент называется bcompare-4.2.2.22384_amd64.deb , поэтому введите: sudo dpkg -i bcompare- 4.2.2.22384_amd64.deb

Чтобы завершить установку и заставить плагин работать в Nautilus, вам нужно будет выйти из системы, а затем снова войти в нее, поскольку Nautilus работает в фоновом режиме, даже если он не открыт.

Как только он установлен и плагин работает правильно, вы:

  1. Откройте Nautilus и перейдите к первому изображению
  2. Щелкните правой кнопкой мыши первое изображение, чтобы открыть контекстное меню, и выберите « Выбрать левый файл для сравнения / объединения».
  3. Перейдите ко второму изображению
  4. Щелкните правой кнопкой мыши второе изображение и выберите « Сравнить с« NameOfFirstImageFile », где NameOfFirstImageFile - это имя файла, выбранного на шаге 2.
  5. Затем изображения откроются в Beyond Compare и будут выглядеть примерно так:

Beyond Compare Сравнение изображений

II. Поиск похожих / дублирующих изображений с Geeqie

  1. Установите Geeqie, привязав это к терминалу: sudo apt install geeqie
  2. Откройте Geeqie и перейдите в каталог, который вы хотите сканировать.
  3. Щелкните правой кнопкой мыши имя каталога, который вы хотите сканировать, и выберите Найти дубликаты ..., чтобы просто просмотреть этот каталог, или выберите Найти дубликаты рекурсивно ..., чтобы сканировать этот каталог и все каталоги в нем.

введите описание изображения здесь

  1. Используя раскрывающийся список Сравнить по левому нижнему углу, вы можете выбрать поиск дубликатов по контрольной сумме, по имени файла или по уровням сходства. Функция схожести удивительна, если вы обрезали, повернули или изменили размеры изображений, которые вам больше не нужны, как многие из нас приобретают, когда мы обрезаем / изменяем размер изображений для публикации в социальных сетях и т. Д.
SunnyDaze
источник
0

Я закончил со следующим:

~/.gitconfig

Append

[diff "image"]
    command = simple-imagediff

простой imagediff

Я добавил следующее к ~/.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()
Мартин Тома
источник