Verlaufsmaske mittels Avisynth erzeugen

  • Dank der großartigen und geduldigen Hilfe von Didée ist die GradientMask-Funktion in einem funktionsfähigen Stadium angekommen. Nicht hübsch, aber tut:



    Mit der Gradientmask lassen sich z.B. die Ränder eines UGLARM-Logoaway-Filters oder eines lokalen blurs zur verbesserten Logoentfernung mit Delogo oder Delogos PP-Mode an den Rändern verschönern.




    ----------------------------------


    Hallo Leute,


    da ich viele TV-Aufnahmen archiviere und gerne Logos und Einblendungen entferne, benötige ich oft Verlaufsmasken.
    Ich möchte mir nun eine Funktion schreiben, mit der ich diese Masken direkt generieren kann, und so nicht mehr auf Photoshop & Co angewiesen bin. Für den einmaligen Einsatz ist die Methode die Maske extern zu erzeugen sicherlich in Ordnung, wenn man sie aber oft und in unterschiedlichsten Größen und Verlaufsstärken benötigt, dann wirds nervig.


    Ich habe dann nun das Avisynth-Wiki rauf und runtergelesen, Rekursion und if...else versucht, aber ich bin offensichtlich nicht tief genug in der Materie um etwas hinzubekommen oder schlicht zu blöde.


    Das Ziel ist eine Funktion, der - Breite, Höhe, Stärke des Verlauf, Bildanzahl und Bildrate - angegeben werden, und die daraus einen Verlaufsmaskenclip erstellt.


    In etwa so:


    function GradientMask(clip c, int width, int height, int GPower, int GMframecount, int GMframerate) {
    }


    In meiner Verzweiflung wollte ich einen weißen Blankclip mit width und height erstellen, mit der Bildanzahl von GPower, diesen dann ausfaden über GPower-1, dann jedes Bild entsprechend seiner Frameposition um eben diese runtherum croppen, und danach mittels Overlay die einzelnen Bilder übereinanderlegen.
    Ich habs wie gesagt nicht hinbekommen.


    Ansonsten habe ich nur Gradient Mask Maker gefunden, bei diesem kann man aber nur eine Verlaufsmaske über die komplette Fläche erstellen, keine mit variablem Innenraum, respektive Gradientdicke.


    Gibt es sowas schon, oder hat jemand so flinke Finger, dass er sowas schnell heruntertippen kann?


    Bin für eure Hilfe dankbar, und hoffe anhand von evtl. auftauchenden Beispielcodes auch selbst mehr zu lernen.


    Grüße

  • Ich verstehe noch nicht so recht, was in welcher Dimension verlaufen soll. Geht es um einen Helligkeits- oder Deckkraft-Verlauf über eine Fläche oder ein zeitabhängiges Ein- und Ausblenden?


    Letzteres wird man wohl mit Animate/ScriptClip und dem Deckkraft-Parameter in Overlay/Layer schaffen.

  • Didée, hättest du eine Codezeile lutspa für mich? Ich komme mit der Doku von Masktools 2 nicht so recht klar, und das was ich über Google finde endet in einer Division durch Null (mit 25 und 26). Das Beispiel aus der Doku erzeugt eine Fehlermeldung über falsche Argumente.

  • Kreisformel: x^2 + y^2 = r^2


    Erstelle YV12-Clip w=640, h=480. Zeichne Kreis mit Radius=200 um den Mittelpunkt x=320,y=240.


    Code
    1. blankclip(width=640,height=480,pixel_type="YV12")mt_lutspa(false,"x 320 - 2 ^ y 240 - 2 ^ + 200 2 ^ < 255 0 ?",U=-128,V=-128)


    _____


    Beliebige Dimensionen der Quelle: Zeichne Kreis/Ellipse um den Mittelpunkt bei (45% der Breite),(55% der Höhe) , mit x- und y-Radius =(40% der Breite / der Höhe)


    Code
    1. mt_lutspa(true,"x 0.45 - 2 ^ y 0.55 - 2 ^ + 0.4 2 ^ < 255 0 ?",U=-128,V=-128)
  • Sorry für dieses Doppelposting, aber ich komm immernoch nicht weiter.
    Tut mir leid, mir jetzt alles vorkauen zu lassen, aber was wäre denn eine gescheite Funktion, die das gewüschte tut. Ich scheitere an verschiedenen Faktoren, einmal, dass meine Funktion nicht von -unendlich bis +unendlich in der relativen Berechnung laufen darf, sondern von 0 bis 1, was z.B. den Betrag von var^odd ausschließt, da ich damit niemals einen x-Verschiebungsfaktor finde, sodass der Kurvenverlauf genau bei 0=1 ist. Auch alle var^even die in Frage kämen, mit der Bedingung, dass sie bei allen x bei denen sie durch eine Verschiebung nach unten negativ wären = null gesetzt werden, sind mir nicht treffsicher genug.


    Ich wette ja, die Kreisberechnung war ein Wink mit dem Eiffelturm, aber ich bekomme das ganze nicht auf ein Rechteck übertragen. Sorry für das riesen Brett vor meinem Kopf, aber Mathe ist echt lange her. :(

  • Na ja ... man kann das wohl, von A bis O und als eierlegende Wollmilchsau-Variante, in einen einzigen mt_lutspa-Aufruf hineinquetschen ... aber das wird 'ne kleine Monster-Formel, und die zusammenzubasteln wär' mir jetzt auch zu arbeitsintensiv. ;)
    Formeltechnisch wäre es viel einfacher, die Maske abschnittsweise (nach "Quadranten") zu erzeugen, und dann mit StackHoriVerti zusammenzukleben. Was hinten 'rauskommt, das ist das Wichtige.


    Wie ist denn das mit "Gpower" eigentlich gemeint - ist das einfach als Breite des Übergangsbereiches in Pixeln, oder doch irgendwie komplizierter gedacht?

  • Sowas hier:


    Code
    1. blankclip(width=32,height=32,pixel_type="YV12")
    2. w = mt_lut("255")
    3. b = w.mt_invert()
    4. base = stackvertical(stackhorizontal(b,b),stackhorizontal(b,w))
    5. top_border = base.bicubicresize(256,32,1,0, 36,31.0,1,2.0)
    6. top_border.greyscale()


    In diesem Sinne für links, oben, und die LO-Ecke. Die Restlichen mit RotateLeft/Right etc. machen. Dann mit StackH/V zusammenbasteln. Die Koordinaten für den Resizer aus den an die Funktion übergebenen Parametern nehmen bzw. ableiten.


    Nachtruhe.

  • So danke, das hat mir endlich geholfen das ganze zu duchblicken.


    Wer möchte, hier ist die fertige Funktion:



    Falls jemand Fehler oder Verbesserungen findet, bitte immer gerne drauf aufmerksam machen.