2013-02-12 14 views
6

Mam świadomość, że kompresja JPEG jest stratna. mam 2 pytania:Czy ponowne kodowanie obrazów JPEG jest operacją idempotentną?

danej operacji T:
1. Weź JPEG-80 obraz
2. dekodować go do bufora bajtów
3. Kodowanie dany bufor bajtowy jako JPEG-80

Czy jest to idempotentna operacja pod względem jakości wizualnej? Czy jakość obrazu będzie się pogarszała, gdy powtarzam T? Czy to samo obowiązuje dla kodeka JPEG-XR?

Dziękujemy!

Edit: Ponieważ nie były sprzeczne odpowiedzi, byłoby wspaniale, gdyby można dostarczyć referencje!

+0

Nie wiem na pewno, ale nie liczę na to. Zwłaszcza między różnymi silnikami. Nawet przy pojedynczym silniku uzyskane przybliżenia mogą nie powodować tego samego regionu po dwukrotnym zastosowaniu. –

+1

Powiedziałbym, że nie. Po każdym kodowaniu do jpeg będzie więcej "straty". – leppie

Odpowiedz

1

Jeśli używasz tego samego silnika kompresji JPG z tymi samymi ustawieniami, generalnie będzie to idempotent. Nie wiem, czy to jest gwarantowane, ale myślę, że większość wdrożeń się tym zajmuje. Wiem na pewno, że implementacje z środowiskiem wykonawczym Java są idempotentne.

+0

Używam API WIC: http://msdn.microsoft.com/en-us/library/windows/desktop/gg430027(v=vs.85).aspx – Sau

+0

Zakładam, że Dave próbował ponownie kodować obraz JPEG bez najpierw przekształcenie go w bitmapę, więc ten dowód nie jest zbyt przekonujący. Nie jestem obeznany z żadnym interfejsem API, ale podejrzewam, że implementacja enkodera Java JPEG, którą zastosował Dave, jest prawdopodobnie "wystarczająco inteligentna", aby * nie * ponownie kodować obraz JPEG, jeśli pamięta on kodowanie go wcześniej. W końcu, ponowne kodowanie pliku JPEG nie jest zwykle pożądane, więc sensowne byłoby, aby interfejs API był tolerancyjny na potencjalnie często niewłaściwe użycie funkcji, chociaż prawdopodobnie powinien rzucić ostrzeżenie, aby jasno określić, co się dzieje "pod maską". . " – StockB

2

Z definicji operacja stratna odrzuca dane przez uproszczenie reprezentacji w sposób, który (najlepiej) nie jest zauważalny dla użytkownika końcowego. Jednak koder nie ma żadnej magicznej metody określania, które piksele są ważne, a które nie, więc koduje wszystkie piksele jednakowo, nawet jeśli są to artefakty!

Innymi słowy, koder potraktuje niesprawnie skompresowany obraz tak samo jak obraz bezstratny. Stratny obraz zostanie dodatkowo uproszczony, odrzucając dodatkowe dane w procesie, ponieważ dla wszystkich enkoderów wie, użytkownik zamierza reprezentować artefakty.

Oto kilka przykładów utraty generacji JPEG:

http://vimeo.com/3750507

http://en.wikipedia.org/wiki/File:JPEG_Generarion_Loss_rotating_90_(stitch_of_0,100,200,500,900,2000_times).png

+3

To nie jest takie proste. JPEG nie zawsze wyrzuca informacje, kwantyzuje je. Jeśli dane wejściowe będą idealnie pasować do skwantyzowanych danych, nie zmienią się wcale. Jest to trochę podobne do zmniejszania liczby kolorów obrazu - jeśli obraz wejściowy ma już kilka kolorów, to się nie zmieni (z wyjątkiem tego, że JPEG działa raczej na częstotliwościach DCT niż na kolorach). – Kornel

+0

To by wyjaśniało, dlaczego przykład Wikipedii obrócił obraz o 90º. Powinieneś umieścić to w odpowiedzi lub edytować moje. – StockB

1

To nie jest gwarantowane, ale może się zdarzyć. Zwłaszcza jeśli powtórzysz proces dekodowania -> dekodowanie -> kodowanie -> dekodowanie wystarczająco długo, ostatecznie ustali się on w punkcie stałym i przestanie tracić jakość dalej (o ile zachowasz tę samą jakość i ten sam enkoder).

kodowania JPEG odbywa się w kilku etapach:

  1. RGB do konwersji YUV
  2. DCT (zmiany w dziedzinie częstotliwości)
  3. kwantyzacji (Wyrzucanie bity DCT)
  4. kompresji bezstratnej

Dekodowanie jest tym samym procesem wstecz.

Kroki 1 i 2 mają błędy zaokrąglania (szczególnie w enkoderach zoptymalizowanych pod kątem prędkości z użyciem matematyki całkowitej), więc w przypadku idempotentnego ponownego kodowania musisz mieć szczęście, aby kodowanie i dekodowanie błędów zaokrąglania były niewielkie lub anulować się nawzajem.

Krok 3, który jest głównym krokiem stratnym, jest w rzeczywistości idempotentny. Jeśli twoje zdekodowane piksele przekonwertują się na podobne do DCT, będą kwantyzować ponownie do tych samych danych!

JPEG XR używa również YUV, więc może ponieść pewne błędy zaokrągleń, ale OTOH zamiast DCT wykorzystuje inny przekształcać, które mogą być obliczone bez zaokrąglania błędów, więc powinno być łatwiej round-trip JPEG XR niż inne formaty.

Powiązane problemy