JPEG

A Wikipédiából, a szabad enciklopédiából
Joint Photographic Experts Group
Phalaenopsis JPEG.jpg
Egy virágról készült fénykép balról jobbra haladva lépcsőzetesen egyre veszteségesebb JPEG tömörítést használva
Fájlkiterjesztés .jpeg, .jpg, .jpe
.jfif, .jfi (konténerek)
MIME-típus image/jpeg
Fejlesztő Joint Photographic Experts Group
Formátum típusa bináris fájlformátum bittérképes képek tárolására
Mac OS típuskód JPEG

A JPEG – (Joint Photographic Experts Group) képek tárolására alkalmas fájlformátum. Kiterjesztéseként a .jpeg, .jpg, ritkábban a .jpe használt. A JPEG normát 1992-ben fogadták el, ami különböző képtömörítési módokat ír le.

A képen lévő információt veszteségesen tömöríti ez a formátum. A szabvány által leírt veszteségmentes tömörítést nem használják. Bár a tömörítés információveszteséggel jár, akár 10-100× kisebb fájlméret mellett is élvezhető a tömörített kép. Elsősorban fényképek, rajzok tárolására való. Grafikonok és egyéb hirtelen színátmenetű ábrák tárolására veszteségmentes tömörítésű formátum való (például PNG, GIF).

A módszer különböző színmélységeket tud kezelni, továbbá használható szekvenciális és progresszív módban is. Az előbbi soronként dolgozik, az utóbbi először a durva formákat, majd a finomabb részleteket rajzolja ki. A JPEG-ben nem képpontokat tárolnak le, hanem a képet transzformálják a frekvencia-tartományba a DCT-vel (diszkrét cosinus transzformáció).

A JPEG napjainkban az egyik leginkább elterjedt képformátum. Továbbfejlesztése a JPEG2000, mely a DCT (diszkrét cosinus transzformáció) helyett Wavelet transzformációt használ. Ez a 8×8 pixeles elemi blokkok határán jelent nagy könnyebbséget.

A szabvány csak a tömörítési eljárást írja le, de nem határozza meg azok tárolási módját. A JPEG képeket JFIF (JPEG File Interchange Format) formátumban tárolják. A SPIFF és a JNG képek szintén JPEG tömörítéssel készülnek, de máshogy tárolják őket.

Áttekintés[szerkesztés | forrásszöveg szerkesztése]

Az ISO/IEC 10918-1 JPEG szabvány a következő módokat definiálja:

Szekvenciális (Sequential) Progresszív (Progressive) Veszteségmentes (Lossless) Hierarchikus (Hierarchical)
Huffman-kódolás Aritmetikai kódolás Huffman-kódolás Arithmetikai kódolás
8 bit 12 bit 8 bit 12 bit 8 bit 12 bit 8 bit 12 bit

Ezek közül csak a 8 bites, Huffman-kódolású változatok használatosak.

A JPEG-LS javított, veszteségmentes módszert egy másik szabvány definiálja. A fekete-fehér képeket a JBIG eljárással is lehet tömöríteni.

A JPEG és a JPEG-LS formátumokat a következő szabványok rögzítik:

JPEG (veszteséges és veszteségmentes): ITU-T T.81 (PDF; 1,1 MB), ISO/IEC IS 10918-1
JPEG (Bővítések): ITU-T T.84
JPEG-LS (veszteségmentes, javított): ITU-T T.87 , ISO/IEC IS 14495-1

A JPEG szabvány hivatalos címe: Information technology – Digital compression and coding of continuous-tone still images: Requirements and guidelines. Itt a joint a következők együttműködésére utal: ITU, IEC és ISO.

A tömörítés[szerkesztés | forrásszöveg szerkesztése]

A JPEG-norma 41 különböző alformátumot ír le, amelyek közül többnyire csak egyet használnak.

A kép feldolgozása több lépcsős, amelyek közül négy veszteséges:

  • A színtér átszámítása az RGB színtérből YCbCr színtérbe a CCIR 601 szerint (veszteséges)
  • A Cb és Cr színkomponensek szűrése és letapogatása (veszteséges)
  • Felosztás 8x8-as blokkokra és a blokkok diszkrét koszinusz transzformációja (kerekítési hibák miatt veszteséges)
  • Kvantálás (veszteséges)
  • Átrendezés
  • Entrópiakódolás

A veszteséget az emberi szem egészen 1,5–2 bit/pixel adatmennyiségig nem látja; 0,3 bit/pixel alatt a kép használhatatlan, mivel a tömörítési eljárás során olyan mintázatok kerülnek rá, amelyek eredetileg nem voltak rajta: blokkok képződnek, olyan színek jelennek meg, amelyek nem voltak ott, a színek elmosódnak, a kép szürkül. A JPEG 2000-nél ezek a jelenségek lényegesen ritkábban jelentkeznek.

Ha a forrásfájl 24-bit-RGB fájl, akkor a 12 - 15-szeres tömörítés szemre veszteségmentes, 35-ig még jó kép. Ezek a számok azonban függnek magától a képtől is. Ha az sok apró részletet tartalmaz, akkor az csökkenti az élvezhető tömörítés arányát.

A veszteségmentes módszer máshogy működik, prediktív kódon és entrópiakódoláson alapul.

A színtér transzformációja[szerkesztés | forrásszöveg szerkesztése]

A kiindulási RGB képet az YCbCr színtérbe transzformálják, Alapvetően az YPbPr sémát használják a CCIR 601 szerint:



\begin{bmatrix} Y' \\ Pb \\ Pr \end{bmatrix}
\approx
\begin{bmatrix} 0{,}299    &  0{,}587    &  0{,}114  \\
               -0{,}168736 & -0{,}331264 &  0{,}5    \\
                0{,}5      & -0{,}418688 & -0{,}081312 \end{bmatrix}
\cdot
\begin{bmatrix} R' \\ G' \\ B' \end{bmatrix}

Mivel az R′G′B′ értékeknek 8 bites számokként az {0, 1, …, 255} tartományba kell esniük, ezért normálni kell őket. Így keletkeznek az Y′ (luminance), Cb (color blueness) és Cr (color redness) komponensek:



\begin{bmatrix} Y' \\ Cb \\ Cr \end{bmatrix}
\approx
\begin{bmatrix} 0 \\ 128 \\ 128 \end{bmatrix}
+
\begin{bmatrix} 0{,}299    &  0{,}587    &  0{,}114  \\
               -0{,}168736 & -0{,}331264 &  0{,}5    \\
                0{,}5      & -0{,}418688 & -0{,}081312 \end{bmatrix}
\cdot
\begin{bmatrix} R'_d \\ G'_d \\ B'_d \end{bmatrix}

Ezzel a komponensek az {0, 1, …, 255} értéktartományba kerülnek.

A veszteségek részben kerekítési hibák, részben abból származnak, hogy a Cb és a Cr értékeket csak minden második pixelre számítják ki.

A színkülönbségi jelek mélységi szűrése[szerkesztés | forrásszöveg szerkesztése]

Többnyire a Cb és Cr értékeket csökkentett felbontással mentik el. A mélységi szűrés legegyszerűbb módja a középértékek számítása.

A letapogatást többnyire vízszintesen és függőlegesen is elvégzik, amelyek rendre a felére csökkentik az információmennyiséget, így az a negyedére csökken. Ezzel azt használják ki, hogy az ember színlátásának a felbontása kisebb, mint a kontrasztok látásáé.

Blokképzés és diszkrét koszinusztranszformáció[szerkesztés | forrásszöveg szerkesztése]

A kép minden komponensét 8x8-as blokkokba osztják. Ezeket két dimenziós diszkrét koszinusz transzformációval transzformálják:


F_{xy} = {1 \over 4} C_x C_y \sum_{m=0}^7 \sum_{n=0}^7 f_{mn} \cos \frac{(2m + 1) x \pi}{16} \cos  \frac{(2n + 1) y \pi}{16}

ahol


C_x, C_y =
\begin{cases} {1 \over \sqrt{2}} & \text{ha }x, y = 0 \\ 1 & \text{különben } \end{cases}

Ez a transzformáció a gyors Fourier-transzformációval hatékonyan implementálható. A DCT ortogonális transzformáció energiatömörítése jó, és invertálható is, inverze az IDCT. Ez a lépés elvben veszteségmentes, csak arra szolgál, hogy a további lépésekhez kedvező alakba hozza az adatokat.

Kvantálás[szerkesztés | forrásszöveg szerkesztése]

Ahogy a legtöbb veszteséges képtömörítési eljárásnál, úgy a tulajdonképpeni tömörítést kvantálással végzik. Ehhez a DCT együtthatókat osztják a kvantálási mátrix elemeivel, majd veszik az alsó egészrészét:


F^Q(x,y) = \left\lfloor \frac{F(x,y)}{Q(x,y)} \right\rfloor

A kvantálási mátrix felel a megadott minőségért és a tömörítési arányért. Ez a mátrix a JPEG fájl fejlécében is szerepel DQT-markerként.

A kvantálási mátrix optimális esetben megfelel az emberi szem jellegzetességeinek. Mivel a durvább szerkezetekre érzékenyebb, ezért ezekre a kvantálási mátrixban kisebb számok szerepelnek.

Példa a kvantálási mátrixra és alkalmazása a 8x8-as blokkok DCT együtthatóira:



\begin{alignat}{2}
Q &=
\begin{bmatrix}
10  & 15  & 25  & 37  & 51  & 66  & 82  & 100 \\
15  & 19  & 28  & 39  & 52  & 67  & 83  & 101 \\
25  & 28  & 35  & 45  & 58  & 72  & 88  & 105 \\
37  & 39  & 45  & 54  & 66  & 79  & 94  & 111 \\
51  & 52  & 58  & 66  & 76  & 89  & 103 & 119 \\
66  & 67  & 72  & 79  & 89  & 101 & 114 & 130 \\
82  & 83  & 88  & 94  & 103 & 114 & 127 & 142 \\
100 & 101 & 105 & 111 & 119 & 130 & 142 & 156
\end{bmatrix}
\\
F &=
\begin{bmatrix}
 782{,}91 &  44{,}93 & 172{,}52 & -35{,}28 & -20{,}58 &  35{,}93 &   2{,}88 &  -3{,}85 \\
-122{,}35 & -75{,}46 &  -7{,}52 &  55{,}00 &  30{,}72 & -17{,}73 &   8{,}29 &   1{,}97 \\
  -2{,}99 & -32{,}77 & -57{,}18 & -30{,}07 &   1{,}76 &  17{,}63 &  12{,}23 & -13{,}57 \\
  -7{,}98 &  0{,}66  &   2{,}41 & -21{,}28 & -31{,}07 & -17{,}20 &  -9{,}68 &  16{,}94 \\
   3{,}87 &  7{,}07  &   0{,}56 &   5{,}13 &  -2{,}47 & -15{,}09 & -17{,}70 &  -3{,}76 \\
  -3{,}77 &  0{,}80  &  -1{,}46 &  -3{,}50 &   1{,}48 &   4{,}13 &  -6{,}32 & -18{,}47 \\
   1{,}78 &  3{,}28  &   4{,}63 &   3{,}27 &   2{,}39 &  -2{,}31 &   5{,}21 &  11{,}77 \\
  -1{,}75 &  0{,}43  &  -2{,}72 &  -3{,}05 &   3{,}95 &  -1{,}83 &   1{,}98 &   3{,}87
\end{bmatrix}
\\
F^Q &=
\begin{bmatrix}
78 &  3 &  7 & -1 &  0 &  1 &  0 &  0 \\
-8 & -4 &  0 &  1 &  1 &  0 &  0 &  0 \\
 0 & -1 & -2 & -1 &  0 &  0 &  0 &  0 \\
 0 &  0 &  0 &  0 &  0 &  0 &  0 &  0 \\
 0 &  0 &  0 &  0 &  0 &  0 &  0 &  0 \\
 0 &  0 &  0 &  0 &  0 &  0 &  0 &  0 \\
 0 &  0 &  0 &  0 &  0 &  0 &  0 &  0 \\
 0 &  0 &  0 &  0 &  0 &  0 &  0 &  0
\end{bmatrix}
\end{alignat}

Átrendezés és különbségi kódolás[szerkesztés | forrásszöveg szerkesztése]

A diszkrét koszinusztranszformáció 64 együtthatóját frekvencia szerint rendezik. Így cikkcakk alakban járják be őket, a 0 frekvenciájú résszel kezdve. Az egyenáram angol neve (direct current) alapján DC-nek is nevezik, és a közepes világosságot kódolja. Többnyire a nagy együtthatójú elemek kerülnek előre, és őket követik a kis együtthatós elemek. Ez optimalizálja a bemenetet a következő futamhossz alapú kódoláshoz. A sorrend számokkal így néz ki:

 1  2  6  7 15 16 28 29
 3  5  8 14 17 27 30 43
 4  9 13 18 26 31 42 44
10 12 19 25 32 41 45 54
11 20 24 33 40 46 53 55
21 23 34 39 47 52 56 61
22 35 38 48 51 57 60 62
36 37 49 50 58 59 63 64

Az első elemet a balszomszéd blokkhoz igazítják, így figyelembe veszik a szomszédok közötti kapcsolatot is.

A fenti példa átrendezés után a következő együtthatókat adja:

119  …
 78   3  -8  0 -4  7 -1  0 -1  0  0  0 -2  1  0  1  1 -1 0 …
102   5  -5  0  3 -4  2 -1  0  0  0  0  1  1 -1  0  0 -1 0 0 0 0 0 0 0 1 0 …
 75 -19   2 -1  0 -1  1 -1  0  0  0  0  0  0  1 …
132  -3  -1 -1 -1  0  0  0 -1  0 …

Az első együttható különbségi kódolásának eredménye:

-41   3  -8  0 -4  7 -1  0 -1  0  0  0 -2  1  0  1  1 -1 0 …
 24   5  -5  0  3 -4  2 -1  0  0  0  0  1  1 -1  0  0 -1 0 0 0 0 0 0 0 1 0 …
-27 -19   2 -1  0 -1  1 -1  0  0  0  0  0  0  1 …
 57  -3  -1 -1 -1  0  0  0 -1  0 …

A kép kevésbé részletgazdag területein az együtthatók így is kinézhetnek:

 35 -2  0 0 0 1 0 …
  4  0  1 0 …
  0  0  2 0 1 0 …
-13  0 -1 …
  8  1  0 …
 -2  0 …

Ezek a területek jobban leírhatók, mint a részletgazdag területek. A futamhossz kódolás is jobban tömöríti ezeket a régiókat.

Az együtthatók cikkcakkos elrendezése szabadalmi oltalom alatt állt Európában és Észak-Amerikában is. 2002-ben kiderült, hogy a védett eljárást már korábban alkalmazták, úgyhogy a szabadalmi védelem nem tartható fenn.[1] A szabadalmak időközben lejártak.

Lásd még[szerkesztés | forrásszöveg szerkesztése]

Külső hivatkozások[szerkesztés | forrásszöveg szerkesztése]