"Diff" obraz za pomocą ImageMagick

Jak mogę uzyskać różnicę między dwoma obrazami? Mam oryginalny obraz. Ktoś napisał na dokładnym duplikacie oryginalnego obrazu. Teraz muszę porównać oryginał z zapisanym na obrazie i wyodrębnić tylko zapis w formacie obrazu.

Przykład: mam zdjęcie domu. Ktoś wziął kopię i napisał " Hello!"na kopii. Chcę jakoś porównać dwa zdjęcia, usunąć Dom i zostać z obrazem słów " Hello!".

Czy jest to możliwe z ImageMagick? Wiem, że istnieją sposoby, aby uzyskać statystyczną różnicę między obrazami, ale nie tego Szukam.

Author: MvG, 2011-02-27

2 answers

Moje Ulubione to te dwa:

 compare image1 image2 -compose src diff.png
 compare image1 image2 -compose src diff.pdf

Jedyna różnica między dwoma powyższymi poleceniami: pierwsza pokazuje wizualną różnicę między dwoma obrazami w pliku PNG, druga w formacie PDF.

Wynikowy plik diff wyświetla wszystkie piksele, które różnią się kolorem czerwonym. Te, które są niezmienione, wydają się białe.

Krótko i słodko.

Uwaga, Twoje obrazy potrzebują nie bądź tego samego typu. Można nawet mieszać JPEG, TIFF, PNG -- pod jeden warunek: obrazy powinny mieć ten sam rozmiar (wymiar obrazu w pikselach). Format wyjściowy zależy od rozszerzenia nazwy pliku wyjściowego.

Jeśli z jakiegoś powodu potrzebujesz wyższej rozdzielczości niż domyślna (72 dpi) -- wystarczy dodać odpowiedni parametr -density:

 compare -density 300 image1 image2 -compose src diff.jpeg

Ilustrowane przykłady

Oto kilka ilustracji wyników dla wariacji powyższego polecenia. Uwaga: porównane dwa pliki były nawet PDF pliki, więc to działa z nimi zbyt (o ile są one 1-pagery)!


Po Lewej: obraz z tekstem Center: oryginalny obraz Right: różnice (=tekst) w czerwonych pikselach. Tylko czerwone piksele różnicy; identyczne piksele są białe

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -compose src \
        diff-compose-default.pdf

Jest to ta sama Komenda, którą zaproponowałem wcześniej.


Left: Image with text Center: Original image Right: różnice w pikselach 'seagreen'. Seagreen różnica pikseli tylko; identyczne piksele są białe

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -compose src \
       -highlight-color seagreen \
        diff-compose-default.pdf

To polecenie dodaje parametr, aby różnica pikseli "seagreen" zamiast domyślnego czerwonego.


Left: Image with text Center: Original image Right: Blue diffs (but W. some context background) Tylko niebieskie piksele różnicy; pierwszy z porównywanych obrazów jako rozjaśnione tłol

compare \
        porsche-with-scratch.pdf  porsche-original.pdf \
       -highlight-color blue \
        diff-compose-default.pdf

To polecenie usuwa część -compose src -- rezultatem jest domyślne zachowanie compare, które zachowuje jako rozjaśnione tło pierwszy z dwóch różnych obrazów. (Tym razem z dodanym parametrem, aby piksele diff pojawiały się w niebieski.)

 273
Author: Kurt Pfeifle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-26 18:52:29

Podczas gdy compare sprawdza się w wielu aplikacjach, odkryłem, że czasami wolę inne podejście, szczególnie podczas porównywania obrazów, które są w większości w skali szarości:

convert '(' file1.png -flatten -grayscale Rec709Luminance ')' \
        '(' file2.png -flatten -grayscale Rec709Luminance ')' \
        '(' -clone 0-1 -compose darken -composite ')' \
        -channel RGB -combine diff.png

Idea jest następująca: Konwertuj zarówno file1.png, jak i file2.png na skalę szarości. Następnie trat pierwszy jako czerwony kanał wynikowego obrazu, drugi jako zielony kanał. Kanał niebieski powstaje z tych dwóch za pomocą operatora darken compose, co zasadniczo oznacza wzięcie minimum.

Więc rzeczy które są białe na obu zdjęciach pozostają białe. Rzeczy, które są czarne na obu obrazach, pozostają czarne. Rzeczy, które są białe w pierwszym obrazie, ale czarne w drugim zmienia kolor na czerwony, a rzeczy, które są białe w drugim, ale czarne w pierwszym zmienia kolor na zielony.

Wynik daje ładnie zakodowany kolorowy obraz, na którym można łatwo skojarzyć zielony z pierwszym wejściem i czerwony z drugim. Oto przykład, w którym używam tego do porównania wyjścia z lateksu z tym z KaTeX (before I fixed some bug to make this better):

Tutaj wpisz opis obrazka

Możesz połączyć podejścia, używając compare aby zobaczyć gdzie coś się zmieniło, a następnie używając powyższego, aby zobaczyć bardziej szczegółowo Jak to się zmieniło.

 42
Author: MvG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-16 12:23:46