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


51

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

メルドの例

画像に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テキストです。他の画像形式についても同様です。
–ζ

回答:


57

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

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.png tux_modified.png

この画像を提供します:

画像の違い

メトリックを使用して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セクションを参照してください。


マージする方法はありますか?または、元の差分をパッチしてターゲットを取得しますか?
CMCDragonkai

@CMCDragonkai ImageMagickは非常に強力です。正確な呼び出しはわかりませんが、画像の操作をフィルタリングおよびチェーンし、新しい操作を作成できます。したがって、ImageMagickスクリプトと「マージ」できると確信しています。
HRJ

1
imagemagickは本当に魔法です!
Brain90

AEと比較して、差分画像を生成せずに使用するのはどうですか?
user643722

6

この質問は2012年に尋ねられたもので、2017年です。現在、画像を比較するための非オープンソースプログラムBeyond Compareがあり、それは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. 2番目の画像を参照します
  4. 2番目の画像を右クリックし、「NameOfFirstImageFile」比較を選択します。NameOfFirstImageFileは、手順2で選択したファイルの名前です。
  5. その後、画像はBeyond Compareで開き、次のようになります。

画像比較の比較を超えて

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

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

ここに画像の説明を入力してください

  1. 左下隅の[ 比較基準]ドロップダウンリストを使用して、チェックサム、ファイル名、または類似度レベルで重複を検索することを選択できます。類似機能は、画像をトリミング、回転、またはサイズ変更した場合、写真をトリミング/サイズ変更してソーシャルメディアなどに投稿するときに、多くの人が取得する必要がなくなるため、素晴らしいです。


0

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

~/.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 __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()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.