AviSynth - geeignet für Bildbearbeitung?

  • Interessant! Also behandelt FFTDFilter die U/V Kanäle anders als den Y Kanal? Aber warum? Oder ist es nur die Tatsache dass die U/V Kanäle in YV12 eine geringere Auflösung haben und man dadurch die gleiche Denoising-Stärke auf eine kleine Fläche anwendet und somit ungewollt stärker filtert? Allerdings würde das mit dem 2x Upsize dann die gleichen Ergebnisse wie die RGB -> 3x YV12 Wandlung ergeben... Hmm, ich glaub ich schreib mal ne PM an Fizick!


    Als mir das mit dem Farbrauschen aufgefallen ist, habe ich FFT3DFilter mal alle Kanäle entrauschen lassen. Ich habe hierzu – den Verlust von Chrominanzinformationen in Kauf nehmend – einfach in den YV12-Farbraum konvertieren lassen. Dabei habe ich festgestellt, dass FFT3DFilter sehr wohl auch Farbrauschen entfernen kann. :)

    Das Problem ist doch, dass ich mit RGBHack nur einen „Helligkeitskanal“ serviert bekomme. Ich kann also immer nur die „Helligkeit“ filtern. Es sei denn, ich kopiere diesen Y-Kanal in den U- bzw. V-Kanal, was ja auch möglich ist. FFT3DFilter würde dann aber ein und dieselbe „Pixelmenge“ unter Umständen zwei- oder dreimal bearbeiten. Der R-Kanal würde unter Umständen als Y-Kanal, dann als U- und anschließend als V-Kanal behandelt werden. Ob das gut geht? Wie auch immer, mit einer "verlustfreien Umwandlung" in den YUV-Farbraum fühle ich mich einfach wohler. :)

    Beim Spielen mit der Funktion YToUV bin ich dann auf die Idee mit dem Vergrößern und dem generellen Verzicht auf RGBHack gekommen. Abgesehen von Rundungsfehlern, haben wir es hier mit dem korrekten YUV-Farbraum zu tun.

    P.S.: Ich habe die Scripte zum Entrauschen etwas vereinfacht. So findet z. B. eine Limitierung, sofern gewünscht, jetzt nur noch für den Y-Kanal statt. Mit den Parametern bw und bh (FFT3DFilter und FFT3dGPU) wird die Blockgröße gleich für alle Kanäle bestimmt. Die Parameterliste für FFT3DFilter und FFT3dGPU sieht wie folgt aus:

    Code
    sigma_y  = 2.0
    sigma_u  = 0.0
    sigma_v  = 0.0
    bw       = 32
    bh       = 32
    limit    = 0
    strength = 0

    Das dürften die Parameter sein, die am häufigsten benötigt werden.

  • Ich demonstriere das mit dem Farbrauschen mal an einem Bildbeispiel. Das erste Bild im Anhang ist das Original (siehe Dateiname).

    Mit den Einstellungen


    wurde das 2. Bild gemacht. Dabei habe ich für sigma_y ganz bewusst einen zu hohen Wert gewählt. Man sieht sehr schön, dass bereits Details verschwinden, das Farbrauschen, gut sichtbar im unteren Drittel des Bildes, aber bleibt.

    Im 3. Bild habe ich dann folgende Einstellungen gewählt:


    Man sieht, das Farbrauschen ist schon weniger geworden.

    Als Vergleich habe ich dann auch noch die Variante mit RGBHack hinzugefügt (4. Bild). Hier wurde ja nur der „Helligkeitskanal“ (R-, G- und B-Kanal einzeln) gefiltert. Die Einstellungen waren die gleichen wie beim 2. Bild: sigma=6.0, bw=32, bh=32, limit=0. Trotz identischer Einstellungen sehen die Ergebnisse unterschiedlich aus. Selbst mit höheren sigma-Werten bleibt auch hier das Farbrauschen bestehen.

    Im 5. Bild habe ich dann günstigere Einstellungen gewählt.

  • Die Chrominanz wird via RGBHack ebenfalls gefiltert, nur halt im Y Kanal! Der einzige Unterschied ist A: Dass man die überliegende Luminanz der 3 Farben gleich mitfiltert... Und B: Das man immer 3x Filtert! Das Resultat: Nicht weniger Denoising, sondern mehr Ringing...

    - Luma Noise
    - Luma Noise -> RGBHack -> FFT3DFilter(Sigma=10,PLane=0) on R+G+B
    - Luma Noise -> ConvertToYV12 -> FFT3DFilter(Sigma=10,PLane=0)

    - Chroma Noise
    - Chroma Noise -> RGB Hack -> FFT3DFilter(Sigma=10,PLane=0) on R+G+B
    - Chroma Noise -> ConvertToYV12 -> FFT3DFilter(Sigma=10,PLane=3)

    MfG~Soulhunter

  • Spline36Resize scheint eine gute Alternative zu LanczosResize zu sein. Unterschiede sind nur schwer auszumachen, die mit Spline36Resize verkleinerten Bilder ergeben jedoch kleinere Dateigrößen (JPG-Format).

    Die Vorlagen für die Ylevels-Funktionen von Didée (Ylevels, YlevelsC, YlevelsG und YlevelsS) habe ich nun auch entsprechend angepasst.

  • Wenn nach dem Resizen ungerade Werte für die Breite oder die Höhe eines Bildes vorliegen, kommt es bei Verwendung von LimitedSharpenFaster zu Fehlermeldungen.

    Zitat

    Avisynth open failure: Resize: YV12 destination height must be multiple of 2.

    Ich habe nun generell vor dem Aufblasen mit PointResize auf die doppelte Größe ein Crop(0, 0, -last.Width % 2, -last.Height % 2) hinzugefügt.

  • Das individuelle Zusammenstellen aus mehreren Scripten habe ich nun auch hinzugefügt. Man ist auf diese Weise wesentlich flexibler. Will man z. B. Bilder verkleinern, so fügt man nacheinander einfach die Scripte „Spline36Resize.avs“ und „LimitedSharpen.avs“ der Jobliste hinzu. Jeder der hinzugefügten Scripte kann nach Belieben geändert werden. Alles, was in der Jobliste steht, wird der Reihenfolge nach abgearbeitet. Wem das zuviel an Freiheit ist – gemeint ist das individuelle Zusammenstellen der Scripte -, der kann auch nach wie vor mit einem einzigen Script arbeiten.

    Die Vorlagen mussten natürlich auch abgeändert werden. Die Script-Variable "$Clip" existiert nun auch nicht mehr. In der Verarbeitungskette ist momentan eigentlich nur der RGB- oder der YV12-Farbraum anzutreffen. Am Anfang eines jeden Scripts wird geprüft, welcher Farbraum vorliegt und ob ggf. eine Umwandlung von Nöten ist. Wird umgewandelt, so wird am Ende des jeweiligen Scripts nicht mehr zurückverwandelt. Erst der nächste Script entscheidet, ob er eine Umwandlung benötigt oder nicht.

    Was mir in diesem Zusammenhang noch etwas unklar ist, was AviSynth macht, wenn es an mehreren Stellen das gleiche Plugin laden soll (LoadPlugin)? Ich nehme mal an, dass AviSynth so intelligent ist, und Plugins dann nicht mehrfach lädt.

    Anbei schon mal ein Bildschirmausdruck. Das Update lade ich dann in den nächsten Tagen mal hoch.

  • Noch schnell ein Mini-Update nachgeschoben. Die Dateinamen der AviSynth-Scripte erscheinen nun ohne Extension. Hat man an einem Script viele Änderungen durchgeführt und möchte die Änderungen wieder rückgängig machen, so kann man das Script mit "Standard" erneut laden lassen.

    Übrigens, durch einen Doppelklick kann man ebenfalls Scripte hinzufügen bzw. entfernen.

  • Mit ImMaAVS gibt es einen weiteren Filter für AviSynth, der besonders für die Bildbearbeitung von Interesse ist. Der Filter basiert auf ImageMagick und arbeitet im RGB-Farbraum. Mit der Funktion ImMaReadPic() lassen sich über 90 Grafikformate einlesen und mit ImMaMog() stehen auch ein paar Bildbearbeitungsfunktionen zur Verfügung.

    Zum Beispiel:

    Code
    LoadPlugin("plugins\ImMaAVS\immaavs.dll")
    
    
    Import("lib\FritzPhoto\FritzPhoto.avs")
    
    
    isYV12() ? YV12toRGB() : last
    ImMaMog("-paint", "2")

    [Blockierte Grafik: http://img128.imageshack.us/img128/6709/10707210640x0480rl2.jpg]

    Na ja, wer's mag. :ohoh:

    Da lese ich gerade, dass es eine ImageMagick-Unterstützung wohl auch in einer späteren Version von AviSynth geben wird. ;)

    Zitat

    AviSynth v2.6n:
    A bit further down the track as time and volunteers permit.

    - Add MaskTools to the core.
    - Official Win64 support.
    - ImageMagick support to import and export pictures (besides DevIL).

    Nachtrag: Die Einstellungen, die beim Start des Programms Gültigkeit haben, können nun in einer INI-Datei bearbeitet werden.

  • Ich habe die Seite, wo man die AviSynth-Scripte hinzufügt, etwas überarbeitet. Die Vorlagen werden jetzt in einer Baumansicht angezeigt, so dass Vorlagen auch in Unterverzeichnissen schnell angezeigt und verwendet werden können. Außerdem habe ich für ImMaAVS einige Beispielscripte hinzugefügt, so dass auch einige ImageMagick-Bildbearbeitungsfunktionen zur Verfügung stehen.

  • Das Abspeichern in die verschiedenen Grafikformate hat bis dato immer das Programm erledigt. Mit Ausnahme des JPG-Formats wurde intern auf die ImageWriter-Funktion von AviSynth zurückgegriffen.

    Nun kann man in der INI-Datei jedem Grafikformat ein AviSynth-Script zuordnen, das für das Abspeichern der Bilder verantwortlich ist.

    Code
    [Graphic Formats]
    BMP (Windows Bitmap) = ImageWriterBMP
    PNG (Portable Network Graphics) = ImageWriterPNG
    PPM (Portable Pixelmap) = ImageWriterPPM
    TGA (Truevision Targa) = ImageWriterTGA
    TIF (Tagged Image File Format) = ImageWriterTIF

    Alle hier dargestellten Schlüssel erscheinen im Auswahlfenster für das Zielformat. Die entsprechenden Scripte befinden sich im Unterverzeichnis "lib\FritzPhoto". Auf diese Weise lassen sich beliebig viele Grafikformate hinzufügen – vorausgesetzt, es existieren entsprechende AviSynth-Filter. ;)

    Die Dateinamen lassen sich mit Suchen und Ersetzen nun auch den eigenen Wünschen anpassen. Es können sogar reguläre Ausdrücke für das Suchen verwendet werden.

  • Ich habe gerade ein paar Experimente mit dem Filter gradfun2db gemacht. Die Resultate können sich sehen lassen. Eine getrennte Verarbeitung der Kanäle wird von diesem Plugin allerdings nicht angeboten.

    :grübeln:

    Ganz allgemein gefragt, wenn ein Filter, der im YV12-Farbraum arbeitet, einzelne Kanäle nicht getrennt verarbeiten kann, dann sollte die folgende Methode doch ebenfalls zum Erfolg führen? Der Clip input liegt bereits im umgewandelten YV12-Farbraum (in doppelte Größe) vor.

    Code
    function filter(clip input) {
      input.PointResize(input.Width / 2, input.Height / 2)
      yv12lutxy(last, last, Y=2, U=1, V=1)
      yv12filter() # Filterung des Y-Kanals
      luma = last.PointResize(input.Width, input.Height)
      yv12lutxy(input, input, Y=1, U=2, V=2)
      yv12filter() # Filterung des U- und V-Kanals
      luma.MergeChroma(last, 1)
    }
  • Du meinst, der Y-Kanal würde reichen?

    Das GradFun2DB-Script sähe dann wie folgt aus:

  • Ich glaube dass das Banding in den U/V Kanälen schon so stark sein müsste, um es überhaupt sehen zu können, dass auch gradfun nicht mehr viel tun kann... Unser Auge kann solche Fehler in der Chrominanz nur sehr sehr schwach wahrnehemn... Viele Leute sehen noch nicht mal den Unterschied zwischen RGB und YV12, obwohl dort die Chrominanz gerade mal 1/4 der vollen Auflösung hat... Im Luminanz Kanal würde wahrscheinlich schon eine Verringerung auf 3/4 auffallen! Allerdings muss ich zugeben dass bei der Entwicklung das Filtern der U/V Kanäle erst garnicht probiert wurde da grandfun als echtzeit Postprocessing-Filter für Videos gedacht war... Geschwindigkeit stand also im Vordergrund! Ein paar Tests sollten jedoch schnell zeigen ob es Sinn macht die U/V Kanäle mitzufiltern... Eventuell bringt sogar das getrennte Filtern der R/G/B Kanäle [3xY] hier Vorteile!?

    MfG~Soulhunter

  • Es sind wieder ein paar Scripte hinzugekommen (z. B. dfttest, NNEDIResize2x, EEDI2Resize2x, Rotate). Die Resize-Scripte habe ich auch überarbeitet. Diese haben jetzt einen zusätzlichen boolschen Parameter „Oversize“, der dafür sorgt, dass das resultierende Bild gleich oder größer der voreingestellten Zielgröße ist. Damit können die Bilder bei Bedarf pixelgenau zugeschnitten werden. Die Voreinstellung ist Oversize=false (das resultierende Bild ist kleiner oder gleich der voreingestellten Zielgröße). Das Programm musste hierzu ebenfalls angepasst werden (das korrekte Seitenverhältnis wird jetzt mit AviSynth ermittelt).

  • Danke! :) Usability technisch bin ich zwar nicht gaz auf deiner Linie aber ansonsten ist das Progie toll ( Habs schon mal für eine Batch Gamma anpassung verwendet)

    Übrigens hat Kassandro (der mit dem ModerateSharpen)wieder in den Schoß der Avisynth-familie zurrückgefunden. :)
    Und besonders interesannt ist das er AUCH an einer Fotobearbeitungssoftware arbeitet!

    Zitat

    In version 0.2 we have also have changed the names of various variables and the inheritance rules to stay compatible with the forthcoming application RemoveGrainImg for still pictures.


    http://home.pages.at/kassandro/Remo…moveGrainHD.htm

  • Nachdem ich vor Kurzem ein paar Testbilder in verschiedenen Auflösungen zu einem, wie ich finde, guten Ausbelichter (http://www.saal-digital.de) geschickt habe, und ich in den selber skalierten Bilder ganz leichte Vorteile erkennen konnte – man muss allerdings schon etwas genauer hinsehen -, werde ich Bilder der Größe 10x13 und 10x17 in Zukunft selber kleinrechnen (pixelgenau).

    Ein entsprechendes Script („FritzPhotoResize“), dass mir alle Aktionen (Spline36Resize, LimitedSharpen und Crop) in einem Aufwasch erledigt, ist in den Vorlagen bereits enthalten. Das Script benötigt in der Regel nur zwei Parameter: Strength und AccurateToSize. In der Voreinstellung (AccurateToSize=false) werden die Bilder wie gehabt verkleinert. Wenn man den Parameter AccurateToSize auf true setzt, dann wird das voreingestellte Pixelmaß exakt eingehalten. Notfalls werden an den Rändern ein paar Pixel abgeschnitten.

  • Das Plugin NNEDI eignet sich sehr gut für das Entflechten (Deinterlacen) von einzelnen Bildern (siehe Anhang).

    Vorher:
    [Blockierte Grafik: http://img406.imageshack.us/img406/715/ava…68vorherve6.jpg]

    Nachher:
    [Blockierte Grafik: http://img520.imageshack.us/img520/6329/av…8nachherqf2.jpg]

    Jetzt weiß ich endlich, wie scharfis_brain wirklich aussieht. :lol:

    Auch für das Vergrößern ist das Plugin vorzüglich geignet. Ich stelle mal einen Vergleich zur Verfügung. Das Originalbild (240x160) wurde durch zweimaliges Anwenden von NNEDIResize2x auf die vierfache Größe gebracht. Um einen Vergleich mit einem linearen Interpolationsverfahren zu haben, habe ich auch eine Variante mit IrfanView (LanczosFilter) beigefügt.

Jetzt mitmachen!

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