Jak mogę dokładnie powiedzieć, co zmieniło się między dwoma obrazkami?

28

Na przykład podczas niedawnej rozmowy na temat kompresji JPEG chciałem porównać piksel po pikselu, co zmieniło się między dwoma JPEG (jednym z poziomem kompresji 100, a drugim z poziomem kompresji 95).

Jak wygenerować dobre wizualne mapy tego, co się zmieniło bez żmudnego programowania niestandardowego?

cabbey
źródło
2
Nie przesyłanie tego jako odpowiedzi, ponieważ prawdopodobnie nie jest to realne rozwiązanie dla zdjęć, ale GitHub (strona programisty) ma kilka interesujących sposobów porównywania obrazów: github.com/cameronmcefee/Image-Diff-View-Modes/commit/… Spróbuj kliknąć „2-up”, „Swipe”, „Onion Skin” i „Difference”.
Henrik N

Odpowiedzi:

35

Photoshop + warstwy FTW. (Tak, możesz również użyć Gimp lub dowolnego innego oprogramowania do edycji z tymi samymi funkcjami).

Zacznij od podstawowego obrazu, w powyższym przypadku użyłem obrazu 100 jakości JPEG.

  1. utwórz na nim nową warstwę
  2. wklej drugi obraz do tej warstwy
  3. ustaw styl warstwy na „różnicę” (patrz lewa różowa strzałka na 1. obrazku poniżej)
  4. utwórz warstwę efektu na szczycie tego (Warstwa> Nowa warstwa dopasowania> Próg)
  5. ustaw efekt na próg (patrz różowa strzałka w prawo na 1. zdjęciu poniżej)
  6. ustaw wartość progową na 1

Na powstałym obrazie każdy piksel, który w jakikolwiek sposób różni się między dwoma obrazami, będzie biały. Możesz go dostosować, aby rzeczy były „trochę inne”, zmieniając wartość progową.

Przykład pokazujący DUŻĄ różnicę między JPEG 92 a 100 od Lightroom. porównanie jpeg 92 i 100 z LR z warstwami Photoshop

Przykład pokazujący brak różnicy między 95 a 100. porównanie jpeg 95 i 100 z LR z warstwami Photoshop

Nie chodzi tylko o pokazanie binarnego „zmienionego czy nie”, a co jeśli chcesz uzyskać więcej szczegółów na temat tego, jak bardzo się zmieniło, powiedzmy przez kanał kolorów?

  1. zastąp warstwę dopasowania progu warstwą dopasowania krzywych.
  2. edytuj krzywą
  3. włącz przycinanie pokazu
  4. złap biały wejściowy uchwyt poniżej prawego dolnego rogu i przeciągnij go w lewo, tak daleko, jak to możliwe
  5. powoli cofnij się w prawo, aż nie zobaczysz żadnego przycinania (obraz podglądu jest cały czarny)
  6. wyłącz przycinanie i zapisz zmianę krzywej

Im jaśniejsze wynikowe piksele, tym bardziej różnią się kolorem. Minusem jest jednak to, że kończysz z dużą ilością szarego błota ... więc czasami łatwiej jest po prostu przekroczyć próg, aby zobaczyć, gdzie są różnice. Dlatego buduję oba i przełączam, który z nich jest widoczny.

bardziej opisowy pogląd na różnicę

cabbey
źródło
Pytanie Newb, ale jak zrobić krok 4: „utwórz warstwę efektu na szczycie”? Nigdzie nie mogę go znaleźć. To także 7 lat później i używam najnowszej wersji, być może zmienili też nazwę?
Whitneyland
14

Jeśli używasz Photoshopa, oto jak bym to zrobił:

Umieść dwa pliki JPEG w tym samym pliku psd, na dwóch osobnych warstwach. Powinny nakładać się dokładnie, ponieważ ich wymiary są takie same. (który z nich jest na górze, nie ma znaczenia).

Ustaw tryb mieszania warstw na „Różnica”. Zobaczysz głównie czarny wynik. Zależy od różnicy jakości między dwiema oryginalnymi warstwami, w których może być mniej lub więcej hałasu.

wprowadź opis zdjęcia tutaj

Jin
źródło
Sama różnica tak naprawdę niewiele pomaga, gdy masz taką wielką czarną pustkę. :)
cabbey
@ cabbey na pewno, porównując 100% do 95%, najprawdopodobniej uzyskasz jednolity czarny kolor. Ale o to pytało twoje pytanie, prawda? W odpowiedzi właściciela zmieniasz wartości z porównywanych oryginałów, przez co nie mają już oryginalnych ustawień kompresji.
Jin
Otrzymujesz praktycznie jednolitą czerń na prawie każdym porównaniu, ponieważ różnice są tak małe. Warstwa progu / krzywej po różnicy nie ma wpływu na ustawienia kompresji, a jedynie pomaga w wizualizacji dolnych granic tej czarnej zupy, którą przygotowała różnica. (Nie jestem w 100% pewien, co miałeś na myśli, więc mógłbym tam
pójść
@ cabbey, jeśli pytasz o czysto bitową operację różnicy między dwoma obrazami, to sam tryb mieszania „Różnica” daje to. Po dostosowaniu progu / krzywej wynik jest bardziej widoczny gołym okiem, ale nie jest to dokładne przedstawienie tego, co się zmieniło. Kiedy to robisz, nie porównujesz już 100% do 95%.
Jin
Pewnie, że jesteś. Poziom kompresji przestał mieć znaczenie, gdy drugi Photoshop załadował obraz z dysku do jego wewnętrznych buforów, jest to teraz nieskompresowana tablica pikseli w pamięci ... jeśli te piksele dostały się tam, ponieważ obraz miał kwadratową kroplę lub ponieważ są artefaktem poziomu kompresji nie ma znaczenia.
cabbey
13

Wszystkie pakiety przetwarzania obrazu powinny to ułatwić. Pokażę ci, jak to zrobić w Mathematica, jeśli masz dostęp do tego systemu. Mathematica jest językiem programowania, ale naprawdę łatwo jest wykonywać tego rodzaju manipulacje, więc jeśli masz do niego dostęp (np. Za pośrednictwem licencji witryny uniwersyteckiej), polecam spróbować!

Najpierw zaimportuj obraz:

img = Import["http://farm1.staticflickr.com/62/171463865_36ee36f70e.jpg"]

Ponownie skompresuj go za pomocą kompresji JPEG

img2 = ImportString@ExportString[img, "JPEG", "CompressionLevel" -> 0.35]

Grafika matematyczna

Teraz weź różnicę wartości pikseli, konwertując je najpierw na liczby zmiennoprzecinkowe, aby zapewnić zachowanie wartości ujemnych.

diff = ImageSubtract[Image[img, "Real"], Image[img2, "Real"]]

Grafika matematyczna

Na obrazie różnicy niewiele widać (różnica jest niewielka), a wartości ujemne są przycinane na czarno. Przeskalujmy więc wszystkie wartości, aby wypełnić cały zakres dynamiczny (minimum zostanie przeskalowane do 0, maksimum do 1):

ImageAdjust[diff]

Grafika matematyczna

ImageDifferencedaje absolutną różnicę między dwoma obrazami i nie wytwarza liczb ujemnych. Jest to operacja, którą częściej można znaleźć w pakietach do przetwarzania obrazów, szczególnie w GUI (Photoshop, GIMP).

ImageDifference[img, img2]

Grafika matematyczna

Możemy również wziąć pojedynczy kanał RGB, na przykład czerwony, i wizualizować pozytywne i negatywne różnice za pomocą „przeciwnych” kolorów:

ArrayPlot[0.5 + ImageData[First@ColorSeparate[diff, "Red"]], 
 ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]

Grafika matematyczna

Oto to samo, z różnicami powiększonymi 5 razy. Artefakty JPEG są teraz bardziej rozpoznawalne.

ArrayPlot[0.5 + 5 ImageData[First@ColorSeparate[diff, "Red"]], 
 ColorFunction -> "RedGreenSplit", ColorFunctionScaling -> False]

Grafika matematyczna

Zaletą używania języka programowania jest to, że możemy go łatwo zautomatyzować i zobaczyć, jak zmienia się różnica dla „poziomów kompresji” między 0,1 a 1,0:

Grid@Partition[Table[
   ArrayPlot[
    0.5 + ImageData[
      First@ColorSeparate[
        ImageSubtract[Image[img, "Real"], 
         Image[ImportString@
           ExportString[img, "JPEG", "CompressionLevel" -> c], 
          "Real"]], "Red"]], ColorFunction -> "RedGreenSplit", 
    ColorFunctionScaling -> False],
   {c, 0.1, 1, 0.1}
   ], 5]

Grafika matematyczna

Szabolcs
źródło
Zawsze dobrze jest widzieć opcję skryptową / automatyczną! :)
jrista
5

Możesz użyć narzędzi wiersza poleceń Imagemagick.

composite imagesrc1.jpg imagesrc2.jpg -compose difference diffs.jpg

zapewni bezwzględną wartość różnic dla każdego kanału RGB.

Mikael
źródło
0
  1. Otwórz jeden z obrazów w GIMP lub Photoshopie.
  2. Dodaj drugi obraz jako nową warstwę na pierwszym.
  3. Ustaw tryb mieszania górnej warstwy na „Różnica”

Na powstałym obrazie czarne części pokazują, gdzie oryginalne obrazy są identyczne, a wszystko jaśniejsze pokazuje różnice.

Dan
źródło
Sama różnica tak naprawdę niewiele pomaga, gdy masz taką wielką czarną pustkę. :)
cabbey
Zawsze możesz dostosować poziomy na wynikowym obrazie. Ilekroć korzystałem z tej techniki, miałem zdjęcia na tyle różne, aby móc zobaczyć zmiany :)
Dan