¿Existe "diff" para las imágenes?

51

Puede comparar dos archivos de texto de manera muy sencilla diffe incluso mejor con meld:

ejemplo de fusión

Si usa diff para imágenes, obtendrá un ejemplo como este:

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

Aquí hay un ejemplo:

Original de http://commons.wikimedia.org/wiki/File:Tux.svg

Imagen original

Editado:

editado

Agregué un fondo blanco a ambas imágenes y apliqué el filtro "Diferencia" de GIMP para obtener esto:

diferencia

Es un método muy simple cómo podría funcionar un diff, pero me imagino unos mucho mejores (y más complicados).

¿Conoces un programa que funcione para imágenes como Meld hace para textos?

(Si existiera un programa que pudiera dar un porcentaje (0% de la misma imagen - 100% de la misma imagen) también me interesaría, pero estoy buscando uno que me dé pistas visuales sobre las diferencias).

Martin Thoma
fuente
Parece que te estás vinculando a una imagen SVG. En realidad es texto XML válido. Lo mismo no se aplica a otros formatos de imagen.
ζ--
relacionado: stackoverflow.com/questions/5132749/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

58

¡Sí, tal programa existe!

ImageMagick tiene la compareutilidad, que tiene varias formas de comparar imágenes.

Para instalarlo:

sudo apt-get install imagemagick imagemagick-doc

Comparación visual de dos imágenes:

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

tux_orig.png Y tux_modified.png

tux_orig.png tux_modified.png

Da esta imagen:

La diferencia de imagen

Comparación de dos imágenes a través de métricas:

También hay muchas formas de generar las diferencias a través de algunas métricas, por ejemplo:

# 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

Algunas opciones métricas:

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)

Hay muchas maneras de comparar imágenes, consulte la sección ImageMagicks en comparar para obtener más métodos.

phoibos
fuente
¿Hay alguna forma de fusionarse? ¿O parchear la diferencia con el original para obtener el objetivo?
CMCDragonkai
@CMCDragonkai ImageMagick es muy poderoso. No sé la invocación exacta, pero puede filtrar y encadenar operaciones en imágenes, y crear nuevas. Así que estoy bastante seguro de que podría "fusionarse" con un script ImageMagick.
HRJ
1
¡imagemagick es realmente una magia!
Brain90
¿Qué tal usar comparar con AE, pero sin generar una imagen de diferencia?
user643722
6

Esta pregunta fue formulada en 2012 y es 2017. Ahora tenemos el programa de código abierto Beyond Compare para comparar imágenes, y se integra en Nautilus. También hemos tenido Geeqie todo el tiempo para encontrar imágenes similares en una estructura de directorio (recursivamente).

I. Encontrar diferencias de imagen con Beyond Compare

Haga clic en este enlace para descargar los paquetes .deb de Beyond Compare .

Instale el paquete yendo al directorio donde descargó el paquete también y escribiendo: sudo dpkg -i YourPackageName.deb, que en este momento se llama bcompare-4.2.2.22384_amd64.deb , por lo que debe escribir: sudo dpkg -i bcompare- 4.2.2.22384_amd64.deb

Para completar la instalación y hacer que el complemento funcione en Nautilus, deberá cerrar sesión y volver a iniciarla, porque Nautilus se está ejecutando en segundo plano incluso si no lo tiene abierto.

Una vez que está instalado y el complemento funciona correctamente, usted:

  1. Abra Nautilus y busque la primera imagen.
  2. Haga clic con el botón derecho en la primera imagen para abrir el menú contextual y seleccione Seleccionar archivo izquierdo para Comparar / Fusionar
  3. Navega a la segunda imagen
  4. Haga clic con el botón derecho en la segunda imagen y seleccione Comparar con 'NameOfFirstImageFile' donde NameOfFirstImageFile es el nombre del archivo que seleccionó en el paso 2.
  5. Las imágenes se abrirán en Beyond Compare, y se verá así:

Más allá de Comparar comparación de imágenes

II Encontrar imágenes similares / duplicadas con Geeqie

  1. Instale Geeqie al vincular esto en una terminal: sudo apt install geeqie
  2. Abra Geeqie y busque el directorio que desea escanear.
  3. Haga clic con el botón derecho en el nombre del directorio que desea escanear y seleccione Buscar duplicados ... para escanear ese directorio, o seleccione Buscar duplicados recursivos ... para escanear ese directorio y todos los directorios debajo de él.

ingrese la descripción de la imagen aquí

  1. Usando la lista desplegable Comparar por en la esquina inferior izquierda, puede elegir buscar duplicados por suma de verificación, por nombre de archivo o por niveles de similitud. La función de similitud es increíble si recorta, rota o cambia el tamaño de las imágenes, ya no necesita, como muchos de nosotros adquirimos, cuando recortamos / redimensionamos las imágenes para publicarlas en las redes sociales y demás.
SunnyDaze
fuente
0

Terminé con lo siguiente:

~/.gitconfig

Adjuntar

[diff "image"]
    command = simple-imagediff

simple-imagediff

He agregado lo siguiente a ~/.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()
Martin Thoma
fuente