Wissen 4K 4:2:0 8 Bit = 2K 4:4:4 10 Bit?

4K 4:2:0 8 Bit = 2K 4:4:4 10 Bit?

Eines Rätsels statistische Lösung...

// 16:56 Fr, 28. Feb 2014von

In der Diskussion dieses Artikels ging es in unserem Forum hoch her (und nicht nur bei uns). Dabei wurde gar nicht um die Ursprungsintention des Artikels gestritten, sondern es ging viel mehr um eine Randbemerkung. Nämlich, dass u.a. David Newman von Cineform/GoPro behauptet hat, durch Herunterskalieren auf geviertelte Auflösung von 8 Bit 4:2:0-Material enstünde 10 Bit 4:4:4 Material.



Gegner dieser Position behaupten, dass aus einem 8 Bit Sample niemals mehr Information zurückgewonnen werden kann. Folglich könne auch aus der Zusammenfassung mehrerer 8 Bit Werte niemals mehr die Werte zwischen den Sample-Punkten wiedergewonnen werden. Ein Ergebnis müsse immer eine künstliche Interpolation sein, die mit dem Original nichts mehr zu tun habe.



Befürworter sehen dagegen in der Zusammenfassung der vier Pixel durchaus einen Mehrgewinn an Farbtiefe und können diese auch durch spezielle Beispielfälle in der Praxis vor Augen führen.





Der Aufbau

Bei näherer Betrachtung des Problems fiel uns auf, dass die Formel wohl für einige Fälle gilt und für andere nicht. Also liegt es nahe, einmal einen statistischen Blick auf das Problem zu werfen. Hierfür haben wir unserem slashCAM-Elfenbeinturm einmal ein schönes Gedanken-Experiment aufgebaut (und in sehr krudem C/C++ wegen der Nachvollziehbarkeit nachgehackt).



Wir nehmen einen Sensor ohne Bayer Pattern Filter an, der nur Helligkeits-Signale aufzeichnen kann: In unserem Gedankenexperiment liefert jedes Pixel lineare 14 Bit Sensorwerte zwischen 0 und 16383.



Sehen wir uns nun 4 Sensorpixel a, b, c, d an:



4K 4:2:0 8 Bit = 2K 4:4:4 10 Bit?  : ABCD 250


Als erstes weisem wir jedem Pixel einen 14 Bit Zufallscode zu:




a = rand() % 16384 ;


b = rand() % 16384 ;


c = rand() % 16384 ;


d = rand() % 16384 ;




Diese Werte sind sozusagen das Abbild, das unser Sensor von der Realität messen kann. Anschließend erfassen wir den Wert jedes Pixels mit 10 Bit Auflösung:




a_10 = a/16;


b_10 = b/16;


c_10 = c/16;


d_10 = d/16;




Die 10 Bit Pixelwerte a_10, b_10, c_10 und d_10 unseres Sensors fassen wir nun zu einem 10 Bit Wert für die vier Pixel zusammen (all_10).




all_10 = (a_10+ b_10+ c_10+ d_10)/4;




"all_10" verhält sich also so wie eine "echte" 10 Bit-Kamera, die beim Downsampling vier 10 Bit-Pixel einfach zusammenfasst. Diese sehen wir als Referenz für echtes 10 Bit Sampling.



Anschließend nehmen wir die selben 14 Bit Sensorwerte, und speichern diese jedoch nur mit 8 Bit pro Pixel:






a_8 = a/64;


b_8 = b/64;


c_8 = c/64;


d_8 = d/64;




Und jetzt kommt die Ketzerei. Wir generieren ein 10 Bit Sample aus der einfachen Addition von vier 8 Bit-Werten:




all_8 = (a_8 + b_8 + c_8 + d_8);




"all_8" ist also eine 8 Bit-Kamera die beim Downsampling ihre Werte auf einer 10 Bit-Summe belässt, anstatt das Ergebnis abschließend wieder nach 8 Bit zu runden.



Um diese Simulation für jede erdenkliche 2 x 2 14 Bit Kombination zu berechnen, wären 163844 = 72.057.594.037.927.936 Durchläufe nötig. Geschätzt bräuchte ein 4 GHZ- Core i7 dafür über 2 Jahre. Doch glücklicherweise gibt es einige Hinweise, die uns diese Rechenarbeit ersparen können:



Mit 12 Bit-Input brauchte unser Rechnner nur weniger als einen Tag, um alle möglichen Fälle tatsächlich durchzurechnen. Mit der selben Ergebnis-Verteilung, die sich bei einer statistischen Zufalls-Auswahl von wenigen 10.000 Samples auch schon deutlich abzeichnet. Und die genau die gleiche Verteilung zeigt sich statistisch auch bei 14 Bit Genauigkeit.





Die Ergebnisse

Interessant ist, dass sich das 8 Bit-Downsampling systematisch um einen Wert verschätzt. Wir erklären uns dies durch das Verfahren wie Computer Integer-Werte runden. D.h. auch 0,99 wird zu 0 gerundet, und nicht zu 1. Das bedeutet, dass das gesamte Bild durch das Downskaling im Schnitt um ca. eine 10 Bit-“Helligkeits-Einheit” dunkler wird.



Addiert man als Korrekturfaktor "+1" auf den 8/10 Bit-Pixelwert, so liefern anschließend über 60 Prozent aller 8 Bit Downsampling-Werte den exakt selben Wert wie das 10 Bit Downsampling. In den restlichen 39 Prozent der Fällen liegt das 8/10 Bit-Verfahren um genau einen Wert daneben, verschätzt sich also gegenüber dem korrektem 10 Bit Wert um +-1.



In sehr seltenen Fällen (ca. 0,38 Prozent aller Samples) liegt das Downsampling auf 10 Bit sogar um 2 Sample-Werte daneben. D.h. der ermittelte Wert aus 4 x 8 Bit liegt 2 10 Bit-Werte neben dem "echten" 10 Bit Wert. Damit ist es aber immer noch näher am “10 Bit Original” als jeder nackte 8 Bit-Wert, der entsteht, wenn man die vier 8 Bit-Werte einfach zu einem 8 Bit Wert zusammenfassen würde.



Dazu gibt es noch den denkbar allerschlechtesten Fall, der praktisch gar nie eintritt (höchstens 1: 10.000.000.000): Wenn alle 4 Pixel genau den gleichen 10 Bit-Sample-Wert haben, der gleichzeitig nicht auf ein 8 Bit Raster fällt, kann das 8/10 Bit Verfahren sogar bis zu drei 10 Bit-Werte neben dem exakten 10 Bit wert liegen. Doch selbst in diesem Fall kann es niemals schlechter abschneiden, als ein echtes 8 Bit Downsampling.





Fazit

Wenn man die 8 Bit Luminanz von 4K mit diesem einfachen Verfahren linear auf 2K herunterskaliert, gewinnt man IMMER mehr Helligkeitsinformation im Luma-Kanal, solange man anschließend mindestens im 10 Bit-Farbraum weiterarbeitet. Selbst in sehr seltenen, denkbar schlechtesten Fällen fällt man niemals unter das Niveau einer reinen 8 Bit Wandlung. Entscheidet man sich dagegen nach der Wandlung, im 8 Bit Farbraum weiterzuarbeiten verschenkt man immer einen Teil "echte" 10 Bit Helligkeitsinformation.



Im Umkehrschluss bedeutet dies auch, dass eine Erweiterung der Helligkeits-Information von 8 auf 10 Bit beim halbierten Downskaling zwar sehr oft auftritt, jedoch keineswegs immer. Statistisch gesehen wird das Ergebnis immer besser als 8 und schlechter als “reines” 10 Bit sein. Wobei bei diesem Verfahren durschnittlich 60 Prozent aller Werte exakt treffen und insgesamt 99,6 Prozent aller Samples immer noch bemerkenswert nahe (+/-1) am echten 10 Bit Wert landen. Darf man so ein Ergebnis dann 9,2 Bit nennen?





Addendum: Code

Alle die schon mal C/C++-Code gelesen hier noch der sehr einfache Code, um das Geschriebene nochmal nachzuvollziehen: Übrigens könnt Ihr den Code auch direkt hier einpasten und ohne eigenen Compiler stanta pede damit herumspielen…. Hier der Quellcode als Zipfile.




Ähnliche Artikel //
Umfrage
    Welche Streaming-Dienste nutzt Du?













    Ergebnis ansehen

slashCAM nutzt Cookies zur Optimierung des Angebots, auch Cookies Dritter. Die Speicherung von Cookies kann in den Browsereinstellungen unterbunden werden. Mehr Informationen erhalten Sie in unserer Datenschutzerklärung. Mehr Infos Verstanden!
RSS Suche YouTube Facebook Twitter slashCAM-Slash