Existe “diff” para imagens?

48

Você pode comparar dois arquivos de texto com muito facilidade com diff e ainda melhor com meld:

Sevocêusaodiffparaimagens,vocêobtémumexemplocomoeste:

$diffzivi-besch.tifzivildienst.tifBinaryfileszivi-besch.tifandzivildienst.tifdiffer

Aquiestáumexemplo:

Originaldo link

Editado:

Eu adicionei um plano de fundo branco a ambas as imagens e apliquei o filtro "Diferença" dos GIMPs para obter isso:

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

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

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

    
por Martin Thoma 30.10.2012 / 10:29

4 respostas

53

Sim, esse programa existe!

ImageMagick tem o utilitário compare , que tem várias maneiras de comparar imagens.

Para instalá-lo:

sudo apt-get install imagemagick imagemagick-doc

Comparando visualmente duas imagens:

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

tux_orig.png & tux_modified.png

Dá esta imagem:

Comparandoduasimagenspormeiodemétricas:

Hátambémmuitasmaneirasdegerarasdiferençaspormeiodealgumasmétricas,porexemplo:

#compare-verbose-metricPSNRtux_orig.pngtux_modified.pngtux_difference.pngtux_orig.pngPNG200x232200x232+0+08-bitsRGB20.6KB0.000u0:00.000tux_modified.pngPNG200x232200x232+0+08-bitsRGB22.2KB0.010u0:00.000Image:tux_orig.pngChanneldistortion:PSNRred:19.5485green:19.5973blue:19.6507alpha:16.1568all:18.4517tux_orig.png=>tux_difference.pngPNG200x232200x232+0+08-bitsRGB12.3KB0.030u0:00.020

Algumasopçõesmétricas:

AEabsoluteerrorcount,numberofdifferentpixels(-fuzzeffected)FUZZmeancolordistanceMAEmeanabsoluteerror(normalized),averagechannelerrordistanceMEPPmeanerrorperpixel(normalizedmeanerror,normalizedpeakerror)MSEmeanerrorsquared,averageofthechannelerrorsquaredNCCnormalizedcrosscorrelationPAEpeakabsolute(normalizepeakabsolute)PSNRpeaksignaltonoiseratioRMSErootmeansquared(normalizedrootmeansquared)

Hámuitasmaneirasdecompararimagens,consulteaseção ImageMagicks em compare para conhecer outros métodos.

    
por phoibos 30.10.2012 / 11:39
5

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

eu. Encontrando diferenças de imagem com o Beyond Compare

Clique neste link para fazer o download dos pacotes Beyond Compare .deb

Instale o pacote indo até o diretório em que você fez o download do pacote e digitando: sudo dpkg -i YourPackageName.deb que neste momento é chamado bcompare-4.2.2.22384_amd64. deb , assim você digitaria: sudo dpkg -i bcompare-4.2.2.22384_amd64.deb

Para concluir a instalação e obter o plug-in para funcionar no Nautilus, você precisará efetuar logout e, em seguida, voltar, porque o Nautilus está sendo executado em segundo plano, mesmo se você não o tiver aberto.

Assim que estiver 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 na primeira imagem para abrir o menu de contexto e selecione Selecionar o arquivo à esquerda para comparar / mesclar
  3. Navegue até a segunda imagem
  4. Clique com o botão direito na segunda imagem e selecione Comparar com 'NameOfFirstImageFile' , em que NameOfFirstImageFile é o nome do arquivo selecionado na etapa 2.
  5. As imagens serão abertas no Beyond Compare, e será algo como isto:

II.EncontrandoImagensSimilares/DuplicadasComGeeqie

  1. InstaleoGeeqieamarrandoissoemumterminal:sudoaptinstallgeeqie
  2. AbraoGeeqieenavegueatéodiretórioquevocêdesejaverificar.
  3. CliquecomobotãodireitodomousenonomedodiretórioquevocêdesejaverificareselecioneLocalizarduplicatas...paraapenasverificaressediretórioouselecioneLocalizarduplicatasrecursivas...paraverificaressediretórioetodososdiretóriossobele.

  • Usando a lista suspensa Comparar por no canto inferior esquerdo, você pode escolher localizar duplicatas por Checksum, por nome de arquivo ou por níveis de similaridade. O recurso de similaridade é incrível se você tiver cortado, girado ou redimensionado imagens, você não precisa mais, como muitos de nós adquirem, quando cortar / redimensionar fotos para postar em mídias sociais e tal.
  • por SunnyDaze 22.07.2017 / 04:57
    3
    1. Existe um comando idiff no pacote openimageio-tools .
    2. Existe um comando perceptualdiff (pacote perceptualdiff ).
    3. Existe o comando uprightdiff (pacote uprightdiff ).
    por Rudolf Dovičín 23.09.2017 / 21:30
    0

    Acabei com o seguinte:

    ~/.gitconfig

    Anexar

    [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()
    
        
    por Martin Thoma 14.04.2017 / 10:51