Чи існує "відмінність" для зображень?


51

Ви можете легко порівняти два текстові файли diffз meld та ще краще:

приклад 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 "Різниця", щоб отримати це:

різниця

Це дуже простий метод, як може працювати різниця, але я можу уявити собі набагато кращі (і складніші).

Чи знаєте ви програму, яка працює для зображень, таких як meld для текстів?

(Якщо б існувала програма, яка могла б дати відсоток (0% одне і те саме зображення - 100% одне і те ж зображення), я також зацікавився б цим, але я шукаю таку, яка дає мені наочні підказки, де є відмінності.)


Здається, ви посилаєтесь на зображення SVG. Це фактично дійсний XML-текст. Те ж саме не стосується інших форматів зображень.
ζ--

Відповіді:


57

Так, така програма існує!

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 щодо порівняння для подальших методів.


Чи є спосіб злиття? Або виправити різницю в оригіналі, щоб отримати ціль?
CMCDragonkai

@CMCDragonkai ImageMagick дуже потужний. Я не знаю точного виклику, але ви можете фільтрувати та ланцюгові операції над зображеннями та створювати нові. Тож я впевнений, що ви могли б "злитися" зі сценарієм ImageMagick.
HRJ

1
imagemagick - це справді магія!
Мозок90

Як щодо використання порівняння з AE, але без створення різниці зображення?
user643722

6

Це запитання було задано ще в 2012 році, і це вже 2017. У нас зараз є програма з відкритим кодом без порівняння для порівняння зображень, і вона інтегрується в Nautilus. Також у нас було Geeqie для пошуку подібних зображень у всій структурі каталогу (рекурсивно).

I. Виявлення відмінностей зображень за межами порівняння

Натисніть це посилання, щоб завантажити пакети 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. Потім зображення відкриються в програмі "Більше порівняння" і виглядатимуть приблизно так:

Поза порівнянням Порівняння зображень

II. Пошук подібних / копій зображень за допомогою Geeqie

  1. Встановіть Geeqie, зав'язавши це в термінал: sudo apt install geeqie
  2. Відкрийте Geeqie та перейдіть до каталогу, який потрібно сканувати.
  3. Клацніть правою кнопкою миші ім'я каталогу, який ви хочете сканувати, і виберіть Знайти дублікати ..., щоб просто сканувати цей каталог, або виберіть Знайти дублікати рекурсивно ..., щоб сканувати цей каталог та всі каталоги в ньому.

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

  1. За допомогою випадаючого списку " Порівняти за" у нижньому лівому куті ви можете знайти дублікати за контрольною сумою, за назвою файлу чи рівнем подібності. Особливість подібності є приголомшливою, якщо ви обрізали, обертали або змінили розміри зображень, вам більше не потрібно, як багато хто з нас набуває, коли ми обрізаємо / змінює розмір фотографій, щоб розміщувати їх у соціальних мережах тощо.


0

Я закінчив таке:

~/.gitconfig

Додавати

[diff "image"]
    command = simple-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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.