Jak wygląda JPEG po 100 000 rekompresji?

Z cyklu "moje szalone eksperymenty", czyli co się dzieje z obrazem zapisanym w formacie JPEG, jeśli będziemy go ciągle otwierać i zapisywać?

Do tego doświadczenia posłużyłem się napisanym specjalnym programem który kolejno, aż do znudzenia, otwierał i zapisywał do JPG’a ten sam obraz. I tak 100 000 razy. Nie wchodziłem zbytnio w optymalizację na ten jeden raz, stąd też nieco to trwało.

Pewnie myślicie że po kilkunastu takich operacjach z pierwotnego zdjęcia została sieczka? Prawdę mówiąc też tak myślałem. Jakież było moje zdziwienia gdy się okazało że praktycznie nic się nie zmienia! Ale gdyby to był końcowy wniosek, wpis ten był by nudny, poszedłem zatem o krok dalej :).

Dalszy krok

Początkowo po prostu prowadziłem rekompresje obrazu zapisując go za każdym razem w tej samej jakości. I tak jak wyżej wspomniałem, jakość zdjęcia nie pogarszała się wraz z kolejnymi iteracjami – cały czas pozostawała na określonym poziomie wynikającym z obranego stopnia kompresji.

Dlaczego tak się dzieje? Wynika to wprost z algorytmu JPEG. W dużym uproszczeniu, polega on na zmianie obrazu w drobne gradienty które najlepiej oddają dany fragment rysunku – w zależności od stopnia kompresji są one mniej lub bardziej widoczne. Więcej na ten temat można przeczytać na stronach Wikipedii.

Poziom jakości 1%, widoczne artefakty
Poziom jakości 1%, widoczne artefakty

I tak, po pierwszym zapisaniu z formatu źródłowego algorytm JPEG stosuje stratną kompresję zamieniając nasze zdjęcie w owe gradienty. Jeśli powtórzymy tą operację na skompresowanym już JPG’u, to sytuacja powtarza się, z tą tylko różnicą że nie ma już co zmieniać gdyż obraz poddawany kompresji wpasowuje się idealnie w to co zrobił by algorytm JPEG (a co uczynił przy poprzednim zapisie).

Dlatego właśnie, wraz z kolejnymi zapisaniami nie tracimy nic na jakości. Oczywiście pod warunkiem że nic nie zmieniamy na obrazku, oraz za każdym razem stosujemy ten sam stopień kompresji! Jednakże jest to sztuka dla sztuki, po co zapisywać jak nic się nie zmienia?

Nie do końca tak jest. Jeśli wykonamy operację które nie naruszają w sposób stratny zawartości rysunku (np.: zamalowanie twarzy) to możliwe jest ponowne zapisanie bez straty jakości. Do operacji takich zaliczyć możemy obrót o 90 stopni, bądź odbicie w pionie/poziomie. Stąd też właśnie, wbudowana w system Windows przeglądarka obrazów potrafi dokonywać rotacji bez uszczerbku na jakości zdjęcia.

Pamiętaj chemiku młody...

Tak jak mówiłem, powyższy wniosek jest nudny :). Idąc krok dalej, postanowiłem przeprowadzić cały eksperyment jeszcze raz ale tym razem zmieniając poziom jakości kompresji losowo między 95% a 100% – zmieniając tym samym warunki pracy algorytmu JPEG.

I w tym momencie zaczyna robić się ciekawie. Tutaj faktycznie zaobserwujemy już destrukcję obrazu, zobaczcie sami (polecam otwierać obrazki w nowym oknie, gdyż dobroprogramowa galeria dodaje po kilka iteracji ;)).

Obraz źródłowy
Obraz źródłowy
Po 50 iteracjach
Po 50 iteracjach

Po 100 iteracjach
Po 100 iteracjach
Po 200 iteracjach
Po 200 iteracjach

Po 300 iteracjach
Po 300 iteracjach
Po 400 iteracjach
Po 400 iteracjach

Po 500 iteracjach
Po 500 iteracjach
Po 750 iteracjach
Po 750 iteracjach

Po 1 000 iteracji
Po 1 000 iteracji
Po 1 500 iteracjach
Po 1 500 iteracjach

Po 5 000 iteracji
Po 5 000 iteracji
Po 10 000 iteracji
Po 10 000 iteracji

Po 25 000 iteracji
Po 25 000 iteracji
Po 50 000 iteracji
Po 50 000 iteracji

Jak widać, początkowo proces przebiega bardzo szybko. Im dalej, tym więcej powtórzeń potrzeba aby dostrzec jakie zachodzą zmiany w obrazie.

Wszystko wskazuje na to jakoby sytuacji stabilizowała się, jednak w okolicach 50 000 iteracji obserwujemy coś co można nazwać załamaniem się trendu.

50 500 iteracji
50 500 iteracji
51 000 iteracji
51 000 iteracji

55 000 iteracji
55 000 iteracji
100 000 iteracji
100 000 iteracji

Pomiędzy 60 000 iteracją a dalszymi, aż do 100 000 obserwowane są oscylacje obrazu, tzn. nie zmienia się on w sposób jak na początku, tylko zachowuje się jak szum, coś się przemieszcza delikatnie ale nic już się nie zmienia. Mówiąc w programistycznym slangu, wygląda to jakby obraz wpadł w nieskończoną pętlę.

Na koniec jeszcze raz to samo, ale zaprezentowane na filmie, który bardzo dobrze oddaje tempo zachodzenia zmian.

Podsumowanie

I to w zasadzie już wszystko. Może nie jest to zbyt wiele wnoszący do życia eksperyment, jednak na pewno ciekawy :). Od strony praktycznej, jeśli bałeś się korzystać z systemowej funkcji rotacji zdjęć w trosce o jakoś obrazu, teraz możesz robić to bez najmniejszych oporów. 

hobby inne

Komentarze (20)

avatar | 11.01.2012 14:28
Jestem pewien, że zostało to Wykop-ane z pewnego bloga. Czy Ty tylko ukradłeś ten wpis, czy może tylko przekopiowałeś swój wpis ze swojego konta na innym blogu?
avatar | 11.01.2012 14:33
Bardzo ciekawy wpis, zastanawiające jest powstanie czarnego piksela z prawej strony :)
avatar | 11.01.2012 14:35
Zwracam honor i przepraszam za posądzenie o kradzież. Po avce widzę, że to Ty byłeś autorem
http://www.bbproject.net/2010/05/jak-wyglada-jpeg-po-100-000-rekompresji/
http://www.wykop.pl/link/357953/jak-wyglada-jpeg-po-100-000-rekompresji/
avatar | 11.01.2012 14:38
@Slavius
Tak, było to na wykopie, i pochodzi z mojego bloga :) Powoli przymierzam się do zamknięcia swojego self-hosted bloga na rzecz tego dobroprogramowego i nie chciałem aby ten mój eksperyment całkiem zniknął z sieci.
avatar | 11.01.2012 14:40
@Mifczu
Też mnie to intryguje :) Wydaje mi się że ten obszar po prostu jest stricte czarny już w źródłowym obrazie i dlatego nie uległ destrukcji jak reszta obrazka. Aczkolwiek to tylko takie moje domysły, potrzeba by tu opinii kogoś kto wie jak działa algorytm JPEG w stopniu w którym może sam napisać jego implementacje.
avatar | 11.01.2012 14:53
Czarny piksel pojawia się już po 300-setnym wykonaniu pętli i faktycznie teoria, że był stricte czarny pasuje.
avatar | 11.01.2012 15:24
Albo mi się zdaje albo "czarny piksel" jest widoczny także na obrazie źródłowym, i to całkiem wyraźnie, nawet na miniaturze jestem w stanie bezproblemowo go wychwycić.
avatar | 11.01.2012 15:46
Powinien powstać jakiś system DRM który to wykorzystuje i za każdym oglądnięciem leci 1-3 iteracje ;D
avatar | 11.01.2012 15:48
@LoonyFox
LOL :) Weź nie rzucaj takimi pomysłami bo jeszcze ktoś z branży to przeczyta i podchwyci ;)
avatar | 11.01.2012 17:08
widzę ze lena wszystkim znana;p dla fanów kobiecego piękna polecam poszukać obrazu w całości;p
avatar
KONTO USUNIĘTE
| 11.01.2012 17:22
Świetny wpis, bardzo mi się spodobał :) a co do wspomnianego już "czarnego piksela" to również mnie zaintrygował.
avatar | 11.01.2012 18:46
@underface
Tej części historii nie znałem

Fajny eksperyment. Powiem szczerze że moja pierwsza myśl brzmiała "hmm, chyba ktoś ode mnie z poli". Nie tak dawno temu na wykładach było o tym. Jednak data na wykopie mi trochę sytuację rozjaśniła. ^^

pozdrawiam
avatar | 11.01.2012 18:56
@centus_07
Akurat jestem z Politechniki, ale Śląskiej. Z tym że kończyłem półtory roku temu ;)
avatar | 11.01.2012 21:18
Aż łezka mi się w oku zakręciła, jak zobaczyłem zdjęcie tej pani. Cały semestr na studiach męczyłem to zdjęcie. Tylko ja, to zdjęcie i Matlab.
avatar | 11.01.2012 23:22
Hej,

A już też zaczynałem się zastanawiać, gdzie już to czytałem. Pierwsza myśl, że coś się z blogami popsuło i stare wpisy pokazuje jako nowe. Czyli to jednak nie de ja vou. :)

Pozdrawiam,
Dimatheus
avatar | 12.01.2012 0:21
@Dimatheus
Oj tam, oj tam ;)
avatar
marcin-44 (niezalogowany)
| 17.01.2012 1:19
Mam takie pytanie w nawiązaniu do przeprowadzonego eksperymentu: czy jak się kopiuje wiele razy plik .jpg lub .mp3 z jednego nośnika na inny (np. z komputera na dysk USB i z powrotem) to stopniowo następuje pogorszenie jakości pliku czy też można do woli kopiować?
avatar | 17.01.2012 10:31
@marcin-44
Hehe, kopiować sam plik możesz do woli, cokolwiek by to nie było :) Dane cyfrowe to nie analogowe aby przez sam proces kopiowania ulegał destrukcji.
avatar
ktos ;) (niezalogowany)
| 18.01.2012 17:38
mp3 przy wtornym kopiowaniu ulega stopniowej destrukcji, do .jpg nie mam pewnosci pzdr.
avatar | 18.01.2012 19:08
@ktos ;)
Chyba sobie żartujesz... przy wtórnej rekompresji to tak, ale nie przy zwykłym kopiowaniu pliku. Nie wprowadzaj nikogo w błąd jeśli nie rozróżniasz tych dwóch procesów.
Dodaj komentarz