JPEG. Komprimeringsalgoritme

Og igen hej! Jeg har fundet denne artikel, der blev skrevet tilbage i maj 2019. Dette er en fortsættelse af en serie artikler om WAVE og JPEG, her er den første. Dette indlæg vil inkludere information om billedkodeks algoritmen og formatet generelt.

Et strejf af historie

En spiseskefuld fra Wikipedia:

JPEG (Joint Photographic Experts Group) er et af de mest populære rastergrafikformater, der bruges til at gemme fotografiske billeder og lignende billeder.

Denne standard blev udviklet af en samlet gruppe af fotografer tilbage i 1991 for effektiv komprimering af billeder.

Hvilken rejse går billederne fra rå format til JPEG

Nogle mener, at JPEG-billeder er rå data komprimeret ved hjælp af Huffman-kodning, men det er ikke sandt. Før den endelige komprimering, går dataene en lang vej.

Først ændres farvemodellen fra RGB til YCbCr. Der er endda en særligt algoritme til dette — her. Y ændres ikke, da den styrer lysstyrken, og en ændring vil være tydelig.

Det første, der gøres med billedet, er »subsampling« (subsampling). Det er enkelt at forstå: man tager et 2x2 pixelmatrix, derefter tages Cb og Cr — de gennemsnitlige værdier for hver af YCbCr komponenterne fra disse 4 pixels. Og derved, har vi vundet 6 byte, i stedet for 4 Y, 4 Cb, 4 Cr får vi 4 Y og de samme værdier for Cb og Cr for hver af dem (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 — 6 = 6). I skalaen af selv 2×2 lyder en kompression med tab med en kompressionsfaktor på 2:1 solidt. Dette anvendes på hele billedet. Og således — vi har halveret størrelsen. Og denne teknik kan vi bruge på grund af vores farveopfattelse. Mennesker vil let bemærke forskellen i lysstyrke, men ikke i farve, når den gennemsnitlige værdi er i en lille blok af pixels. Desuden kan subsampling udføres i linjer, 4 pixels horisontalt og vertikalt. Den første metode anvendes oftere. Hvis billedkvaliteten er vigtig, udføres subsampling slet ikke.
En visuel illustration af subsampling (Habr gav ikke lov til at indsætte gif) — https://i.ibb.co/Rg5Th9H/150953010617579181.gif

Hoveddelen af forberedelsen

DCT

Nu den mest komplekse og nødvendige del. Hele billedet opdeles i blokke på 8x8 (man anvender padding, hvis opløsningen ikke er et flertal af blokside længden).

Nu anvendes der DCT (Diskret Cosinus Transformation). I denne del fjernes alt overflødigt fra billedet. Ved hjælp af DCT skal man forstå, om denne blok (8×8) beskriver en monoton del af billedet: himmel, vægge; eller om den indeholder en kompleks struktur (hår, symboler osv.). Det giver mening, at 64 pixels, der ligner hinanden i farve, kan beskrives med blot 1, da størrelsen på blokken allerede er kendt. Her har du kompression: 64 til 1.

DCT omdanner blokken til et spektrum, og hvor målingerne skifter pludseligt, bliver koefficienten positiv, og jo skarpere overgangen er, jo højere vil udfaldet være. Hvor koefficienten er højere, er der klare overgange i farve og lysstyrke på billedet, mens der er svagere (bløde) ændringer i komponenterne YCbCr i blokken, hvor den er lavere.

Kvantisering

Her anvendes kompressionsindstillinger. Hver koefficient i hver af 8×8 matricerne divideres med et bestemt tal. Hvis du ikke længere vil reducere billedkvaliteten efter alle dets modifikationer, bør divideren være 1. Hvis du prioriterer hukommelsen, der kræves til dette billede, vil divideren være større end 1, og kvotienten afrundes. Det viser sig, at der efter afrundingen ofte opstår mange nuller.

Kvantisering udføres for at muliggøre endnu større kompression. Sådan ser det ud i eksemplet med kvantisering af grafen y = sin(x):

JPEG. Komprimeringsalgoritme

Komprimering

Først går vi gennem matricen zig-zag:

JPEG. Komprimeringsalgoritme

Vi får et endimensionelt array med tal. Vi kan se, at der er mange nuller i det, som kan fjernes. I stedet for rækkefølgen af mange nuller indsætter vi 1 nul og efter det et tal, der angiver deres antal i rækken. På denne måde kan den samlede størrelse på arrayet reduceres til 1/3. Derefter komprimeres dette array blot med Huffman-metoden og skrives ind i selve filen.

Hvor det bruges

Overalt. Ligesom PNG anvendes JPEG i kameraer, operativsystemer (som virksomhedens logoer, app-ikoner, thumbnails) og i alle mulige områder, hvor det er nødvendigt at opbevare billeder effektivt.

Output

I øjeblikket er viden om JPEG kun værdifuld til uddannelsesmæssige formål, da det allerede er indbygget overalt og optimeret af store grupper af mennesker, men videnskabens granit er stadig lækker.

Kilder

Artikel om YCbCr på Wikipedia
Artikel om JPEG på Wikipedia
Lidt om DCT fra et indlæg på Pikabu
Artikel om DCT på Wikipedia

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster