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.
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:
#!/usr/bin/env bash
n=10001; q1=90
convert original.png -sampling-factor 4:4:4 -quality ${q1} ${n}.jpg
while true ; do
q2=${q1} # for variants, such as adding randomness
convert ${n}.jpg -quality ${q2} $((n+1)).jpg
#\rm $((n-5)).jpg # uncomment to avoid running out of space
n=$((n+1))
echo -n "$q2 "
md5sum ${n}.jpg
done
Po kilkuset iteracjach uruchomiłem md5sum
wyniki:
d9c0d55ee5c8b5408f7e50f8ebc1010e original.jpg
880db8f146db87d293def674c6845007 10316.jpg
880db8f146db87d293def674c6845007 10317.jpg
880db8f146db87d293def674c6845007 10318.jpg
880db8f146db87d293def674c6845007 10319.jpg
880db8f146db87d293def674c6845007 10320.jpg
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.
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.
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.
q2=$(( (RANDOM % 3)*5 + 70 ))
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:
q2=$(( (RANDOM % 9) + 90 ))
Aby zrobić wideo, użyj ffmpeg
:
rename 's@1@@' 1*.jpg
ffmpeg -r 30 -i %04d.jpg -c:v libx264 -crf 1 -vf fps=25 -pix_fmt yuv420p output.mp4
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.
- Tak dzieje się w przypadku filmów obracających obraz o wymiarach, których nie można podzielić przez 8.
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?
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.