YUV-Banding bei Encodierung von CG vermeiden

  • Anscheinend lag ich falsch ... ich dachte, statt die PNGs der Blender-Movies mit dem ziemlich langsamen ImageSource immer wieder zu lesen, könne ich auch eine Zwischendatei mit x264 --crf 6 erzeugen, die wäre schon exakt genug. Ja, sie bildet die AviSynth-Ausgabe exakt genug ab. Aber die AviSynth-Ausgabe ist nicht so recht exakt genug, scheint mir. Im Intro von "Sintel" gibt es viel Schnee und Himmel, insgesamt also sehr wenig Kontrast. Und da fällt doch schon ein ganz leichtes Banding auf. Das dürfte wohl der Konvertierung nach YV12 geschuldet sein.

    Also mal verglichen: Die Differenz zwischen PNG-Quellbild 501 und einem PNG-Screenshot von Frame 500 (in AviSynth 0-basiert gezählt) aus VirtualDub gebildet und den Bereich ±4 gespreizt. Sieht hübsch bunt aus.

    Ist das wirklich nur die RGB-YUV-Konvertierung? Oder steckt da noch mehr dahinter?

    Jetzt zu möglichen Gegenmaßnahmen ... GradFun2db? Schlechte Idee; zwar werden die Übergänge zwischen den Bändern gedithert, aber auch abgeflacht. Kontraste zu schwach erkennbaren Objekten werden noch schwächer. Bei GradFun2db(2) geht es gerade noch, bei GradFun2db(4) verschwinden schon fast ein paar Felsumrisse im Schnee oder Himmel.

    Kleinere Werte bis max. 1.0 führen übrigens zu einem Fehlverhalten; dokumentiert ist aber nicht, dass man den Threshold größer als 1.0 setzen muss, lediglich "Default is 1.2"...

    Ich glaube, ich bräuchte dafür schon eine andere RGB-YUV-Konvertierfunktion, die gleich während dieser Umrechnung das Dithering anwendet, ohne die Kontraste zu beeinflussen.

    Oder die 16-bit-Kanalverarbeitung (Deep Color). Hat da schon jemand praktische Erfahrung, wie man das korrekt verwendet?

  • CG Material würde ich zumindest mit 10bit abspeichern, dass hilft schon enorm beim Banding,...
    Zum DeBanding nutze ich gerne flash3kyuu_deband

    Nebenbei: Welche Auflösung der PNGs verwendest Du?
    http://media.xiph.org/sintel/sintel-1080-png/00011322.png
    http://media.xiph.org/sintel/sintel-2k-png/00011322.png
    http://media.xiph.org/sintel/sintel-4k-png/00011322.png
    -> die 1080er Version irgendwie scheint beim Skalieren auf 1080p was schief gegangen zu sein

  • @ sneaker2:

    Ziemlich abweichend.

    @ Selur:

    Ja, 1080p. Das hat mich schon mehrere Tage Download gekostet. Für die 4K hätte ich noch nicht mal kurzfristig internen Plattenplatz, glaub ich, das müsste auf eine externe geladen werden...

    4K und 1080 stimmen eigentlich gut überein, nur 2K zeigt irgendwie ein anderes Frame, eine andere Wellenphase im Fell?
    __

    P.S.:

    Ziemlich gut zum Vergleichen eignet sich wohl der Bereich der Frames 8780 - 8800, wo der Mond zur Sonne überblendet.

  • Differenz ... Sieht hübsch bunt aus.
    Ist das wirklich nur die RGB-YUV-Konvertierung? Oder steckt da noch mehr dahinter?


    Das dürfte, so weit, wirklich zu einem *sehr* großen Teil der RGB > YUV Konvertierung zu schulden sein. Überleg' mal: die RGB-Daten belegen das vollständige Spektrum 0-255. Und bei der Konvertierung zu Standard-YUV wird das Spektrum gleich mal auf 16-235 zusammengeschnurzelt. Also Reduzierung von 255 Helligkeitsstufen auf 220 Helligkeitsstufen. Ist keine Überraschung, dass da sowas wie Banding entsteht, und in diffizilen Bereichen auch sichtbar wird.

    Soweit es die CRF6 - "Arbeitsdatei" angeht, dürfte es wohl gleich deutlich besser werden, wenn man mit ConvertToYV12(matrix="PC.709") ein Fullrange-YUV erstellt. Natürlich muss irgendwann später trotzdem die Reduzierung auf Standard-YUV 16-235 vorgenommen werden, und da wird man für maximale Qualität an Dithering nicht vorbei kommen. Aber für's Erstellen der komprimierten Arbeitsdatei sollte Fullrange-YUV - vermutlich - erst mal ausreichen.

  • Dann kommt leider noch ein relativ erheblicher Faktor dazu, wie ich mit Bedauern feststellen musste: Der :motz: TFT-Bildschirm. Ich muss für halbwegs lineare Darstellung im Grafiktreiber einen Desktop-Gammawert von 0,6 einstellen.

    Auf einem anderen Monitor mit stabilerer Darstellung sieht das sicherlich ganz anders aus... R.I.P., guter alter SyncMaster, meine letzte Röhre hat mich vor ein paar Monaten verlassen. :heul:

  • Oh, ja. Wenn man für den TFT so herumbiegen muss, dann ist das für die Darstellung ganz schlecht - die Korrekturen erfolgen da ja i.d.R. nur in einem 8bit-Farbraum, da bringt jedwede "Korrektur" automatisch Tonwertverluste mit sich. (Im Büro hab ich auch so ne Gurke, ein alter Philips, der zeigt von RGB 0 bis 16~20 nix als Schwarz ... und Voll-Gelb ist Neon-Zitronen-Gelb)

    Aber trotzdem: der Unterschied, den Du mit dem Differenz-Bild aufgezeigt hast, der dürfte sich wohl weitgehend mit der RGB 0-255 <> YUV 16-235 Geschichte erklären lassen.

  • Nun gut, bleiben wir mal dabei ... theoretisch ... würde Dithering bei der Konvertierung von RGB zu YUV wohl nützlich sein; gibt es dafür ein entsprechendes Plugin?

    Anscheinend kann man dafür das Dither-Paket verwenden, das bietet eine Funktion Dither_convert_rgb_to_yuv(), braucht allerdings eine ziemlich neue Version der MVTools2; mitgeliefert wird eine Version 2.6.0.5. Fizick hat da wohl die Weiterentwicklung abgegeben? Nun gut, muss man ja wissen, dass die neueste Version jetzt woanders herkommt.

    Bisher sieht es also so aus:

    Jetzt überleg ich noch mal, ob irgendwelche Parameter nützlich wären...
    __

    Nee, das haut nicht hin...

    Zitat

    Avisynth open failure:
    mt_lutxy : unsupported colorspace. masktools only support planar YUV colorspaces (YV12, YV16, YV24)
    (plugins\Dither\Dither.avsi, line 1156)
    (plugins\Dither\Dither.avsi, line 1131)
    (plugins\Dither\Dither.avsi, line 366)
    (sintel-1080.avs, line 10)

  • Welche MaskTools hast Du denn am Laufen?
    Probier' mal eine der folgenden:
    http://manao4.free.fr/masktools-v2.0a48.zip
    http://tmod.nmm-hd.org/Misc/mt_masktools-26-for-2.6alpha4.7z (Falls Du schon SEts AviSynth MT 2.6 2013.03.09 nutzt)

    Nützlich wäre evtl. eine 16-Bit-Ausgabe direkt am 10 Bit x264:

    Code
    Dither_convert_rgb_to_yuv(matrix="709", lsb=true)
    Dither_quantize(bitdepth=10, reducerange=true)
    Dither_out()

    Pipe:
    avs2pipemod -rawvideo input.avs | x264-10bit - --demuxer raw --input-res 1920x818 --input-depth 10 --fps 24 -o output.mkv

  • Hoppla, da war noch eine DLL aus dem QTGMC-Paket nicht ersetzt worden; danach kamen ja noch ein Update von -Vit- und das letzte 2.60a4-MT-Update von 06_taro. Die Version läuft.

    Gut, 16-bit-Ausgabe an 10-bit-x264; das Ergebnis soll sowieso immer als Vorlage für weitere Konvertierungen dienen, also üblicherweise via FFMS2 oder DGDecNV.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!