Jeg vet at et 24-biters bilde dedikerer 8 bit hver for R, G og B. Er det bare for RGB-fargerom. Hvordan fordeles bitene i YCbCr-fargerom for et 24-bit JPEG-bilde?
Jeg vet at et 24-biters bilde dedikerer 8 bit hver for R, G og B. Er det bare for RGB-fargerom. Hvordan fordeles bitene i YCbCr-fargerom for et 24-bit JPEG-bilde?
En JPEG kan starte med 8 bits per R-, G- og B-kanal, men når den er lagret i JPEG, lagres den veldig annerledes, der det ikke er noen reell "bitdybde", men i stedet lagres verdier som frekvenskoeffisienter for en gitt presisjon.
I JPEG er det som er mer relevant kvantiseringshastigheten , som påvirker hvor mye informasjon som kastes under kvantiseringsfasen av komprimering og dermed hvor presis hver koeffisient er. Denne kvantiseringshastigheten er satt av "kvalitet" -innstillingen når du lagrer en JPEG i photoshop. Det er ikke relatert til bitdybden som i et rasterbilde, og du kan til og med si at et JPEG-bilde ikke har litt dybde mens det er i JPEG-format, selv om JPEG-kodere / dekodere starter med / slutter med en 24-bit rasterbilde.
Den andre viktige faktoren som er viktig for å lagre en JPEG, er chroma sub-sampling type . I en JPEG har du muligheten til å halvere den horisontale, eller både den horisontale og vertikale, oppløsningen til fargekanalene (Pr og Pb) i forhold til luminans (lyshetskanalen). Når dekomprimeringen blir interpolert, er fargekanalene interpolert, og i de fleste fotografiske emnene gjør det ikke stor forskjell.
Her er en grov oppsummering av hvordan et bilde blir omgjort til en JPEG.
RGB-verdier konverteres til Y-, Pb-, Pr-verdier. YPbPr-fargeplassen er bedre egnet for effektiv komprimering fordi den kun inneholder informasjon om luminans, som har mest detaljer, i en kanal. Denne konverteringen er en enkel aritmetisk operasjon som er helt reversibel, bortsett fra hvis det er noen avrundingsfeil.
Hvis du bruker noen kromundersampling (med andre ord, bruker noe annet enn 4: 4: 4-modus), så blir den vertikale og / eller horisontale oppløsningen til bare Pb- og Pr-kanalene halvert. Dermed vil disse kanalene ha forskjellige pixeldimensjoner enn luminanskanalen. Dette fører til permanent tap av oppløsning i fargekanalene.
For hver kanal er bildet delt opp i blokker på 8 piksler med 8 piksler, noe som gir 64 lineære verdier for hver slik blokk i hver kanal. Hvis en kanal ikke er et multiplum på 8 piksler i begge dimensjoner, gjentas kantpikslene (og vil bli kastet ut når dekomprimering - JPEG-komprimering er dermed alltid mer effektiv med dimensjoner som er multipler på 8 piksler, eller 16 hvis du faktor i chroma-undersampling).
De 64 verdiene i hver blokk gjennomgår en transformasjon fra romdomenet til frekvensdomenet, i dette tilfellet kalt en diskret cosinustransformasjon. Du ender opp med 64 koeffisienter, som hver representerer amplituden til et bestemt frekvenskart over området tatt av den blokken. Den første verdien er den laveste frekvensen, som faktisk er gjennomsnittsverdien for alle piksler, helt frem til de siste verdiene som beskriver den høyeste frekvenskomponenten i blokken. De tidligere verdiene avviker mye mer, og er viktigere for utseendet på det endelige bildet enn de senere verdiene i en blokk. Denne operasjonen er helt reversibel så lenge du bruker nok presisjon.
Så er det kvantiseringstrinnet, hvor hver av de 64 koeffisientene du kom til i forrige trinn er delt med noe tall (kalt kvantiseringsfaktor), og resten kastes ut. Det er her nøyaktigheten til prøvene påvirkes mest, men det er her du får de enorme plassbesparelsene fra JPEG sammenlignet med tapsfri komprimering. Siden alt er i frekvensdomenet siden forrige transformasjon, gjør dette nøyaktighetstapet sitt beste for å bevare perseptuell bildekvalitet enn å bare redusere bitdybde / nøyaktighet av piksler før denne transformasjonen. Det motsatte av denne prosedyren er rett og slett å multiplisere med det samme tallet du delte koeffisientene med, men siden du kastet resten, ender du selvfølgelig med mindre presisjon av koeffisientene. Dette resulterer i permanent tap av kvalitet, men ikke på pixel-for-pixel-basis, men påvirker 8x8-blokken som helhet i henhold til frekvensmønsteret til disse koeffisientene.
Etter denne kvantiseringen er det typisk for mange av de senere, mindre signifikante koeffisientene å være null, så disse blir kastet ut. Deretter koder en (tapsfri) kodende rutine med variabel lengde alle gjenværende koeffisienter på en effektiv måte, selv om hver enkelt kan bruke et annet antall biter.
Det er umulig å si at en viss kvantiseringsfaktor tilsvarer en viss bitdybde siden kvantisering ikke gir bånd som når du reduserer bitdybden, men i stedet gir et generelt perseptuelt tap i detalj, og begynner i delene der du vil merke det mindre fordi det er med så lav amplitude for frekvensen.
Det er noen formater for YCbCr. generelt sett er øyet mer følsomt for endringer i luminans (Y, lysstyrke) enn for endringer i kroma (Cb, Cr, farge). Dermed er det mulig å slette litt kromainformasjon mens man beholder bildekvaliteten.
Dermed er det dyreste formatet 4: 4: 4, hvor det for hver luma (Y) -komponent er 1 rød forskjell (Cr) og en blå forskjell (Cb) -komponenter.
Deretter, ved å bruke prinsippet jeg nevnte, er det 4: 2: 2 hvor det for hver 2 Y-komponenter er 1 Cb og 1 Cr. Og det går enda lenger til 4: 1: 1 og 4: 2: 0 osv. Mer info her.
Å representere chroma (Cb Cr) i separate kanaler fra lumaen (Y) har en annen positiv effekt på kompresjonen. Det meste av den synlige informasjonen er i luma-kanalen. Menneskelige øyne tåler både lavere romlig oppløsning og mer aggressiv kvantisering i kromkanalene. Så et aggressivt komprimert bilde kan ende opp med å forbruke omtrent 10% av filplassen til chroma, og resten for luma, og fremdeles se anstendig ut.
På slutten av dagen er det fortsatt tapsfri komprimering.
Cirka 8 bits for hver kanal, men det er flere litt forskjellige måter å gjøre det på. Detaljene er gitt i Wikipedia-artikkelen på YCbCr.