Home > Laboratorium > Jak wygląda JPEG po 100 000 rekompresji?

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 8) .

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 ze 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

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.


Obraz źródłowy i po pierwszych 50 iteracjach


100 i 200 iteracji


300 i 400 iteracji


500 i 750 iteracji


1 000 i 1 500 iteracji


5 000 i 10 000 iteracji


25 000 i 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 i 51 000 iteracji


55 000 i 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 w przyspieszonym tempie, 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.

  1. YanPL
    1 maja 2010 at 10:26 | #1

    gdyby ludzie nauczyli się używać PNG…

  2. 1 maja 2010 at 11:00 | #2

    W jakim sensie? Masz na myśli WWW? Ja z reguł używam :) ale też trzeba mieć wyczucie, bo zapisywanie zdjęcia w PNG to morderstwo – jednak bądź co bądź JPG zajmuje znacznie mniej a różnica w jakości przy tego typu obrazach jest znikoma. Co innego różne loga czy inne pomniejsze grafiki.

  3. ra_dość
    1 maja 2010 at 11:29 | #3

    Robiłeś to w AviSynth ? czy w czym :) .

  4. 1 maja 2010 at 11:35 | #4

    Własny programik w Delphi sobie napisałem :)

  5. Jojek
    1 maja 2010 at 12:47 | #5

    Zniszczyłeś Lenę!! :P

  6. 1 maja 2010 at 12:57 | #6

    Widać po rozmiarach plików że opłacalnie kompresuje się do 1 500 iteracji, potem już tylko rozmiar pliku wynikowego się zwiększa

  7. 1 maja 2010 at 13:01 | #7

    czy moglbys mi wyjasnic jaki sens w ogole ma ten post? kompletnie nie rozumiem czemu on ma sluzyc…naprawde az tak trudno bylo przewidziec ze jak bedziesz zapisywal ciagle jpg kompresujac go to w koncu zostanie syf? naprawde wrecz geniusz, ale odkrycie, naprawde, trzeba sie na blogu pochwalic…….powiedz mi czego mozna sie spodziewac jesli hipotetycznie otwieralbys lodowke i za kazdym razem zjadal kawalek ciasta zostawiac losowo 95%-100% calosci? moze tez przeprowadz eksperyment i wrzuc fotorelacje na blog….

  8. 1 maja 2010 at 13:04 | #8

    Dodam jeszcze jedną ciekawostkę – jeżeli obrazek ma długość i szerokość będącymi wielokrotnością 8 pikseli, to operację odwrócenia o 90 stopni można wykonać bez straty na jakości. W przeciwnym razie strata przy takich obrotach jest, nawet, jeśli nie zmieniamy poziomu kompresji.

  9. 1 maja 2010 at 13:05 | #9

    ….. :

    czy moglbys mi wyjasnic jaki sens w ogole ma ten post?…

    No dla mnie ma taki sens że byłem ciekawy czy po 100k dostanę szum, czarny obraz czy kij wie jeszcze co i kiedy (czy w ogóle) obraz się ustabilizuje. Jeśli Cie to nie interesuje, nie czytaj.

  10. 1 maja 2010 at 13:20 | #10

    no po szumnym tytule spodziewalem sie naprawde duzo wiecej niz to ze po 100.000 iteracjach i ciaglej kompresji o znikomy procent z obrazka zostanie sieczka……nie martw sie, wiecje nie bede czytac, pozdrawiam

  11. 1 maja 2010 at 13:23 | #11

    Tak właściwie główną pointą tego wpisu jest to że się właśnie nic nie dzieje z obrazem w toku rekompresji bez zmiany jej parametrów – bo prawdę mówiąc początkowo myślałem że tak czy owak spada jakość.

  12. 1 maja 2010 at 13:30 | #12

    mozna prosic o ‘pelna wersje’ tego zdjecia? :D co to za kobieta?

  13. 1 maja 2010 at 13:31 | #13

    Wpisz w google „Lena”.

  14. 1 maja 2010 at 13:37 | #14

    A ile zajmował jpg po 50 iteracjach?A ile po np. 1 kompresji jpg?

  15. 1 maja 2010 at 13:39 | #15

    To ile zajmował wynikało tylko z tego jaki trafił się poziom kompresji. Innymi słowy, jeśli wypadło np: 95% to zajmował +/- samo przy 1 jak i przy 100 iteracji. Przez cały okres rozmiar oscylował w okolicy jednej wartości (ok. 110kb) – co też jest dość ciekawe.

  16. Kuba
    1 maja 2010 at 13:58 | #16

    @… Chyba źle czytałeś… Skad takie bzdurne wnioski ?

  17. Windowz
    1 maja 2010 at 14:00 | #17

    @…..
    Pozwól, że ja Ci wyjaśnię, chociaż skoro nie byłeś w stanie zrozumieć tekstu artykułu, to prawdopodobnie nie zrozumiesz też tego co tu napisano.
    Otóż algorytm kompresji JPEG nie kompresuje już skompresowanych danych przy zachowaniu poziomu kompresji, co oznacza, że jakoś obrazu nie ulega degradacji jeśli będziesz powtarzał jego zapisywanie bez zmiany tego poziomu. To było faktycznie do przewidzenia intuicyjnie, w końcu kompresja skompresowanego ZIP-a nic nie daje.
    Ciekawe jest to, że przy losowej zmianie żądanego współczynnika kompresji w przedziale 0,95 – 1,00 powtarzające się operacje zapisywania obrazu powodują efekt jak na filmie. I to jest CIEKAWE, ponieważ „na zdrowy rozum” nie powinno tak być.
    Pojął? Nie sądzę.

    A tak swoją drogą, następnym krokiem byłoby zbadanie, czy jest to problem z jedną konkretną imprementacją kompresji JPEG czy też zachowanie takie jest niejako wbudowane w sam algorytm. Może to temat na następny wpis?

  18. marek
    1 maja 2010 at 14:15 | #18

    Witam,
    fajny eksperyment, brakuje tylko takiego porownania w ktorym jeszcze raz przeprowadzilbys test od poczatku. Ciekawy jestem jakby wygladal drugi raz ten sam jpeg po np. 50tys iteracji

  19. 1 maja 2010 at 14:37 | #19

    Dawno tego nie sprawdzałem, ale z tego co pamiętam, to obrót zdjęcia w Windowsie (XP) wręcz masakrował jakość! Kiedyś w ten sposób zgrałem zdjęcia z aparatu (i to niestety nie przez kopiuj-wklej, a przez wytnij-wklej…), no i po kilku obrotach zorientowałem się, że zostały mi tylko mocno nadpsute kopie z widocznymi uszczerbkami. Za to zajmujące z 5 razy mniej miejsca niż oryginał. Rzecz chyba w tym, że windowsowy obracacz prawdopodobnie nie zachowuje oryginalnej jakości lub stopnia kompresji.

  20. noname
    1 maja 2010 at 14:39 | #20

    Dlatego jeśli obrabiamy zdjęcia pracujmy na kopiach, a nie oryginale :)

  21. mdbk
    1 maja 2010 at 15:26 | #21

    :
    no po szumnym tytule spodziewalem sie naprawde duzo wiecej niz to ze po 100.000 iteracjach i ciaglej kompresji o znikomy procent z obrazka zostanie sieczka……nie martw sie, wiecje nie bede czytac, pozdrawiam

    Usiądź sobie sobie na fotelu i powoli umrzyj nic nie robiąc i nie będąc niczego ciekawym… Po co masz żyć skoro wiesz co będzie jutro? Zestarzejesz się i umrzesz… Jak ten obrazek, po co robić eksperyment skoro wiadomo że straci na jakości… kogo obchodzi kiedy, w jaki sposób, jak bardzo…

  22. 1 maja 2010 at 15:30 | #22

    @noname
    Jeśli to o mnie ma chodzić, to ja je tylko przeglądałem.Nie wiedziałem że Windows zapisuje zmiany do pliku po obrocie w okienku podglądu…

  23. foreplay
    1 maja 2010 at 15:47 | #23

    nie masz pojęcia o kompresji człowieku.

  24. Saskatchewan
    1 maja 2010 at 17:47 | #24

    Do autora: powinieneś wspomnieć, czy obraz pierwotny miał domyślny stopień kompresji, tj. 95%.

    Do zdziwionych: o ile się nie mylę (poprawcie mnie) – obraz zapisany w JPG przy kompresji 95%, zapisany ponownie, ma tą samą jakość (a nie jej 95%). To znaczy, że nie traci jakości. Zatem jeżeli poziom kompresji był ustawiany na poziomie 95%-100%, to *teoretycznie* obraz nie powinien tracić na jakości.

  25. 1 maja 2010 at 21:16 | #25

    @Saskatchewan
    Podczas procesu kompresji dzieje się kilka dziwnych rzeczy, m.in. operacje mnożenia i co gorsza dzielenia, przy których dochodzi do zaokrągleń liczbowych. Stąd jakość spada.

Strony komentarza
1 2 305
  1. Brak jeszcze trackbacków