Spørsmål:
Hvordan er YCbCr-fargearealet representert i et JPEG-bilde?
user3720
2011-02-06 02:22:25 UTC
view on stackexchange narkive permalink

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?

Fire svar:
thomasrutter
2011-02-07 12:57:54 UTC
view on stackexchange narkive permalink

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.

  1. 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.

  2. 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.

  3. 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).

  4. 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.

  5. 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.

  6. 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.

Jeg tror hjernen min bare eksploderte.
Chroma-undersampling resulterer ikke bare i "tap av oppløsning". Den introduserer veldig merkbare gjenstander, spesielt i den røde kanalen.
@Mark Ransom er disse gjenstandene ikke noe annet enn et resultat av å halvere oppløsningen i fargekanalene, og av interpolasjonen som er nødvendig for å redegjøre for det etter dekompresjon. Det bør aldri produsere noen "merkbare gjenstander" annet enn det som er forårsaket av uskarphet av oppløsningen, selv om det kan eksistere noen dekodere som skru opp denne interpolasjonen eller gjør veldig enkel nærmeste interpolasjon, noe som resulterer i blokkering som er ganske merkbar for rødt detaljer på svart (eller magenta på blå, osv.). Dette var for eksempel et vanlig problem på noen tidlige DVD-spillere.
Jeg tror ikke jeg noen gang har sett en bedre, lettere å forstå forklaring på jpeg - eller veldig tapsfull - bildekomprimering. bestemt +1
Beklager, jeg mente ikke å antyde at undersamplingen forårsaker gjenstandene. Det er bare at eksisterende feil fra kvantisering blir sprengt 2X, noe som gjør dem mye mer synlige. Jeg tror det er viktig å vite at den synlige effekten av undersampling er mer enn bare litt uklarhet.
Ja du har rett. Du må velge en passende kvantiseringsfaktor / kvalitetsinnstilling, og hvis du gjør noen chroma-delprøver som kan påvirke ditt valg.
ysap
2011-02-06 03:05:19 UTC
view on stackexchange narkive permalink

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.

Disse mønstrene ser ut til å referere til frekvenssampling for video, ikke JPEG-koding.
@whuber: De brukes ofte til å diskutere videokoding, men JPEG støtter også luminans med dobbelt oppløsning av krominans. I tilfelle av JPEG er det valgfritt skjønt - chroma kan være enten fulloppløselig eller halvoppløselig.
GIMP vil bruke chroma-undersampling som standard når du lagrer en JPEG, selv om det er lett å overstyre. Kan ikke huske om dette også gjelder Photoshop.
@thomasrutter, Photoshop velger delprøven basert på kvalitetsinnstillingen du velger. Det er ikke et uavhengig alternativ.
Tallene refererer forresten til antall prøver per 4 horisontale piksler for Y, Pr og Pb. Så 4: 4: 4 betyr at alle tre kanalene prøver hver piksel; 4: 2: 2 betyr at Pr- og Pb-kanalene bare prøver hver annen piksel horisontalt; 4: 1: 1 (jeg tror ikke dette noen gang blir brukt i fotografering, bare i video) betyr at Pr og Pb bare prøver hver fjerde piksel horisontalt. 4: 2: 0 er et spesielt avvik fra denne regelen. Det betyr IKKE at det ikke er noen Pb-kanal. Hva det betyr er at Pr- og Pb-kanalene halveres i * både * horisontal og vertikal retning, ikke bare horisontal.
Jeg har referert til Y Pb Pr når den i digital form vanligvis kalles Y Cb Cr.
O. Jones
2011-02-06 04:26:47 UTC
view on stackexchange narkive permalink

Å 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.

whuber
2011-02-06 03:42:42 UTC
view on stackexchange narkive permalink

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.

Dette sto i spørsmålet. Gi et mer detaljert svar.
@Nick Hvor ble "dette" uttalt i spørsmålet, nøyaktig? Spørsmålet, slik det ser ut nå, sier "Hvordan fordeler bitene seg i YCbCr-fargeplass for et 24-bit JPEG-bilde?" Jeg har sagt hvordan de fordeles, forutsatt - som alle som forstår spørsmålet ville - at kanalene er Y, Cb og Cr. Svaret mitt er et riktig sammendrag av Wikipedia-artikkelen. SE-policyen er å gi sammendrag i stedet for å kopiere materiale i engros (selv om det er enkelt, innrømmer jeg, å gi noen grenseeksempler på lange sitater andre steder på dette nettstedet).
Jeg tror denne typen svar, selv om den ikke er så bra som en fullstendig forklaring, er mye bedre enn en som bare klipper og limer fra Wikipedia, eller til og med som omskriver en hel Wikipedia-artikkel. Hvis Wikipedia er bra, er det nyttig å fortelle folk om det. Og hvis det er _all_, bidrar svaret ditt, det å være på forhånd og bare gi et raskt sammendrag og en lenke er akkurat den rette tingen å gjøre.


Denne spørsmålet ble automatisk oversatt fra engelsk.Det opprinnelige innholdet er tilgjengelig på stackexchange, som vi takker for cc by-sa 2.0-lisensen den distribueres under.
Loading...