web-dev-qa-db-ja.com

画像には「差分」が存在しますか?

diffを使用すると2つのテキストファイルを非常に簡単に比較でき、meldを使用するとさらに改善できます。

example 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

Original image

編集済み:

edited

これを取得するために、両方の画像に白い背景を追加し、GIMPの「差分」フィルターを適用しました。

difference

Diffがどのように機能するかは非常に簡単な方法ですが、はるかに優れた(そしてより複雑な)方法を想像できます。

テキストに対してmeldが行うような画像に対して機能するプログラムを知っていますか?

(パーセンテージ(0%が同じ画像-100%が同じ画像)を与えるプログラムが存在した場合、私もそれに興味がありますが、違いがどこにあるか視覚的なヒントを提供するものを探しています。)

50
Martin Thoma

はい、そのようなプログラムが存在します!

ImageMagickにはcompareユーティリティがあり、これには画像を比較するいくつかの方法があります。

それをインストールするには:

Sudo apt-get install imagemagick imagemagick-doc

2つの画像を視覚的に比較する:

compare -compose src Tux_orig.png Tux_modified.png Tux_difference.png

Tux_orig.pngTux_modified.png

Tux_orig.pngTux_modified.png

この画像を提供します:

The image difference

メトリックを使用した2つの画像の比較:

また、いくつかのメトリックを介して違いを出力する方法も多数あります。例:

# 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の比較に関するセクション をご覧ください。

56
phoibos

この質問は2012年に尋ねられたもので、2017年です。現在、画像を比較するための非オープンソースプログラムBeyond Compareがあります。ノーチラス。また、ディレクトリ構造全体で同様の画像を(再帰的に)検索するために、Geeqieがありました。

I.比較を超えた画像の違いを見つける

このリンクをクリックして 比較を超えてダウンロード .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. 2番目の画像を参照します
  4. 2番目の画像を右クリックして、「NameOfFirstImageFile」と比較するを選択します。NameOfFirstImageFileは、手順2で選択したファイルの名前です。
  5. その後、画像は比較を超えて開き、次のようになります。

Beyond Compare Image Comparison

II。 Geeqieで類似/重複画像を見つける

  1. これを端末に接続してGeeqieをインストールします:Sudo apt install geeqie
  2. Geeqieを開き、スキャンするディレクトリを参照します。
  3. スキャンするディレクトリの名前を右クリックし、を選択して重複を検索...を選択してそのディレクトリをスキャンするか、再帰再帰...を検索して、そのディレクトリとその下のすべてのディレクトリをスキャンします。

enter image description here

  1. 左下隅のCompare byドロップダウンリストを使用して、チェックサム、ファイル名、または類似度レベルで重複を検索することを選択できます。画像をトリミング、回転、またはサイズ変更した場合、ソーシャルメディアなどに投稿するために写真をトリミング/サイズ変更するときに多くの人が必要とするので、類似性機能は素晴らしいです。
6
SunnyDaze
  1. パッケージにコマンドidiffがあります openimageio-tools .
  2. コマンドがありますperceptualdiff(package perceptualdiff )。
  3. コマンドがありますprightdiff(package prightdiff ).
3

私は次のようになりました:

~/.gitconfig

追記

[diff "image"]
    command = simple-imagediff

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 __== '__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()
0
Martin Thoma