Kuvanpakkauksen ymmärtäminen

Julius Uy
Julius Uy

Seuraa

19. huhtikuuta, 2019 – 7 min read

Taannoin 1980-luvulla Microsoft kehitti bittikarttojen kuvien renderöintiratkaisun, joka oli laiteagnostinen: BMP-tiedostomuodon.¹ Ne, jotka käyttivät aiemmin Microsoft Paintia, nauttivat yksinkertaisista viivoituksista ja väritäytöistä syntyneistä jättimäisistä tiedostokokoista.

BMP-tiedostomuodon ideana on, että jokaiselle pikselille annetaan väriarvo. Jos minulla on siis 480×360-bittikartta, joka tukee 16 miljoonaa väriä (24 bittiä), bittikartan koko olisi lopulta jossain 4 Mt:n yläpuolella.

Kuvio 1 – Bittikarttakuvatiedoston rakenne (https://en.wikipedia.org/wiki/BMP_file_format)

Tämä ei ole luonnollisestikaan ihanteellista, jos halutaan renderöidä useita korkealaatuisia kuvia. Näin ollen on esitettävä kysymys. ”Onko olemassa keino optimoida bittikarttaesitys siten, että kuvan visuaalinen eheys säilyy, mutta resursseja käytetään vähemmän?”

Vastaus on kyllä. On käynyt ilmi, että suurimmaksi osaksi käyttäjät ovat enemmän kiinnostuneita kuvista visuaalisena apuvälineenä kuin perusteellisuudesta. Oletetaan esimerkiksi, että minulle annetaan seuraavanlainen kuva Golden Gate -sillasta:

Kuva 2 – Golden Gate -silta

Vaikkakin tiedän, että todellisessa sillassa, kun sen näkee kasvokkain, on paljon yksityiskohtaisempia yksityiskohtia, se, mitä näen tässä kuvassa, riittää hyvin tarkoitukseen. Useimmat ihmiset ovat siis itse asiassa valmiita tinkimään visuaalisesta eheydestä nopeuden hyväksi, kunhan kompromissi on hyväksyttävä. Jos esimerkiksi subjektiivisen visuaalisen laadun heikkeneminen on 1 %, mutta käyttäjä saa nauttia 90 %:n tilansäästöstä, se on suurimmaksi osaksi tervetullut kauppa.

Yksi tärkeimmistä bittikarttojen pakkaamiseen liittyvistä näkökohdista on siis visuaalisen erottamattomuuden optimointi. Toisin sanoen poistamalla kuvasta tietyt elementit, joiden eroa paljain silmin ei pysty tunnistamaan. Tätä kutsutaan häviölliseksi pakkaukseksi, joka muodostaa useimmat pakkaustyypit, joita näkee videon suoratoistossa verkkokuvissa. Näin toimivat H.264-, HEVC-, HEIF- ja JPEG-koodekit.

Kuvio 3 – Kuvanpakkaus optimoi visuaalisen erottamattomuuden

Muita kuvatyyppejä, kuten PNG-kuvia, pakataan häviöttömästi. Ideana on, että säilytetään alkuperäisen kuvan täysi visuaalinen eheys, mutta kulutetaan vähemmän tavuja saman asian esittämiseen. On kuitenkin muitakin tiedostomuotoja, kuten WebP, joka tukee sekä häviöllistä että häviötöntä pakkausta. Miksi haluamme pakata asioita häviöttömästi? Kuten edellä, se perustuu siihen, mitä haluamme saavuttaa kuvassa. Esimerkiksi sovellusten kuvakkeet ovat yleensä PNG-muodossa (ja viime aikoina myös vektorigrafiikkamuodossa).

Häviötön kuvapakkaus koostuu suuremmasta tiedostokoosta verrattuna häviölliseen pakkaukseen. Syynä on ensisijaisesti se, että edellisen pakkaamiseen on vähemmän keinoja kuin jälkimmäisen. Tässä blogissa puhutaan häviöllisestä pakkauksesta.

Kuvio 4 – Yleiskatsaus JPEG-pakkaukseen

Yleiset vaiheet, jotka on otettu käyttöön JPEG-pakkauksessa, on tehty tänäkin päivänä videon pakkauksessa. Vuosien varrella algoritmi on parantunut, mutta yleiset käsitteet ovat pysyneet samoina.

VAIHE 1. Väriavaruuden muuntaminen

Kuvan muuntaminen aloitetaan muuntamalla raakakuvan RGB-muoto sen Chroma- (r ja b) ja Luminanssi- (Y) arvoihin. Ajatuksena on, että silmämme ovat herkempiä valovoiman muutoksille kuin väreille. Näin ollen pystymme itse asiassa pienentämään kuvan värivalikoimaa ilman, että kuvan visuaaliseen laatuun on havaittavaa vaikutusta. Tämä tehdään Chroma Subsampling -menetelmällä, joka selitetään alla.

VAIHE 2. Chroma Subsampling

Monet pelaajat saattavat muistaa, että subsampling on yksi niistä mahdollisista säätimistä, joita he voivat asettaa optimoidakseen pelikokemuksensa. Pääajatuksena on, että mitä enemmän subsamplingia tehdään, sitä nopeampi on pelisuorituskyky. Tämä johtuu siitä, että peli tarvitsee vähemmän värivalikoimaa renderöidäkseen.

Chroma subsampling merkitään J:a:b:llä, jossa J on subsamplattavien pikselien määrä, a edustaa ylärivin pikseleitä ja b alarivin pikseleitä.

Kuvio 5 – Chroma Subsampling

Tapauksessa 4:4:4:4 se tarkoittaa sitä, että 4×2 pikselin kokoisessa pikselikuvassa ensimmäisellä rivillä (a) on oltava neljä väriä, ja niin on myös toisella rivillä. Kun kyseessä on 4:2:2, se tarkoittaa, että 4×2-pikselissä ensimmäisellä rivillä on oltava kaksi väriä ja toisella rivillä myös kaksi väriä. Kun kyseessä on 4:2:0, se tarkoittaa, että 4×2 pikseliä sisältävässä kuvassa ensimmäinen rivi on esitettävä kahdella värillä ja toinen rivi kopioi sen, mikä on ensimmäisellä rivillä.

Kuten huomaatte, chroma subsamplingin avulla värivalikoimaa voidaan pienentää jopa 75 %:lla.

VAIHE 3. Diskreetti kosinitransformaatio

JPEG-pakkaus tehdään viipaloimalla alkuperäiskuva 8×8 pikseliä käsittäviin osiin. Tässä vaiheessa 8×8 lohkolle määritetään kertoimet alla esitettyjen signaalien perusteella.

Kuva 6 – Diskreetti kosinimuunnos (DCT). Vasen kuva on 8×8-signaalin referenssi, jota käytetään alkuperäisen kuvan painottamiseen. Oikeanpuoleinen kuva on DCT:n läpikäymisen jälkeen saatu kappale.

Ajatuksena tässä on se, että mitä enemmän ihmissilmä siirtyy DCT-viitteen vasemmasta yläreunasta oikeaan alareunaan, sitä vaikeampi sitä on havaita. Niinpä yleensä tapahtuu niin, että kertoimia määritettäessä vasen yläkulma saa hyvin korkean arvon, ja se laskee, kun siirrytään diagonaalisesti alaspäin.

Tältä asiat voisivat näyttää numeerisessa muodossa:

Kuvio 7 – Alkuperäinen kimpale (vasemmalla) Uusi kimpale DCT:n soveltamisen jälkeen (oikealla)

VAIHE 4. Kvantisointi

DCT:n soveltamisen jälkeen seuraava vaihe on kvantisointi. Tässä tuloksena saatuihin DCT-arvoihin sovelletaan kvantisointitaulukkoa. Taulukko vaihtelee pakkausalgoritmien välillä, ja joidenkin ohjelmistojen avulla käyttäjä voi asettaa haluamansa kvantisoinnin määrän. Alla on standarditaulukko:

Kuva 8 – Standardi kvantisointitaulukko

Huomaa, että numerot nousevat korkeammiksi siirryttäessä vasemmalta ylhäältä oikealle. Tämä on tarkoituksellista. Kvantisoinnin ideana on, että DCT:stä saatu data jaetaan kvantisointitaulukon avulla. Tällöin pakattu kuva menettää paljon dataa. Koska oikean alakulman luvut ovat korkeita, suurin osa sen arvoista muuttuu lopulta nollaksi jakamisen jälkeen. Näin se voi näyttää:

Kuvio 9. Kvantisointitaulukko (vasemmalla) Tulosarvot (oikealla)

VAIHE 5. Entropiakoodaus Huffman-koodauksen avulla

Huffman-koodaus on pakkauksen viimeinen vaihe. Näin se toimii.

Esitellään, että haluan esittää lukujonon bittien avulla. Lisäksi haluan esittää ne siten, että kulutan esitykseen mahdollisimman vähän bittejä. Se voitaisiin tehdä siten, että hyvin toistuville luvuille annetaan pienemmät bitit. Jos esimerkiksi nollaa esitetään paljon, annan sille yleensä pienempiä bittejä. Perusteellisempi selitys Huffman-koodauksesta löytyy täältä.

Ajatuksena tässä on se, että käytät vähemmän bittejä pitemmän arvojoukon esittämiseen. Huffman-koodaus on häviötön pakkausalgoritmi, jota käytetään myös tekstitiedostojen pakkaamisessa. Näin toimimalla on mahdollista säästää jopa 50 % alkuperäisestä koosta.

Mitä seuraavaksi?

Pakkaaminen on vain yksi osa yhtälöä. Kun kuva joudutaan renderöimään, on pakkausprosessi käännettävä päinvastaiseksi, ennen kuin kuva voidaan renderöidä ruudulle.

JPEG-kuvat ovat noin 90 % pienempiä kuin bittikarttakuvakuvansa. Vielä tänäkin päivänä se on suosituin saatavilla oleva kuvapakkausmuoto. Uudemmat algoritmit, kuten HEIF (2013) ja AVIF (2018), lisäävät pikselivalikoimaa, jota voidaan käyttää pakkausalgoritmissa.²

JPEG:n suosiosta huolimatta uudemmat formaatit tarjoavat parempaa pakkausta. Esimerkiksi WebP on yleisesti ottaen noin 70 % pienempi kuin JPEG ja pystyy silti säilyttämään kuvan visuaalisen eheyden. Siksi Google (WebP:n kehittänyt yritys) on kannustanut kehittäjiä koodaamaan kuvansa uudelleen JPEG:stä WebP:hen. WebP:n tuki on kuitenkin edelleen vähäisempää kuin JPEG:n. Näin ollen molempien formaattien tukeminen on välttämätöntä.”

¹ ”BMP-tiedostomuoto.” Prepressure. Luettu 19. huhtikuuta 2019. https://www.prepressure.com/library/file-formats/bmp.

² Netflix julkaisi ensimmäisen AVIF-kuvasarjan vuonna 2018. Tätä viestiä kirjoitettaessa kuvat ovat edelleen saatavilla täällä. Firefoxin ja Microsoftin kaltaiset yritykset tukevat tätä kuvaa pian ohjelmistotarjonnassaan.

Vastaa

Sähköpostiosoitettasi ei julkaista.