YUV- YUV

Beispiel für eine UV-Farbebene, Y′-Wert = 0,5, dargestellt im RGB-Farbraum
Ein Bild zusammen mit seinen Y′-, U- bzw. V-Komponenten

YUV ist ein Farbcodierungssystem, das typischerweise als Teil einer Farbbildpipeline verwendet wird . Es kodiert ein Farbbild oder ein Video unter Berücksichtigung der menschlichen Wahrnehmung , wodurch eine reduzierte Bandbreite für Chrominanzkomponenten ermöglicht wird, wodurch typischerweise Übertragungsfehler oder Kompressionsartefakte durch die menschliche Wahrnehmung effizienter maskiert werden können als bei einer "direkten" RGB-Darstellung. Andere Farbkodierungen haben ähnliche Eigenschaften, und der Hauptgrund für die Implementierung oder Untersuchung von Y′UV-Eigenschaften wäre die Anbindung an analoges oder digitales Fernsehen oder fotografische Ausrüstung, die bestimmten Y′UV-Standards entspricht.

Das Y′UV-Modell definiert einen Farbraum in Form einer Luminanzkomponente (Y′) und zweier Chrominanzkomponenten , die als U (Blauprojektion) bzw. V (Rotprojektion) bezeichnet werden. Das Y′UV-Farbmodell wird im PAL- Composite-Farbvideo - Standard (außer PAL-N ) verwendet. Frühere Schwarz-Weiß-Systeme verwendeten nur Luma-(Y′)-Informationen. Farbinformationen (U und V) wurden separat über einen Unterträger hinzugefügt, damit ein Schwarzweißempfänger weiterhin eine Farbbildübertragung im nativen Schwarzweißformat des Empfängers empfangen und darstellen kann .

Y′ steht für die Luma-Komponente (die Helligkeit) und U und V sind die Chrominanz-(Farb-)Komponenten; Luminanz wird mit Y und Luma mit Y′ bezeichnet – die Strichsymbole (') bezeichnen Gammakorrektur , wobei " Luminanz " physikalische Helligkeit im linearen Raum bedeutet, während " Luma " (nichtlineare) Wahrnehmungshelligkeit bedeutet.

Der Geltungsbereich der Begriffe Y′UV, YUV, YCbCr , YPbPr usw. ist manchmal mehrdeutig und überlappend. Historisch wurden die Begriffe YUV und Y′UV für eine spezifische analoge Codierung von Farbinformationen in Fernsehsystemen verwendet, während YCbCr für die digitale Codierung von Farbinformationen verwendet wurde, die für die Video- und Standbildkomprimierung und -übertragung wie MPEG und JPEG geeignet sind . Heute wird der Begriff YUV in der Computerindustrie häufig verwendet, um Dateiformate zu beschreiben , die mit YCbCr kodiert werden .

Das im analogen Komponentenvideo verwendete YPbPr-Farbmodell und seine im digitalen Video verwendete digitale Version YCbCr sind mehr oder weniger davon abgeleitet und werden manchmal als Y′UV bezeichnet. (C B /P B und C R /P R sind Abweichungen von Grau auf den Blau-Gelb- und Rot-Cyan-Achsen, während U und V die Blau-Luminanz- bzw. Rot-Luminanz-Differenzen sind.) Der in verwendete Y′IQ- Farbraum das analoge NTSC- Fernsehrundfunksystem ist damit verwandt, wenn auch in komplexerer Weise. Der YDbDr- Farbraum, der in den analogen Fernsehübertragungssystemen SECAM und PAL-N verwendet wird, ist ebenfalls verwandt.

Was die Etymologie angeht, sind Y, Y′, U und V keine Abkürzungen. Die Verwendung des Buchstabens Y für die Leuchtdichte ist auf die Wahl der XYZ- Primärfarben zurückzuführen. Dies bietet sich natürlich für die Verwendung des gleichen Buchstabens in Luma (Y′) an, was einem wahrnehmungsmäßig gleichförmigen Korrelat der Luminanz nahekommt. Ebenso wurden U und V gewählt, um die U- und V-Achsen von denen in anderen Räumen, wie dem x- und y-Farbraum, zu unterscheiden. Sehen Sie sich die folgenden Gleichungen an oder vergleichen Sie die historische Entwicklung der Mathematik.

Geschichte

Y′UV wurde erfunden, als Ingenieure Farbfernsehen in einer Schwarzweiß- Infrastruktur wollten . Sie benötigten eine Signalübertragungsmethode, die mit Schwarzweiß-Fernsehen (S/W) kompatibel ist und gleichzeitig Farbe hinzufügen kann. Die Luma-Komponente existierte bereits als Schwarz-Weiß-Signal; dazu gaben sie das UV-Signal als Lösung hinzu.

Die UV-Darstellung der Chrominanz wurde gegenüber reinen R- und B-Signalen gewählt, da U und V Farbdifferenzsignale sind. Mit anderen Worten, die U- und V-Signale weisen das Fernsehgerät an, die Farbe eines bestimmten Flecks (CRT-Displays haben keine diskreten Pixel) zu verschieben, ohne seine Helligkeit zu ändern. Oder die U- und V-Signale sagen dem Monitor, eine Farbe auf Kosten der anderen heller zu machen und um wie viel sie verschoben werden soll. Je höher (oder je niedriger, wenn negativ) die U- und V-Werte sind, desto gesättigter (bunter) wird der Fleck. Je näher die U- und V-Werte an Null kommen, desto weniger verschiebt sich die Farbe, was bedeutet, dass die roten, grünen und blauen Lichter gleich heller sind und einen graueren Fleck erzeugen. Dies ist der Vorteil der Verwendung von Farbdifferenzsignalen, dh anstatt zu sagen, wie viel Rot eine Farbe hat, sagt es, wie viel mehr Rot als Grün oder Blau ist. Dies wiederum bedeutete, dass, wenn die U- und V-Signale null oder nicht vorhanden sind, nur ein Graustufenbild angezeigt wird. Wenn R und B verwendet worden wären, hätten diese sogar in einer Schwarzweiß-Szene Werte ungleich Null, die alle drei datentragenden Signale erfordern. Dies war in den Anfängen des Farbfernsehens wichtig, da alte Schwarz-Weiß-TV-Signale keine U- und V-Signale hatten, was bedeutete, dass der Farbfernseher sie einfach als Schwarzweiß-Fernseher aus der Box anzeigen würde. Darüber hinaus könnten Schwarzweißempfänger das Y′-Signal aufnehmen und die U- und V-Farbsignale ignorieren, wodurch Y′UV abwärtskompatibel mit allen vorhandenen Schwarzweißgeräten, Ein- und Ausgängen, ist. Wenn der Farbfernsehstandard keine Farbdifferenzsignale verwendet hätte, könnte dies bedeuten, dass ein Farbfernseher aus einer Schwarzweißsendung lustige Farben macht oder zusätzliche Schaltkreise benötigt, um das Schwarzweißsignal in Farbe umzuwandeln. Dem Chrominanzkanal musste eine schmalere Bandbreite zugewiesen werden, da keine zusätzliche Bandbreite zur Verfügung stand. Wenn ein Teil der Luminanzinformationen über den Chrominanzkanal ankam (wie bei Verwendung von RB-Signalen anstelle von differentiellen UV-Signalen), wäre die Schwarzweiß-Auflösung beeinträchtigt worden.

Umwandlung in/von RGB

SDTV mit BT.470

Y′UV-Signale werden normalerweise aus einer RGB- Quelle ( Rot , Grün und Blau ) erzeugt. Gewichtete Werte von R, G und B werden summiert, um Y′ zu erzeugen, ein Maß für die Gesamthelligkeit oder Luminanz. U und V werden als skalierte Differenzen zwischen Y′ und den B- und R-Werten berechnet.

PAL und NTSC (NTSC verwendet ursprünglich YIQ ) Standards definieren die folgenden Konstanten, abgeleitet von BT.470 System M Primärfarben und Weißpunkt (genau wie später in BT.601 , obwohl es 1/2 anstelle von 0,436 und 0,615 verwendet):

Y′UV wird aus RGB (gamma-vorkorrigiertes R'G'B', nur SECAM IV verwendet lineares RGB) wie folgt berechnet:

Die resultierenden Bereiche von Y′, U bzw. V sind [0, 1], [– U max , U max ] und [– V max , V max ].

Die Umkehrung der obigen Transformation wandelt Y′UV in RGB um:

Äquivalent ergibt das Ersetzen von Werten für die Konstanten und das Ausdrücken als Matrizen diese Formeln für BT.470 System M (PAL):

Beachten Sie, dass es für kleine Y'-Werte möglich ist, negative R-, G- oder B-Werte zu erhalten. In der Praxis klemmen wir die RGB-Ergebnisse daher auf das Intervall [0,1].

HDTV mit BT.709

HDTV-Empf. 709 (ganz nah an SDTV Rec. 601) im Vergleich zu UHDTV Rec. 2020

Für HDTV hat die ATSC entschieden, die Grundwerte für W R und W B im Vergleich zu den zuvor gewählten Werten im SDTV-System zu ändern . Für HDTV werden diese Werte von Rec bereitgestellt . 709 . Diese Entscheidung wirkte sich weiter auf die Matrix für die Y′UV↔RGB-Umwandlung aus, so dass ihre Mitgliedswerte ebenfalls leicht unterschiedlich sind. Als Ergebnis sind bei SDTV und HDTV im Allgemeinen zwei verschiedene Y′UV-Darstellungen für jedes RGB-Triple möglich: eine SDTV-Y′UV- und eine HDTV-Y′UV-Darstellung. Dies bedeutet im Detail, dass bei einer direkten Konvertierung zwischen SDTV und HDTV die Luma (Y′)-Informationen ungefähr gleich sind, aber die Darstellung der Chroma-(U & V)-Kanalinformationen eine Konvertierung erfordert. Noch in der Abdeckung des Farbraums CIE 1931 die Rec. 709 Farbraum ist fast identisch mit Rec. 601 und deckt 35,9 % ab. Im Gegensatz zu diesem UHDTV mit Rec. 2020 deckt einen viel größeren Bereich ab und so wurde für YCbCr eine ganz eigene Matrix abgeleitet (kein YUV/Y′UV, seit Stilllegung des analogen Fernsehens).

BT.709 definiert diese Gewichtswerte:

Die und Werte sind von oben.

Die Umrechnungsmatrizen für BT.709 sind diese:

Anmerkungen

  • Die zur Berechnung von Y′ (obere Matrixzeile) verwendeten Gewichte sind identisch mit denen, die im Y′IQ- Farbraum verwendet werden.
  • Gleiche Werte von Rot, Grün und Blau (dh Graustufen) ergeben 0 für U und V. Schwarz, RGB=(0, 0, 0) ergibt YUV=(0, 0, 0). Weiß, RGB=(1, 1, 1), ergibt YUV=(1, 0, 0).
  • Diese Formeln werden traditionell in analogen Fernsehgeräten und Geräten verwendet; digitale Geräte wie HDTV und digitale Videokameras verwenden Y′CbCr.

Numerische Näherungen

Vor der Entwicklung schneller SIMD- Gleitkommaprozessoren verwendeten die meisten digitalen Implementierungen von RGB → Y′UV ganzzahlige Mathematik, insbesondere Festkomma- Approximationen. Approximation bedeutet, dass die Genauigkeit der verwendeten Zahlen (Eingabedaten, Ausgabedaten und konstante Werte) begrenzt ist und daher ein Genauigkeitsverlust von typischerweise etwa der letzten Binärziffer von demjenigen akzeptiert wird, der diese Option in typischerweise einem Kompromiss zu . nutzt verbesserte Rechengeschwindigkeiten.

In den folgenden Beispielen bezeichnet der Operator " " eine Rechtsverschiebung von a um b binären Positionen. Zur Verdeutlichung verwenden die Variablen zwei Indexzeichen: "u" wird für die vorzeichenlose Enddarstellung verwendet und "t" wird für den verkleinerten Zwischenwert verwendet. Die folgenden Beispiele gelten nur für BT.601. Das gleiche Prinzip kann verwendet werden, um funktionsäquivalente Operationen unter Verwendung von Werten durchzuführen, die eine akzeptable Übereinstimmung mit Daten ergeben, die dem BT.709 oder einem anderen vergleichbaren Standard entsprechen.

Y′-Werte werden konventionell verschoben und auf den Bereich [16, 235] (als Studio-Swing oder "TV-Pegel" bezeichnet) skaliert, anstatt den vollen Bereich von [0, 255] (als Full-Swing oder "PC-Pegel" bezeichnet) zu verwenden "). Diese Praxis wurde in SMPTE-125M standardisiert, um Signalüberschwingungen ("Klingeln") aufgrund von Filtern zu berücksichtigen. Der Wert 235 berücksichtigt ein maximales Schwarz-Weiß-Überschwingen von 255 − 235 = 20 oder 20 / (235 − 16) = 9,1 %, was etwas größer ist als das theoretische maximale Überschwingen ( Gibbs-Phänomen ) von etwa 8,9 % der maximaler Schritt. Der Zehenraum ist kleiner und erlaubt nur 16 / 219 = 7,3% Überschwingen, was weniger als das theoretische maximale Überschwingen von 8,9 % ist. Aus diesem Grund wird 16 zu Y′ addiert und die Y′-Koeffizienten in der Basistransformation summieren sich zu 220 statt zu 255. U- und V-Werte, die positiv oder negativ sein können, werden mit 128 summiert, um sie immer positiv zu machen, was a . ergibt Studiobereich von 16–240 für U und V. (Diese Bereiche sind bei der Videobearbeitung und -produktion wichtig, da die Verwendung des falschen Bereichs entweder zu einem Bild mit "abgeschnittenen" Schwarz- und Weißtönen oder einem Bild mit niedrigem Kontrast führt.)

Studioschaukel für BT.601

Um die traditionelle "Studio-Swing" 8-Bit-Darstellung von Y′UV für SDTV/BT.601 zu erhalten, können die folgenden Operationen verwendet werden:

  1. Grundtransformation von 8-Bit-RGB- auf 16-Bit-Werte (Y′: vorzeichenlos, U/V: vorzeichenbehaftet, Matrixwerte wurden gerundet, so dass der später gewünschte Y′-Bereich von [16..235] und U/V-Bereich von [16..240] erreicht ist):
  2. Herunterskalieren („ >> 8“) auf 8 Bit mit Rundung („+128“) (Y′: vorzeichenlos, U/V: vorzeichenbehaftet):
  3. Fügen Sie den Werten einen Offset hinzu, um negative Werte zu eliminieren (alle Ergebnisse sind 8-Bit ohne Vorzeichen):

Voller Schwung für BT.601

Um eine "full-swing" 8-Bit-Darstellung von Y′UV für SDTV/BT.601 zu erhalten, können die folgenden Operationen verwendet werden:

  1. Grundtransformation von 8-Bit RGB auf 16-Bit Werte (Y′: vorzeichenlos, U/V: vorzeichenbehaftet, Matrixwerte wurden gerundet, so dass der später gewünschte Y′UV-Bereich von jedem [0..255] erreicht wird, während es kann kein Überlauf passieren):
  2. Herunterskalieren (">>8") auf 8-Bit-Werte mit Rundung ("+128") (Y′: vorzeichenlos, U/V: vorzeichenbehaftet):
  3. Fügen Sie den Werten einen Offset hinzu, um negative Werte zu eliminieren (alle Ergebnisse sind 8-Bit ohne Vorzeichen):

Luminanz-/Chrominanzsysteme im Allgemeinen

Der Hauptvorteil von Luma/Chroma-Systemen wie Y′UV und seinen Verwandten Y′IQ und YDbDr besteht darin , dass sie mit dem analogen Schwarzweißfernsehen kompatibel bleiben (hauptsächlich aufgrund der Arbeit von Georges Valensi ). Der Y′-Kanal speichert alle von Schwarz-Weiß-Kameras aufgezeichneten Daten und erzeugt so ein Signal, das für den Empfang auf alten Monochrom-Displays geeignet ist. In diesem Fall werden U und V einfach verworfen. Bei der Farbdarstellung werden alle drei Kanäle verwendet und die ursprünglichen RGB-Informationen können dekodiert werden.

Ein weiterer Vorteil von Y′UV besteht darin, dass ein Teil der Informationen verworfen werden kann, um die Bandbreite zu reduzieren . Das menschliche Auge hat eine relativ geringe räumliche Farbempfindlichkeit: Die Genauigkeit der Helligkeitsinformationen des Luminanzkanals hat weitaus mehr Einfluss auf die wahrgenommenen Bilddetails als die der beiden anderen. Um dieses menschliche Manko zu verstehen, reduzieren Standards wie NTSC und PAL die Bandbreite der Chrominanzkanäle erheblich. (Die Bandbreite liegt im zeitlichen Bereich, dies wird jedoch beim Ausscannen des Bildes in den räumlichen Bereich übersetzt.)

Daher können die resultierenden U- und V-Signale im Wesentlichen "komprimiert" werden. In den NTSC- (Y′IQ) und PAL-Systemen hatten die Chrominanzsignale eine wesentlich schmalere Bandbreite als die Luminanz. Frühe Versionen von NTSC wechselten schnell zwischen bestimmten Farben in identischen Bildbereichen, damit sie sich für das menschliche Auge addieren, während alle modernen analogen und sogar die meisten digitalen Videostandards Chroma-Subsampling verwenden, indem die Farbinformationen eines Bildes mit reduzierter Auflösung aufgezeichnet werden. Es wird nur die Hälfte der horizontalen Auflösung im Vergleich zur Helligkeitsinformation beibehalten (bezeichnet als 4:2:2-Chroma-Subsampling), und oft wird auch die vertikale Auflösung halbiert (was 4:2:0) entspricht. Der 4:x:x-Standard wurde aufgrund des allerersten Farb-NTSC-Standards übernommen, der eine Chroma-Unterabtastung von 4:1:1 verwendet (wobei die horizontale Farbauflösung geviertelt wird, während die vertikale die volle Auflösung hat), so dass das Bild nur a viertel so viel Farbauflösung im Vergleich zur Helligkeitsauflösung. Heute verwenden nur High-End-Geräte, die unkomprimierte Signale verarbeiten, ein Chroma-Subsampling von 4:4:4 mit identischer Auflösung für Helligkeits- und Farbinformationen.

Die I- und Q-Achsen wurden entsprechend der vom menschlichen Sehvermögen benötigten Bandbreite ausgewählt, wobei eine Achse die größte Bandbreite erforderte und die andere (zufälligerweise bei 90 Grad) die minimale. Die echte I- und Q-Demodulation war jedoch relativ komplexer und erforderte zwei analoge Verzögerungsleitungen, und NTSC-Empfänger verwendeten sie selten.

Diese Farbraumkonvertierung ist jedoch verlustbehaftet , insbesondere beim Übersprechen von der Luma- zur Chroma-führenden Leitung und umgekehrt bei analogen Geräten (einschließlich Cinch-Anschlüssen zur Übertragung eines digitalen Signals, da sie nur analoges Composite-Video übertragen) . ist entweder YUV, YIQ oder sogar CVBS ). Darüber hinaus kodierten NTSC- und PAL-Farbsignale in einer Weise, die bewirkt, dass sich Chroma- und Luma-Signale mit hoher Bandbreite miteinander vermischen, um die Abwärtskompatibilität mit Schwarzweiß-Fernsehgeräten aufrechtzuerhalten, was zu Dot-Crawl- und Cross-Color- Artefakten führt. Als der NTSC-Standard in den 1950er Jahren geschaffen wurde, war dies kein wirkliches Problem, da die Bildqualität durch die Monitorausrüstung und nicht durch das empfangene Signal mit begrenzter Bandbreite begrenzt war. Das moderne Fernsehen von heute ist jedoch in der Lage, mehr Informationen anzuzeigen, als in diesen verlustbehafteten Signalen enthalten sind. Um mit den Fähigkeiten der neuen Anzeigetechnologien Schritt zu halten, wurden seit den späten 1970er Jahren Versuche unternommen, während der Übertragung von Bildern mehr vom Y′UV-Signal zu erhalten, wie beispielsweise SCART- (1977) und S-Video (1987)-Anschlüsse.

Anstelle von Y′UV wurde Y′CbCr als Standardformat für (digitale) gängige Videokompressionsalgorithmen wie MPEG-2 verwendet . Digitales Fernsehen und DVDs bewahren ihre komprimierten Videostreams im MPEG-2-Format auf, das einen vollständigen Y′CbCr-Farbraum verwendet, obwohl das etablierte Verfahren der Chroma-Unterabtastung beibehalten wird. Das professionelle digitale Videoformat CCIR 601 verwendet auch Y′CbCr mit der üblichen Chroma-Subsampling-Rate von 4:2:2, hauptsächlich aus Gründen der Kompatibilität mit früheren analogen Videostandards. Dieser Stream kann problemlos in jedes gewünschte Ausgabeformat gemischt werden.

Y′UV ist kein absoluter Farbraum . Dies ist eine Möglichkeit, RGB-Informationen zu codieren, und die tatsächlich angezeigte Farbe hängt von den tatsächlichen RGB-Farbstoffen ab, die zur Anzeige des Signals verwendet werden. Daher ist ein als Y′UV ausgedrückter Wert nur vorhersagbar, wenn Standard-RGB-Farbstoffe verwendet werden (dh ein fester Satz primärer Farbwerte oder ein bestimmter Satz von Rot, Grün und Blau).

Darüber hinaus ist der Farb- und Helligkeitsbereich (bekannt als Farbraum ) von RGB (ob BT.601 oder Rec.709) viel kleiner als der von Y′UV erlaubte Farb- und Helligkeitsbereich. Dies kann bei der Konvertierung von Y′UV (oder Y′CbCr) in RGB sehr wichtig sein, da die obigen Formeln "ungültige" RGB-Werte erzeugen können – dh Werte unter 0 % oder sehr weit über 100 % des Bereichs (z. außerhalb des standardmäßigen 16–235 Luma-Bereichs (und 16–240 Chroma-Bereich) für Fernseher und HD-Inhalte oder außerhalb von 0–255 für Standardauflösung auf PCs). Wenn diese Werte nicht behandelt werden, werden sie normalerweise auf den gültigen Bereich des betroffenen Kanals "beschnitten" (dh begrenzt). Dies ändert den Farbton der Farbe, was sehr unerwünscht ist, daher wird es oft als besser angesehen, die störenden Farben so zu entsättigen, dass sie in den RGB-Farbraum fallen. Wenn RGB mit einer bestimmten Bittiefe in YUV mit derselben Bittiefe umgewandelt wird, können mehrere RGB-Farben dieselbe Y′UV-Farbe werden, was zu einem Informationsverlust führt.

Beziehung zu Y′CbCr

Y′UV wird oft als Begriff für YCbCr verwendet . Obwohl sie verwandt sind, handelt es sich um unterschiedliche Formate mit unterschiedlichen Skalierungsfaktoren. In PhotoYCC von Photo CD wird eine nicht skalierte Matrix verwendet . U und V sind bipolare Signale, die positiv oder negativ sein können und für Grautöne null sind, während YCbCr normalerweise alle Kanäle entweder auf den Bereich 16–235 oder den Bereich 0–255 skaliert, was Cb und Cr zu vorzeichenlosen Größen von 128 für macht Grautöne.

Dennoch ist die Beziehung zwischen ihnen im Standardfall einfach. Insbesondere sind die Y'-Kanäle von beiden linear miteinander verbunden, sowohl Cb als auch U sind linear mit (BY) verbunden und sowohl Cr als auch V sind linear mit (RY) verbunden.

Arten der Probenahme

Um ein digitales Signal zu erhalten, können Y′UV-Bilder auf verschiedene Weise abgetastet werden; siehe Chroma-Subsampling .

Konvertieren zwischen Y′UV und RGB

RGB-Dateien werden normalerweise in 8, 12, 16 oder 24 Bit pro Pixel codiert. In diesen Beispielen gehen wir von 24 Bits pro Pixel aus, die als RGB888 geschrieben werden . Das Standard-Byte-Format ist:

r0, g0, b0, r1, g1, b1, ...

Y′UV-Dateien können mit 12, 16 oder 24 Bit pro Pixel kodiert werden. Die gängigen Formate sind Y′UV444 (oder YUV444), YUV411, Y′UV422 (oder YUV422) und Y′UV420p (oder YUV420). Der Apostroph nach dem Y wird oft weggelassen, ebenso das "p" nach YUV420p. In Bezug auf die tatsächlichen Dateiformate ist YUV420 das gebräuchlichste, da die Daten leichter komprimiert werden und die Dateierweiterung normalerweise ".YUV" ist.

Das Verhältnis zwischen Datenrate und Abtastung (A:B:C) wird durch das Verhältnis zwischen Y- zu U- und V-Kanal definiert.

Um von RGB zu YUV oder zurück zu konvertieren, verwenden Sie am einfachsten RGB888 und YUV444. Bei YUV411, YUV422 und YUV420 müssen die Bytes zuerst in YUV444 konvertiert werden.

YUV444    3 bytes per pixel     (12 bytes per 4 pixels)
YUV422    4 bytes per 2 pixels   (8 bytes per 4 pixels)
YUV411    6 bytes per 4 pixels
YUV420p   6 bytes per 4 pixels, reordered

Y′Umwandlung von UV444 in RGB888

Die Funktion [R, G, B] = Y′UV444toRGB888(Y′, U, V) konvertiert das Y′UV-Format in das einfache RGB-Format.

Die für das Y′UV444-Format verwendeten RGB-Umwandlungsformeln gelten auch für das Standard-NTSC-TV-Übertragungsformat YUV420 (bzw. YUV422). Da bei YUV420 jedes U- oder V-Sample verwendet wird, um 4 Y-Samples darzustellen, die ein Quadrat bilden, kann ein geeignetes Sampling-Verfahren die Verwendung der unten gezeigten exakten Umrechnungsformeln ermöglichen. Weitere Informationen finden Sie in der 4:2:0-Formatdemonstration im unteren Abschnitt dieses Artikels.

Diese Formeln basieren auf dem NTSC-Standard:

Auf älteren Nicht- SIMD- Architekturen ist die Gleitkomma-Arithmetik viel langsamer als die Verwendung von Festkomma-Arithmetik, daher ist eine alternative Formulierung:

Für die Umwandlung von RGB zu Y'UV, unter Verwendung der Koeffizienten c, d und e, und die Feststellung , dass Bezeichnet Klemm einen Wert an den 8-Bit - Bereich von 0 bis 255, die folgenden Formeln bilden die Umwandlung von RGB zu Y'UV ( NTSC-Version):

Hinweis: Die obigen Formeln gelten tatsächlich für YCbCr. Obwohl hier der Begriff YUV verwendet wird, sind YUV und YCbCr nicht genau gleich.

Die ITU-R-Version der Formel unterscheidet sich mit , wobei und höher:

Integer-Operation des ITU-R-Standards für YCbCr (8 Bit pro Kanal) nach RGB888:

Y′Umwandlung von UV422 in RGB888

Eingang: 4 Byte Y′UV lesen (u, y1, v, y2)
Ausgang: Schreibt 6 Byte RGB (R, G, B, R, G, B)
u  = yuv[0];
y1 = yuv[1];
v  = yuv[2];
y2 = yuv[3];

Mit diesen Informationen könnte es als reguläres Y′UV444-Format geparst werden, um 2 RGB-Pixel-Informationen zu erhalten:

rgb1 = Y′UV444toRGB888(y1, u, v);
rgb2 = Y′UV444toRGB888(y2, u, v);
Yuv422 yuy2.svg

Y′UV422 kann auch mit den Werten in einer alternativen Reihenfolge ausgedrückt werden, zB für den FourCC- Formatcode YUY2.

Eingang: 4 Byte Y′UV lesen (y1, u, y2, v), (y1, y2, u, v) oder (u, v, y1, y2)

Y′Umwandlung von UV411 in RGB888

Eingang: 6 Byte Y′UV . lesen
Ausgabe: Schreibt 12 Byte RGB
// Extract YUV components
u  = yuv[0];
y1 = yuv[1];
y2 = yuv[2];
v  = yuv[3];
y3 = yuv[4];
y4 = yuv[5];
rgb1 = Y′UV444toRGB888(y1, u, v);
rgb2 = Y′UV444toRGB888(y2, u, v);
rgb3 = Y′UV444toRGB888(y3, u, v);
rgb4 = Y′UV444toRGB888(y4, u, v);

Das Ergebnis ist also, dass wir aus 6 Bytes 4 RGB-Pixelwerte (4*3 Bytes) erhalten. Dies bedeutet eine Reduzierung der übertragenen Datenmenge auf die Hälfte mit einem Qualitätsverlust.

Konvertierung von Y′UV420p (und Y′V12 oder YV12) in RGB888

Y′UV420p ist ein planares Format, d. h. die Y′-, U- und V-Werte werden zusammen gruppiert und nicht verstreut. Der Grund dafür ist, dass durch das Zusammenfassen der U- und V-Werte das Bild viel komprimierbarer wird. Bei einem Array eines Bildes im Y′UV420p-Format kommen zuerst alle Y′-Werte, gefolgt von allen U-Werten und zuletzt allen V-Werten.

Das Y′V12-Format ist im Wesentlichen das gleiche wie Y′UV420p, jedoch sind die U- und V-Daten umgeschaltet: Auf die Y′-Werte folgen die V-Werte, die U-Werte zuletzt. Solange darauf geachtet wird, U- und V-Werte von den richtigen Stellen zu extrahieren, können sowohl Y′UV420p als auch Y′V12 mit demselben Algorithmus verarbeitet werden.

Wie bei den meisten Y′UV-Formaten gibt es so viele Y′-Werte wie Pixel. Wo X gleich der Höhe multipliziert mit der Breite ist, sind die ersten X-Indizes im Array Y'-Werte, die jedem einzelnen Pixel entsprechen. Allerdings gibt es nur ein Viertel so viele U- und V-Werte. Die U- und V-Werte entsprechen jedem 2 x 2 Block des Bildes, was bedeutet, dass jeder U- und V-Eintrag für vier Pixel gilt. Nach den Y′-Werten sind die nächsten X/4-Indizes die U-Werte für jeden 2 mal 2-Block und die nächsten X/4-Indizes danach sind die V-Werte, die auch für jeden 2 mal 2 Block gelten.

Yuv420.svg

Wie in der obigen Abbildung gezeigt, werden die Y′-, U- und V-Komponenten in Y′UV420 separat in sequentiellen Blöcken kodiert. Für jedes Pixel wird ein AY′-Wert gespeichert, gefolgt von einem U-Wert für jeden 2×2-Quadrat-Pixelblock und schließlich ein V-Wert für jeden 2×2-Block. Entsprechende Y′-, U- und V-Werte sind im obigen Diagramm in derselben Farbe dargestellt. Beim zeilenweisen Lesen als Bytestrom von einem Gerät würde der Y′-Block an Position 0 gefunden, der U-Block an Position x×y (in diesem Beispiel 6×4 = 24) und der V-Block an Position x ×y + (x×y)/4 (hier 6×4 + (6×4)/4 = 30).

Y′UV420sp (NV21) zu RGB Konvertierung (Android)

Dieses Format (NV21) ist das Standardbildformat für die Android- Kameravorschau . YUV 4:2:0-Planarbild mit 8-Bit-Y-Samples, gefolgt von einer verschachtelten V/U-Ebene mit 8-Bit 2x2 unterabgetasteten Chroma-Samples.

C++-Code, der auf Android verwendet wird, um Pixel von YUVImage zu konvertieren:

void YUVImage::yuv2rgb(uint8_t yValue, uint8_t uValue, uint8_t vValue,
        uint8_t *r, uint8_t *g, uint8_t *b) const {
    int rTmp = yValue + (1.370705 * (vValue-128)); 
    // or fast integer computing with a small approximation
    // rTmp = yValue + (351*(vValue-128))>>8;
    int gTmp = yValue - (0.698001 * (vValue-128)) - (0.337633 * (uValue-128)); 
    // gTmp = yValue - (179*(vValue-128) + 86*(uValue-128))>>8;
    int bTmp = yValue + (1.732446 * (uValue-128));
    // bTmp = yValue + (443*(uValue-128))>>8;
    *r = clamp(rTmp, 0, 255);
    *g = clamp(gTmp, 0, 255);
    *b = clamp(bTmp, 0, 255);
}

Verweise

Externe Links