"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.
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.
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'.
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) l
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.)
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):
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.
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