图像是否存在“差异”?


51

您可以非常轻松地比较两个文本文件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的“差异”过滤器以实现此目的:

区别

这是一个非常简单的比较方法,但是我可以想象更好(和更复杂)的方法。

您是否知道适用于图像的程序,例如适用于文本的融合?

(如果存在一个可以给出一定百分比的程序(0%的相同图像-100%的相同图像),我也会对此感兴趣,但是我正在寻找一个可以给我直观的提示差异的地方。)


似乎您正在链接到SVG图像。它实际上是有效的XML文本。其他图像格式则不行。
ζ--

Answers:


57

是的,存在这样的程序!

ImageMagick具有该compare实用程序,该实用程序具有几种比较图像的方法。

要安装它:

sudo apt-get install imagemagick imagemagick-doc

视觉比较两个图像:

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

tux_orig.pngtux_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 '16

@CMCDragonkai ImageMagick非常强大。我不知道确切的调用,但是您可以过滤和链接图像上的操作,并创建新的操作。因此,我非常确定您可以与ImageMagick脚本“合并”。
HRJ

1
imagemagick真的是魔术!
Brain90 '16

在不生成差异图像的情况下与AE进行比较怎么样?
user643722 '18

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. 浏览到第二张图片
  4. 右键单击第二个图像,然后选择“ 与'NameOfFirstImageFile'比较”,其中NameOfFirstImageFile是您在步骤2中选择的文件的名称。
  5. 这些图像将在“超越比较”中打开,看起来像这样:

超越比较图片比较

二。使用Geeqie查找相似/重复的图像

  1. 通过将其绑定到终端来安装Geeqiesudo 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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.