Existe "diff" para imagens?

51

Você pode comparar dois arquivos de texto com muito facilidade diffe ainda melhor com o meld:

fusão de exemplo

Se você usa diff para imagens, obtém um exemplo como este:

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

Aqui está um exemplo:

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

Imagem original

Editado:

editado

Adicionei um plano de fundo branco às imagens e apliquei o filtro "Diferença" do GIMPs para obter isso:

diferença

É um método muito simples de como um diff pode funcionar, mas posso imaginar métodos muito melhores (e mais complicados).

Você conhece um programa que funciona para imagens, como o meld faz para textos?

(Se existisse um programa que pudesse fornecer uma porcentagem (0% da mesma imagem - 100% da mesma imagem), eu também estaria interessado, mas estou procurando por um que me dê dicas visuais sobre onde estão as diferenças.)

Martin Thoma
fonte
Parece que você está vinculando a uma imagem SVG. Na verdade, é um texto XML válido. O mesmo não se aplica a outros formatos de imagem.
ζ--
related: stackoverflow.com/questions/5132749/…
Ciro Santilli escreveu:

Respostas:

58

Sim, esse programa existe!

O ImageMagick possui o compareutilitário, que possui várias maneiras de comparar imagens.

Para instalá-lo:

sudo apt-get install imagemagick imagemagick-doc

Comparando duas imagens visualmente:

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

tux_orig.png & tux_modified.png

tux_orig.png tux_modified.png

Dá esta imagem:

A diferença de imagem

Comparando duas imagens por métricas:

Existem também várias maneiras de gerar diferenças através de algumas métricas, por exemplo:

# 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

Algumas opções de 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)

Existem várias maneiras de comparar imagens, consulte a seção ImageMagicks em comparação para obter outros métodos.

phoibos
fonte
Existe uma maneira de mesclar? Ou consertar a diferença no original para obter o alvo?
CMCDragonkai
@CMCDragonkai ImageMagick é muito poderoso. Não sei a invocação exata, mas você pode filtrar e encadear operações em imagens e criar novas. Então, eu tenho certeza que você pode "mesclar" com um script ImageMagick.
HRJ 20/07
11
imagemagick é realmente uma mágica!
precisa saber é o seguinte
Que tal usar comparar com AE, mas sem gerar uma imagem de diferença?
user643722
6

Esta pergunta foi feita em 2012 e é 2017. Agora, temos o programa Beyond Compare, de código não aberto, para comparar imagens, e ele se integra ao Nautilus. Também tivemos o Geeqie o tempo todo para encontrar imagens semelhantes em toda a estrutura de diretórios (recursivamente).

I. Encontrar diferenças de imagem com além da comparação

Clique neste link para baixar os pacotes .deb do Beyond Compare .

Instale o pacote indo para o diretório em que você baixou o pacote também e digitando: sudo dpkg -i YourPackageName.deb, que neste momento é chamado bcompare-4.2.2.22384_amd64.deb , para que você digite: sudo dpkg -i bcompare- 4.2.2.22384_amd64.deb

Para concluir a instalação e fazer com que o plug-in funcione no Nautilus, será necessário fazer logoff e, em seguida, entrar novamente, porque o Nautilus está sendo executado em segundo plano, mesmo que você não o abra.

Depois de instalado e o plug-in estiver funcionando corretamente, você:

  1. Abra o Nautilus e navegue até a primeira imagem
  2. Clique com o botão direito do mouse na primeira imagem para abrir o menu de contexto e selecione Selecionar arquivo esquerdo para comparar / mesclar
  3. Navegue para a segunda imagem
  4. Clique com o botão direito do mouse na segunda imagem e selecione Comparar com 'NameOfFirstImageFile' onde NameOfFirstImageFile é o nome do arquivo que você selecionou na etapa 2.
  5. As imagens serão abertas no Beyond Compare e ficarão assim:

Além da comparação de imagens de comparação

II Localizando imagens semelhantes / duplicadas com o Geeqie

  1. Instale o Geeqie amarrando-o em um terminal: sudo apt install geeqie
  2. Abra o Geeqie e navegue até o diretório que você deseja verificar.
  3. Clique com o botão direito do mouse no nome do diretório que você deseja verificar e selecione Localizar duplicatas ... para verificar apenas esse diretório ou selecione Localizar duplicatas recursivas ... para verificar esse diretório e todos os diretórios abaixo dele.

insira a descrição da imagem aqui

  1. Usando a lista suspensa Comparar por no canto inferior esquerdo, você pode optar por encontrar duplicatas por soma de verificação, nome de arquivo ou níveis de similaridade. O recurso de similaridade é incrível se você cortou, girou ou redimensionou imagens, não precisa mais, como muitos de nós adquirimos, quando cortamos / redimensionamos fotos para postar nas mídias sociais e tal.
SunnyDaze
fonte
0

Acabei com o seguinte:

~/.gitconfig

Acrescentar

[diff "image"]
    command = simple-imagediff

simple-imagediff

Adicionei o seguinte 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
fonte