JPEG. Pakkausalgoritmi

Hei taas! Löysin tämän artikkelin kirjoitetun toukokuussa 2019. Tämä on jatkoa artikkelisarjalle WAVE- ja JPEG-tiedostoista ensimmäinen. Tämä julkaisu sisältää tietoa kuvan koodausalgoritmista ja itse formaatista kokonaisuudessaan.

Hieman historiaa

Ruokalusikallinen Wikipedia-artikkelia:

JPEG (Joint Photographic Experts Group) on yksi suosituimmista rasterigrafiikkaformaateista, joita käytetään valokuvien ja vastaavien kuvien tallentamiseen.

Joint Photographic Experts Group kehitti tämän standardin vuonna 1991 tehokkaan kuvanpakkauksen takaamiseksi.

Miten kuvat muuttuvat raw-kuvista JPEG-muotoon?

Jotkut ihmiset ajattelevat, että JPEG-kuvat ovat raakadataa, joka on pakattu Huffman-menetelmällä, mutta tämä ei pidä paikkaansa. Ennen ohjauspakkausta data kulkee pitkän matkan.

Ensin värimalli vaihdetaan RGB:stä YCbCr:ksi. Tätä varten on jopa erityinen algoritmi - täällä. Y:tä ei kosketa, koska se on vastuussa kirkkaudesta, ja sen muutos on havaittavissa.

Ensimmäinen asia, joka liittyy kuvaan, on "harvennus" (alinäytteenotto). Se on helppo ymmärtää: otetaan 2x2 pikselimatriisi, sitten otetaan Cb ja Cr - näiden 4 pikselin kunkin YCbCr-komponentin keskiarvot. Niin, voitimme 6 tavua, 4 Y, 4 Cb, 4 Cr sijasta saimme 4 Y ja samat Cb ja Cr niille kullekin (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Jopa 2x2 mittakaavassa häviöllinen pakkaus 2:1-pakkaussuhteella kuulostaa vakaalta. Tämä koskee koko kuvaa. Ja niin - ne putosivat puoleen kokoon. Ja voimme käyttää tätä tekniikkaa värin havaitsemisen ansiosta. Ihminen huomaa helposti eron kirkkaudessa, mutta ei värissä, jos se lasketaan keskiarvosta pienelle pikselilohkolle. Harvennus voidaan tehdä myös viivana, 4 pikseliä vaaka- ja pystysuunnassa. Ensimmäistä vaihtoehtoa käytetään useammin. Jos kuvan laatu on tärkeä, desimointia ei suoriteta ollenkaan.
Visuaalinen esimerkki harvennuksesta (Habr ei antanut minun lisätä gifiä) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

Pääosa valmistelusta

Dkp

Nyt tulee vaikein ja tarpeellisin osa. Koko kuva on jaettu 8x8 lohkoihin (täyttöä käytetään, jos resoluutio ei ole lohkopuolen kerrannainen).

Käytä nyt jokaiseen lohkoon DCT (diskreetti kosinimuunnos). Tässä osassa kaikki tarpeeton on otettu pois kuvasta. DCT:tä käyttämällä sinun on ymmärrettävä, kuvaako tietty lohko (8×8) jotakin yksitoikkoista osaa kuvasta: taivasta, seinää; tai se sisältää monimutkaisen rakenteen (hiukset, symbolit jne.). On loogista, että 64 samanväristä pikseliä voidaan kuvata vain yhdellä, koska lohkon koko on jo tiedossa. Pakkauksesta vielä: 1-64.

DCT muuttaa lohkon spektriksi, ja kun lukemat muuttuvat jyrkästi, kertoimesta tulee positiivinen, ja mitä terävämpi siirtymä, sitä korkeampi lähtö on. Missä kerroin on suurempi, kuvassa näkyy selkeät siirtymät värissä ja kirkkaudessa, missä se on pienempi - heikkoja (tasaisia) muutoksia lohkon YCbCr-komponenttien arvoissa.

Kvantisointi

Pakkausasetukset on jo käytössä täällä. Jokainen kerroin kussakin 8x8 matriisissa on jaettu tietyllä luvulla. Jos et alenna kuvanlaatua kaikkien sen muutosten jälkeen, jakajan tulee olla yksi. Jos tämän kuvan käyttämä muisti on sinulle tärkeämpi, jakaja on suurempi kuin 1 ja osamäärä pyöristetään. Osoittautuu, että pyöristyksen jälkeen päädyt usein paljon nollia.

Kvantisointi tehdään vielä suuremman pakkauksen mahdollisuuden luomiseksi. Tältä se näyttää käyttämällä esimerkkiä graafin kvantisoinnista y = sin(x):

JPEG. Pakkausalgoritmi

puristus

Ensin käydään matriisin läpi siksak-kuviolla:

JPEG. Pakkausalgoritmi

Saamme yksiulotteisen taulukon numeroilla. Näemme, että siinä on paljon nollia, ne voidaan poistaa. Tätä varten useiden nollien sekvenssin sijasta syötetään 1 nolla ja sen jälkeen numero, joka osoittaa niiden numeron sekvenssissä. Tällä tavalla voit nollata 1/3 koko taulukon koosta. Ja sitten yksinkertaisesti pakkaamme tämän taulukon käyttämällä Huffman-menetelmää ja kirjoitamme sen itse tiedostoon.

Missä käyttää

Joka paikassa. Kuten PNG, JPEG-muotoa käytetään kameroissa, käyttöjärjestelmissä (yrityslogoina, sovelluskuvakkeina, pikkukuvina) ja kaikilla mahdollisilla alueilla, joilla kuvia on tallennettava tehokkaasti.

johtopäätös

JPEG-tieto on tällä hetkellä arvokasta vain opetustarkoituksiin, koska se on jo kaikkialla sisäänrakennettuna ja suurten ihmisryhmien optimoima, mutta tieteen graniitti maistuu silti.

lähteet

Artikkeli YCbCr:stä Wikipediassa
Wikipedian artikkeli JPEG-muodossa
Hieman PrEP:stä Pikabu-postauksesta
Wikipedian artikkeli PrEP:stä

Lähde: will.com

Lisää kommentti