Przez lata wierzyłem, że wielokrotne kompresowanie plików JPEG stopniowo pogorszy jego jakość, dopóki nie staną się nierozpoznawalnym bałaganem, tak jak robi to kserokopie kserokopii. To intuicyjnie ma sens, ponieważ JPEG jest formatem stratnym. Istnieją również inne pytania i odpowiedzi, które twierdzą, że tak jest:
Jaka jakość obrazu jest tracona podczas ponownego zapisywania obrazu JPEG w MS Paint?
Czy samo otwarcie i zamknięcie pliku JPEG obniża jakość obrazu?
Jednak przeczytałem również, że ponowne skompresowanie plików JPEG na tym samym poziomie jakości nie pogorszy jakości obrazu. Jest to sprzeczne ze stopniową degradacją opisaną w innym miejscu.
Co technicznie dzieje się po ponownej kompresji JPEG? Co ginie i jak? Czy obraz naprawdę zmieni się w śnieżny bałagan, który pojawiał się w telewizji? Co z filmami pokazującymi obrazy, które rozpadają się po wielokrotnym skompresowaniu?
(Proszę nie tylko falować ręką i odwoływać się do ogólnej koncepcji stratności).
(To pytanie oraz dotychczasowe odpowiedzi skupiają się na czynnikach technicznych (określone ustawienia i manipulacje obrazem), które powodują lub zapobiegają degradacji obrazu, gdy plik JPEG jest wielokrotnie kompresowany .)
źródło
Odpowiedzi:
Prawie wszystkie straty jakości obrazu występują przy pierwszej kompresji obrazu jako JPEG. Bez względu na to, ile razy JPEG jest ponownie kompresowany przy tych samych ustawieniach , straty pokoleniowe są ograniczone do błędu zaokrąglenia.
Granice MCU pozostają nienaruszone (bloki 8x8).
Podpróbkowanie kolorów jest wyłączone.
Stały DQT (to samo ustawienie jakości).
Jednak błędy zaokrąglania mogą być duże dla każdej iteracji, w której powyższe kryteria nie są spełnione, i rozsądne jest przechowywanie kopii zapasowych wszystkich oryginalnych plików.
Algorytm kompresji JPEG
Konwertuj przestrzeń kolorów. W razie potrzeby zmniejsz informacje o kolorze (podpróbkowanie kolorów) (Lossy) . Jeśli próbkowanie nie zostanie zmniejszone, utrata informacji jest wynikiem błędu zaokrąglania .
Segmentacja. Podziel każdy kanał na bloki 8x8 (MCU = Minimalna jednostka kodująca). (Bezstratny)
Uwaga: Jeśli włączone jest podpróbkowanie barwy, MCU mogą efektywnie mieć wymiary 16 x 8, 8 x 16 lub 16 x 16, jeśli chodzi o oryginalny obraz. Jednak MCU to nadal wszystkie bloki 8x8.
Dyskretna transformacja kosinusowa (DCT) na każdym MCU. Utrata informacji jest wynikiem błędu zaokrąglania .
Kwantyzacja. Wartość w każdej komórce MCU jest podzielona przez liczbę określoną w tabeli kwantyzacji (DQT). Wartości są zaokrąglane w dół, z których wiele stanie się zero. Jest to pierwotna stratna część algorytmu.
Skanowanie Zig-Zag. Zmień kolejność wartości w każdym MCU na sekwencję liczb zgodną ze wzorem zygzakowatym. Zera występujące podczas kwantyzacji zostaną zgrupowane razem. (Bezstratny)
DPCM = Różnicowa modulacja impulsów. Przekształć sekwencje liczb w formę łatwiejszą do kompresji. (Bezstratny)
RLE = Kodowanie długości przebiegu. Kolejne zera są kompresowane. (Bezstratny)
Kodowanie Entropii / Huffmana. (Bezstratny)
Ponowna kompresja plików JPEG
Pamiętaj, że próbkowanie w dół kanałów kolorów i kwantyzacja są jedynymi celowo stratnymi krokami . Pomijając błąd zaokrąglania na razie, wszystkie pozostałe kroki są bezstratne. Po wystąpieniu kwantyzacji odwrócenie i powtórzenie kroku daje identyczne wyniki. Innymi słowy, ponowna kwantyzacja (przy tym samym DQT) jest bezstratna .
Zasadniczo możliwe jest utworzenie algorytmu ponownego próbkowania, który po pierwszym przejściu będzie bezstratny. Jednak dzięki implementacji w ImageMagick kolory mogą drastycznie przesuwać się przed osiągnięciem stanu ustalonego, jak widać na zdjęciu.
Biorąc pod uwagę optymalne warunki, ponowne skompresowanie pliku JPEG przy tych samych ustawieniach jakości skutkowałoby dokładnie tym samym plikiem JPEG. Innymi słowy, ponowna kompresja plików JPEG jest potencjalnie bezstratna . W praktyce ponowne kompresowanie plików JPEG nie jest bezstratne, ale podlega i jest ograniczone błędem zaokrąglania. Chociaż błędy zaokrąglania często w końcu zbiegają się do zera , tak że odtworzony zostaje dokładnie ten sam obraz, podpróbkowanie kolorów może spowodować znaczące zmiany kolorów.
Demonstracja (to samo ustawienie jakości)
Napisałem następujący
bash
skrypt, który używa ImageMagick do wielokrotnej kompresji pliku JPEG przy danym ustawieniu jakości:Po kilkuset iteracjach uruchomiłem
md5sum
wyniki:Widzimy, że w rzeczywistości błąd zaokrąglenia zbliżył się do zera, a ten sam obraz jest odtwarzany w kółko .
Powtórzyłem to wiele razy z różnymi ustawieniami zdjęć i jakości. Zwykle osiągany jest stan ustalony, a dokładnie ten sam obraz jest odtwarzany w kółko.
Co z wynikami @ mattdm ?
Próbowałem zreplikować wyniki mattdm przy użyciu Imagemagick na Ubuntu 18.04. Oryginał był surową konwersją do TIFF w Rawtherapee, ale wydaje się, że nie jest już dostępny. Zamiast tego wziąłem powiększoną wersję i zmniejszyłem ją do pierwotnego rozmiaru (256x256). Następnie wielokrotnie kompresowałem w 75, aż do uzyskania konwergencji. Oto wynik (oryginał, 1, n, różnica):
Moje wyniki są różne. Bez prawdziwego oryginału nie można ustalić przyczyny różnicy.
Co z montażem @ ths ?
Ponownie skompresowałem obraz od lewego górnego rogu montażu do zbieżności na 90. Oto wynik (oryginał, 1, n, różnica):
Po włączeniu podpróbkowania barwy kolory zmieniają się do momentu osiągnięcia stanu ustalonego.
Przełączanie między niewielką liczbą ustawień
Zmieniając zmienną
q2
, ustawienie jakości można ograniczyć do zestawu równomiernie rozłożonych wartości.W przypadku niewielkiej liczby wyborów ustawień równowaga może ostatecznie zostać osiągnięta , co widać, gdy wartości md5 zaczynają się powtarzać. Wydaje się, że im większy zestaw, tym dłużej to trwa i tym gorszy staje się obraz, zanim można osiągnąć równowagę.
W równowadze wydaje się, że współczynnik DCT przed kwantyzacją musi być podzielny na wszystkie (lub większość) wartości kwantowych. Na przykład, jeśli przełączasz się między dwoma DQT, w których współczynnik DCT jest dzielony naprzemiennie przez 3 i 5, równowaga zostanie osiągnięta, gdy współczynnik DCT jest podzielny przez 15. To wyjaśnia, dlaczego spadek jakości jest znacznie większy niż różnica między oryginalnymi ustawieniami.
Zmiana spośród większej liczby ustawień
Kłapouchy nie jest szczęśliwy, kiedy
q2
jest zmieniany w taki sposób:Aby zrobić wideo, użyj
ffmpeg
:Oglądanie pierwszych 9999 iteracji jest prawie jak oglądanie wrzenia wody. Może chcesz podwoić prędkość odtwarzania. Oto Kłapouchy po iteracjach 11999:
Co się stanie, jeśli zmienią się granice MCU?
Jeśli zmiany wystąpią ograniczoną liczbę razy, wielokrotne ponowne kompresowanie prawdopodobnie osiągnie stan ustalony. Jeśli zmiany wystąpią przy każdej iteracji, obraz prawdopodobnie ulegnie degradacji w sposób podobny do zmian DQT.
Co z edycją?
Efekt ponownej kompresji po edycji zależy od konkretnej wykonanej edycji. Na przykład zapisanie tego samego ustawienia jakości po zmniejszeniu artefaktów JPEG przywróciłoby te same artefakty. Jednak zastosowanie zlokalizowanej zmiany, takiej jak pędzel korygujący, nie wpłynie na obszary, które nie zostały dotknięte.
Największy spadek jakości obrazu występuje przy pierwszej kompresji pliku przy danym ustawieniu jakości. Następnie ponowne skompresowanie z tym samym ustawieniem nie powinno wprowadzać żadnych zmian większych niż błąd zaokrąglania. Spodziewałbym się więc, że cykle edycji-ponownego zapisywania przy danym ustawieniu jakości będą wyglądały jak każdy inny obraz zapisany z tym samym ustawieniem jakości (o ile granice MCU pozostaną nienaruszone, a podpróbkowanie barwy jest wyłączone ).
Co z tymi filmami?
Wadliwa implementacja JPEG? ( Ponowne oszczędzanie 500 razy w Photoshopie w 10/12. )
Zmiana ustawień jakości. (Większość filmów).
Zakłócanie granic MCU. (Kadrowanie lub obracanie )
Inne manewry, które obniżają jakość obrazu lub zakłócają algorytm JPEG?
Czy mogę nadpisywać oryginały przy pomocy skompresowanych plików JPEG?
Rozsądne jest przechowywanie kopii zapasowych wszystkich oryginalnych plików, ale jeśli przypadkowo nadpiszesz jeden, uszkodzenie jest prawdopodobnie ograniczone. Byłoby również dobrze pracować w formacie JPEG z wyłączonym podpróbkowaniem barwy.
JPEG nie może być używany w przypadku obrazów, które używają więcej niż 8 bitów na kolor.
źródło
Utrata rekompresji jest realna, szczególnie podczas pracy z wyższymi poziomami kompresji JPEG.
Teoretycznie, jeśli ponownie zapiszesz pliki JPEG o dokładnie takich samych parametrach i dopasujesz przycięcie do bloków 8 × 8, degradacja powinna być minimalna. Jeśli jednak używasz wysokiego poziomu kompresji, zobaczysz dalszą utratę, ponieważ artefakty wprowadzone przez kompresję początkową są trwałymi zmianami obrazu i również zostaną ponownie skompresowane, powodując więcej artefaktów.
Jeśli ponownie zapiszesz z niskim poziomem kompresji (wysoka jakość, np. „100” w Gimpie lub 11 lub 12 w Photoshopie), wszelkie nowo dodane artefakty będą trudne do zauważenia. To nie sprawi, że obraz dowolnego lepiej , ale nie znacznie gorzej. Jednak to będzie wprowadzić zmiany w całym obrazie.
Jako szybki test użyłem ImageMagick do ponownej kompresji obrazu JPEG w 75%. Poniższe próbki są przesyłane jako pliki PNG, aby uniknąć dalszej ponownej kompresji, i zostały podwojone, gdy przekonwertowałem na PNG, aby efekt był bardziej widoczny. (Oryginały użyte w teście nie zostały podwojone.) Okazuje się, że po ośmiu próbkach efekt zbiegał się w idealnie stabilny wynik, przy czym ponowna kompresja skutkuje identycznym plikiem bit po bicie.
Oto nieskompresowany oryginał:
Oto wynik przejścia na 75% JPEG:
A oto, co uratowało:
Ten jednosekundowy zapis powoduje znaczną dodatkową degradację!
A oto ostatni zbiegły się obraz (8. przejście):
Ponownie, kolory są zdecydowanie bardziej ubogie, w tym niektóre fałszywe wzory kolorów, a blokowe artefakty wyskakują jeszcze bardziej. Algorytm jest zbieżny, ale do wersji znacznie zdegradowanej. Więc nie rób tego.
Ale to samo z poziomem jakości 99%, po 9 przejściach (punkt, w którym zbiega się, aby kolejne przejścia były identyczne):
Tutaj różnica ledwo się rejestruje. (Mam na myśli to dosłownie; porównaj je piksel po pikselu z wersją nieskompresowaną, a odchylenie to tylko niewielki losowy szum). A co, jeśli wrócę do tego pierwszego obrazu 75%, a następnie ponownie zapisz na 99%? Cóż, to (po raz pierwszy):
Zapisywanie w wysokiej jakości jest zdecydowanie wyraźnie lepiej niż resaving z tymi samymi parametrami, niby do mojego zaskoczenia. Ale widoczna jest nowa degradacja różowego wykończenia i oczu. W przypadku przetworzonych wersji tych samych ustawień artefakty JPEG są wyolbrzymione przy każdej rekompresji. Przy niskiej rozdzielczości i niskiej jakości, które wybrałem, okazuje się to gorsze niż kompresowanie wszystkiego inaczej.
Na tych filmach: znalazłem ten jako najlepszy hit Google. Zauważ, że w opisie jest napisane:
Podkreślenie dodane - wyjaśnia, dlaczego nie ma żadnej zbieżności, ponieważ zamiast oszczędzania z tymi samymi ustawieniami lub oszczędzania w super wysokiej jakości, za każdym razem stosuje się losowe ustawienia .
Drugi film znalazłem mówi:
I znowu zrobiono coś, aby błędy się kumulowały.
W każdym razie, w celu praktycznej edycji zdjęć , warto wspomnieć, że oszczędność 75% jednorazowo jest znacznie gorsza niż oszczędność 99% milion razy . W moim przykładzie artefakty w 75% są tak oczywiste, że dalsza degradacja jest jak zrzucanie wody do oceanu. Jeśli zapiszesz na wystarczająco wysokim poziomie, że te artefakty nie są tak naprawdę widoczne, dobrym pomysłem jest ponowne zapisanie ustawień oryginalnych. Oczywiście, jeśli możesz pozostać przy pracy z nieskompresowanymi oryginałami, to lepiej.
Jeśli z jakiegoś powodu musisz (lub zdecydowanie wolisz) po prostu pracować z JPEG, ustaw aparat tak, aby zapisywał najwyższą możliwą jakość , nawet jeśli nie zauważysz różnicy w początkowych plikach. Zobacz Czy warto korzystać z ustawienia jakości Premium JPEG Pentaxa? więcej na ten temat - niekoniecznie tak naprawdę specyficzny dla Pentaxa.
źródło
Rekompresja ma mierzalny wpływ na jakość obrazu i efekt ten jest znacznie wyraźniejszy przy zmianie współczynników kompresji.
Jako szybkie sprawdzenie tutaj, ponieważ niektóre wartości SSIM dla operacji wykonywanych na obrazie testowym zawierającym kombinację cech liniowych i ciągłych. Wybrałem JPG95, ponieważ tego właśnie nauczono mnie używać w szkole Ad-photo i JPG83, ponieważ jest to powszechne wśród dostawców treści cyfrowych.
Tak więc ilość podobieństwa strukturalnego utraconego przy ponownym zapisywaniu przy tej samej kompresji 10 razy jest 1/10 tej utraconej jako oszczędzanie przy jakości z tiff. Jednak utrata jakości po zmianie kompresji JPG nawet raz jest taka sama, jak w przypadku utraty tego obrazu z Tiff do JPG.
Uruchomię ten test na kilka innych sposobów i zaktualizuję.
Metodologia : W ImageJ:
UWAGA: wiele osób patrząc na wartości SSIM po raz pierwszy odczytuje je jako wartości procentowe i zakłada, że różnica jest niewielka. To niekoniecznie jest prawdą. Wartości SSIM powinny być porównywane względem siebie, a nie traktowane jako wariancja od 1.
źródło
Nie ma to jak eksperymentowanie. Poniższy skrypt bash (napisany w systemie Linux, może działać w systemie OSX, jeśli masz ImageMagick ):
step000.jpg
)Rezultat jest taki, że:
Oczywiście wszystko to zakłada, że JPEG jest zapisywany przez to samo oprogramowanie z tymi samymi parametrami za każdym razem.
Na razie nie będę pokazywał wyników, wolę pozwolić ci eksperymentować z własnymi zdjęciami. Przy wystarczającej liczbie komentarzy dodam próbkę.
źródło