„Porównaj” obraz za pomocą ImageMagick

178

Jak uzyskać różnicę między dwoma obrazami? Mam oryginalny obraz. Ktoś napisał na dokładnej kopii 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ł „Cześć!” na kopii. Chcę w jakiś sposób porównać dwa zdjęcia, usunąć dom i zostać z obrazem ze słowami „Hello!”.

Czy jest to możliwe dzięki ImageMagick? Wiem, że istnieją sposoby na uzyskanie statystycznej różnicy między obrazami, ale nie tego szukam.

Justin Noel
źródło
8
Wypróbuj tę sekcję przewodnika użytkowania programu ImageMagick!
Benoit,
1
Wiem, że to pytanie dotyczy ImageMagick, ale musiałem po prostu dołączyć link do Resemble.js dla „przyczynowego” wyszukiwania, który może poszukiwać agnostycznego rozwiązania.
brichins 30.07.15
Czy ktoś zna narzędzie, które będzie porównywać 2 obrazy, odejmując piksele drugiego obrazu od pierwszego? Wolałbym nie pisać własnych.
MarcusJ
Imagemagick 7 ma percepcyjny hash, technikę wykorzystującą niezmienne momenty obrazu. jest fajny w tym sensie, że haszuje to samo nawet po obróceniu, zniekształceniu beczkowatym, zmianie rozmiaru, zmianie gamma, wprowadzeniu szumu, znaku wodnym ...
v.oddou
1
@ v.oddou, dzięki. Przeczytałem dokumenty i zrobiłem kilka więcej testów. Wydaje się, że działa źle w przypadku rysunków liniowych, które są bardzo rzadko zapełnione i mają wyjątkowo małą gęstość pikseli. Wygląda na to, że gęstość pikseli jest kluczem do identyfikacji podobieństwa w PHASH.
BReddy

Odpowiedzi:

320

Moimi ulubionymi są 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: pierwsze pokazuje wizualną różnicę między dwoma obrazami jako plik PNG, a drugie jako plik PDF.

Wynikowy plik różnicowy wyświetla wszystkie piksele, które różnią się kolorem czerwonym. Te niezmienione wyglądają na białe.

Krótkie i słodkie.

Uwaga, Twoje obrazy nie muszą być tego samego typu. Możesz nawet mieszać pliki JPEG, TIFF, PNG - pod jednym warunkiem: obrazy powinny mieć ten sam rozmiar (wymiary obrazu w pikselach). Format wyjściowy jest określany przez rozszerzenie nazwy pliku wyjściowego.

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

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

Ilustrowane przykłady

Oto kilka ilustracji wyników dla odmian powyższego polecenia. Uwaga: dwa porównywane pliki były nawet plikami PDF , więc działa również z nimi (o ile są 1-stronicowe)!


Po lewej: obraz z tekstem       Środek: obraz oryginalny Po       prawej: różnice (= tekst) w czerwonych pikselach. Tylko czerwone piksele różnicowe;  identyczne piksele są białe

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

To jest to samo polecenie, które zasugerowałem wcześniej.


Po lewej: obraz z tekstem       Środek: obraz oryginalny Po       prawej: różnice w pikselach „seagreen”. Tylko piksele różnicowe Seagreen;  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 powodujący, że piksele różnicy będą „zielone” zamiast domyślnego czerwonego.


Po lewej: Obraz z tekstem       Środek: Obraz oryginalny Po       prawej: Niebieskie różnice (ale z pewnym tłem kontekstowym) Tylko niebieskie piksele różnicowe;  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 -compose srcczęść - w wyniku tego domyślne zachowanie comparezachowuje jako rozjaśnione tło pierwszy z dwóch rozróżnionych obrazów. (Tym razem z dodanym parametrem sprawiającym, że piksele diff są wyświetlane na niebiesko).

Kurt Pfeifle
źródło
Nie jestem w stanie zrozumieć, skąd wzięło się to porównanie cli? Czy to część cegieł graficznych? dostępne w systemie Windows?
Krishnom
2
@Krishnom: Nie ma czegoś takiego jak „imagebrick”. Masz na myśli ImageMagick?
Kurt Pfeifle
2
@Krishnom: Pytanie wprost zadane na temat rozwiązania ImageMagick. Część pakietu oprogramowania ImageMagick v6.x miała oddzielne narzędzie CLI o nazwie 'compare'. W przypadku wersji 7.x programu ImageMagick należy 'magick compare'zamiast tego uruchomić .
Kurt Pfeifle
Mój błąd. Dzięki za poprawienie tego (imagebrick -> imageMagick). Spróbuję. Szukam również narzędzia do porównywania obrazów zbiorczych.
Jeszcze
@Krishnom: Nie wiem, co to jest „obraz zbiorczy”. Ale nadal założę się, że pakiet narzędzi ImageMagick może robić, co chcesz.
Kurt Pfeifle
53

Chociaż comparedobrze radzi sobie z wieloma aplikacjami, odkryłem, że czasami wolę inne podejście, szczególnie podczas porównywania obrazów, które są głównie 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

Pomysł jest następujący: przekonwertuj oba file1.pngi file2.pngna skalę szarości. Następnie potraktuj pierwszy jako czerwony kanał wynikowego obrazu, a drugi jako zielony kanał. Niebieski kanał jest tworzony z tych dwóch za pomocą darkenoperatora tworzenia, co w zasadzie oznacza przyjmowanie minimum.

Zatem rzeczy, które są białe na obu obrazach, pozostają białe. Rzeczy, które są czarne na obu obrazach, pozostają czarne. Rzeczy, które są białe na pierwszym obrazie, ale czarne na drugim, zmieniają kolor na czerwony, a rzeczy, które są białe na drugim, ale czarne na pierwszym, zmieniają kolor na zielony.

W rezultacie otrzymujesz ładnie zakodowany kolorami obraz, w którym możesz łatwo skojarzyć kolor zielony z pierwszym wejściem, a czerwony z drugim. Oto przykład, w którym używam tego do porównania danych wyjściowych z LaTeX z tymi z KaTeX (zanim naprawiłem jakiś błąd, aby to poprawić):

wprowadź opis obrazu tutaj

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

MvG
źródło
2
Miły! Potrzebowałem interakcji, więc powtórzyłem twoją metodę w Gimp. Dla porównania: 1) załaduj obrazy jako warstwy, 2) Kolor -> Usuń nasycenie obu warstw, 3) usuń kanały alfa z obu warstw na karcie Warstwy, 4) wybierz kanały G + B na jednej warstwie, zaznacz wszystkie i wyczyść kanały kolorem czarnym, to samo z kanałami R + B na drugiej warstwie, 4) ustaw Tryb ekranu dla górnej warstwy w zakładce Warstwy.
Matěj Šmíd
1
@Palmstrom: Dzięki! Początkowo robiłem te porównania obrazów za pomocą Gimpa, ale zrobiłem to używając trybu warstwy „ekstrakt z ziarna” bezpośrednio na obrazach wejściowych, więc wspólne obszary byłyby szare, podczas gdy różnica byłaby czarna w jednym kierunku i biała w drugim . Trudniejszy do odczytania, ale szybszy do wygenerowania i może zawierać informacje o kolorach. Wydaje mi się, że można by jeszcze dokładniej dopasować moje polecenie, gdybyśmy użyli „tylko przyciemnienia” zamiast „ekranu” i pomalowali nieużywane kanały na biały zamiast czarnego.
MvG
1
Niektóre dane wejściowe PDF z jakiegoś powodu powodują odwrócenie obrazu po konwersji w skali szarości. Używanie -colorspace grayzamiast -grayscale Rec709Luminancenaprawia to, ale to psuje kompozycję. Dodaj -respect-parenthesesjako pierwszą opcję, aby convertsię tym zająć.
Brecht Machiels
Oto skrypt do wizualnego porównywania dwóch plików PDF strona po stronie przy użyciu tej metody: gist.github.com/brechtm/891de9f72516c1b2cbc1 . Wyprowadza jeden plik JPG dla każdej strony plików PDF w pdfdiffkatalogu i dodatkowo drukuje numery stron, które różnią się między dwoma plikami PDF.
Brecht Machiels
1
W ImageMagick v6.7.7-10 wygląda na to, że -grayscalenie jest obsługiwany, musiałem użyć -colorspace grayzgodnie z sugestią
@BrechtMachiels