JPEG 2000

Z Wikipedie, otevřené encyklopedie


JPEG 2000 je formát na ztrátovou kompresi obrazu založený na wavelet transformaci. Umožňuje i bezeztrátovou kompresi, ačkoliv PNG většinou dosahuje lepšího kompresního poměru. JPEG 2000 poskytuje lepší kvalitu než klasický JPEG při stejném kompresním poměru.

  • Přípona souborů: .jp2 nebo .j2c
  • Mime-type: image/jp2
  • Při kompresi lze definovat kvalitu, nebo cílovou velikost výsledného souboru.

Obsah

[editovat] Postup komprese do JPEG 2000

  • Nejprve se provede převod z RGB na YCbCr (jas a dvě barevné komponenty) nebo RCT (Reversible Component Transform)
Y  = + 0.299    * R + 0.587    * G + 0.114    * B
Cb = - 0.168736 * R - 0.331264 * G + 0.5      * B
Cr = + 0.5      * R - 0.418688 * G - 0.081312 * B

RCT je podobné, ale umožňuje bezeztrátovou zpětnou transformaci. Po převodu se každá komponenta komprimuje samostatně. Obraz je rozřezán na pravidelné čtvercové dlaždice libovolné velikosti. Všechny dlaždice mají stejnou velikost (kromě okrajů). Lze vzít celý obraz jako jednu dlaždici (pro malé obrázky). Pokud mají některé komponenty menší rozlišení, dlaždice jsou rozděleny na stejných místech jako ty s vyšším rozlišením). Následuje komprese každé dlaždice separátně, na to se použije L-úrovňová dyadická (pyramidová) wavelet transformace - buď (9,7) floating point wavelet (Daubechies biorthogonal 7/9), nebo (5,3) integer wavelet. Při použití bezeztrátové komprese pouze integer wavelet. L-úrovňová transformace má L+1 rozlišení obrazu - L je rozlišení obrazu a 0 je nejnižší frekvence (neboli LFS - lowest frequency subband). Ze 4 subbandů rozlišení j se složí jeden s rozlišením j+1. Kvantizace jednotlivých subbandů - floating point koeficienty se kvantizují na celá čísla pomocí uniformní kvantizace, krok kvantizace lze volit zvlášť pro každý subband (a tím též částečně řídit kvalitu). Při použití integer wavelet kvantizace odpadá. Po kvantizaci je každý subband rozdělen na „packet partitions“ - čtvercové nepřekrývající se oblasti. Jsou typicky voleny tak, aby napříč subbandy tvořily bloky v originálním obrazu Každá packet partition je dělena na bloky stejné velikosti (kromě bloků na kraji obrazu), všechny bity všech koeficientů v bloku jsou pak kódovány pomocí EBCOT.

EBCOT (Embedded Bitplane Coding with Optimal Truncation) je proces kódování všech koeficientů v bloku v pořadí od nejvýznamnějšího po nejméně významný.

  • Nejprve se rozdělí koeficienty do bitových rovin.
  • Bitové roviny obsahující pouze nuly jsou přeskočeny (uchová se jen jejich počet), začne se první rovinou obsahující alespoň jednu jedničku.
  • Bity se z roviny načítají po čtyřřádkových blocích, v rámci bloku po čtyřbitových sloupcích.
  • Každá rovina je pak kódována ve třech průchodech: Significance Propagation, Magnitude Refinement a Cleanup Pass.

Prvním průchodem je vždy Cleanup Pass.

Bit je důležitý, pokud v této, nebo v předchozích bitových rovinách v něm byla 1.

  • Significance Propagation - Zakóduji ty bity, které nejsou důležité, ale sousedí s alespoň jedním důležitým (v některém z 8 směrů)
  • Magnitude Refinement - Zakóduji bity z míst, které se byly v minulých rovinách důležité
  • Cleanup Pass - Zakóduji všechny zbylé bity.

Znaménko se kóduje společně s prvním bitem.

Takto získané bity se kódují binárním kontextovým binárním aritmetickým kodérem - MQ kodérem. Kontext koeficientu je tvořen stavem jeho 9 sousedů. Výsledný proud bitů je rozdělen na pakety - paket spojuje jeden ze tří průchodů všech bloků přes celou packet partition.

Paket má hlavičku, kde jsou informace o obsažených blocích: počet nulových a obsazených bitových rovin, zdali blok vůbec obsahuje data a další…

Pomocí vypouštění méně důležitých paketů se řídí kvalita, při bezeztrátové kompresi se žádný paket vypustit nesmí.

Pakety ze všech subbands jsou složeny do tzv. vrstev. Jedna vrstva obsahuje všechny pakety daného typu pro daný subband. Způsob, jakým jsou však bloky děleny do paketů není ve standardu definován a je to na algoritmu, stejně tak pořadí paketů ve vrstvě. Obecně se očekává, že data budou řazeny tak, aby se s přibývajícími vrstvami kvalita obrazu rovnoměrně zvyšovala.

Standard však nedefinuje způsob, jak najít optimální délku paketu pro všechny bloky. Kompresor se snaží se minimalizovat celkové zkreslení při dané velikost výsledných dat či kvalitě a musí tedy nějak rozhodnout kde v paketech „odseknout“ již méně významné bity.

Jeden z možných algoritmů na kompresi:

  • Pro každý bit kódovaný EBCOT kodérem se změří zlepšení kvality
  • Vyrobí se graf počtu bitů ku kvalitě pro každý blok.
  • Tam, kde strmost grafu (nárůst kvality na přidaný bit) klesne pod určitou úroveň danou kvalitou, zbylé bity zahodím.
  • Při kompresi na určitou velikost vždy přidávám bit který nejvíc pomůže, po dosažení velikosti se zbytek bitů zahodí.

[editovat] Další vlastnosti JPEG 2000

  • Pomocí vhodného přerovnání paketů lze např. pro velké obrázky seskupit pakety pro detailní úroveň některého výřezu k sobě. Lze tak prohlížet detailně nějaký výřez, aniž by se musel dekódovat celý obrázek - ovšem kodér a dekodér s tímto musí počítat.
  • Lze kódovat některé regiony obrazu s větší kvalitou než jiné (pokud kodér umožňuje).
  • Otočení o násobek 90 stupňů, oříznutí nebo zrcadlové převrácení obrazu lze provést bez kompletní rekomprese a s tím související ztráty kvality (není nutné provádět zpětnou a pak zas dopřednou wavelet transformaci).
  • V JPEG 2000 Part II lze tyto transformace jen zapsat do hlavičky a dekodér je pak pouze při dekompresi provede.
  • Při editaci velkého obrázku lze rekódovat jen změněné dlaždice a v případě potřeby dlaždici zakomprimovat na velikost jakou měla předtím, není tedy nutné přeuspořádávat soubor.

[editovat] Srovnání s JPEG

Pro střední stupeň komprese poskytuje JPEG 2000 asi o 20% lepší kompresi než JPEG, pro nízké nebo vysoké stupně komprese může být zlepšení ještě větší. Vhodné pro JPEG 2000 jsou velké snímky, nebo snímky s málo kontrastními okraji (například lékařské snímky). Kodér JPEG2000 má oproti JPEG vyšší paměťovou i časovou náročnost. Narozdíl od JPEG se neprojevují artefakty vzniklé dělením do bloků 8x8 pixelů, ale pokud se použije dělení obrazu do dlaždic, bude zde vidět nespojitost - proto se to v praxi moc nepoužívá. Často se používá „Chroma subsampling“, kdy barevné komponenty mají poloviční rozlišení, neboť lidské oko je více citlivé na jas, než barvu. Pokud se barvy v obrázku příliš rychle střídají, budou vypadat mdle.

JPEG 2000 (stejně jako JPEG) osciluje ve spektrální doméně (algoritmus se snaží na ostrou hranu napasovat vlnovou funkci), což znamená, že kolem ostrých hran i zde budou viditelné artefakty. Obrazy s vysokým poměrem komprese jsou více rozmazané než originál (neboť ztrátovost komprese se projeví nejvíce u vysokofrekvenční složky).

[editovat] Externí odkazy