이미지에 "diff"가 있습니까?


51

diffmeld를 사용하면 두 개의 텍스트 파일을 매우 쉽고 쉽게 비교할 수 있습니다 .

멜드 예

이미지에 diff를 사용하면 다음과 같은 예가 나타납니다.

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

예를 들면 다음과 같습니다.

http://commons.wikimedia.org/wiki/File:Tux.svg의 원본

원본 이미지

편집 :

편집

이미지에 흰색 배경을 추가하고 김프 "차이"필터를 적용하여이 결과를 얻었습니다.

차이

diff가 작동하는 방법은 매우 간단한 방법이지만 훨씬 더 (더 복잡한) 것을 상상할 수 있습니다.

meld가 텍스트에 사용하는 것과 같은 이미지에 작동하는 프로그램을 알고 있습니까?

(비율을 줄 수있는 프로그램이 존재하면 (동일한 이미지 0 %-동일한 이미지 100 %) 관심이 있지만 차이점이있는 시각적 힌트를 제공하는 프로그램을 찾고 있습니다.)


SVG 이미지에 연결되어있는 것 같습니다. 실제로 유효한 XML 텍스트입니다. 다른 이미지 형식도 마찬가지입니다.
ζ--

답변:


57

예, 그러한 프로그램이 존재합니다!

ImageMagick 에는 compare여러 가지 이미지 비교 방법 이있는 유틸리티가 있습니다.

설치하려면 :

sudo apt-get install imagemagick imagemagick-doc

두 이미지를 시각적으로 비교 :

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

tux_orig.png & tux_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

@CMCDragonkai ImageMagick은 매우 강력합니다. 정확한 호출을 모르지만 이미지에서 작업을 필터링하고 연결하여 새 것을 만들 수 있습니다. 따라서 ImageMagick 스크립트와 "병합"할 수 있다고 확신합니다.
HRJ

1
imagemagick은 정말 마술입니다!
Brain90

차이 이미지를 생성하지 않고 AE와 비교를 사용하는 것은 어떻습니까?
user643722

6

이 질문은 2012 년에 다시 제기되었으며 2017 년입니다. 이제 이미지를 비교 하기 위해 비 오픈 소스 프로그램 Beyond Compare 프로그램이 있으며 노틸러스에 통합됩니다. 또한 디렉토리 구조 전체에서 유사한 이미지를 찾기 위해 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

노틸러스에서 설치를 완료하고 플러그인을 작동 시키려면 노틸러스가 열려 있지 않아도 백그라운드에서 실행 중이므로 로그 아웃 한 다음 다시 로그인해야합니다.

일단 설치되고 플러그인이 제대로 작동하면 다음을 수행하십시오.

  1. 노틸러스를 열고 첫 번째 이미지로 이동
  2. 첫 번째 이미지를 마우스 오른쪽 단추로 클릭하여 상황에 맞는 메뉴를 표시하고 비교 / 병합을 위해 왼쪽 파일 선택을 선택하십시오.
  3. 두 번째 이미지로 이동
  4. 두 번째 이미지를 마우스 오른쪽 단추로 클릭하고 '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

간단한 이미지

나는 다음을 추가했다 ~/.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.