Plugin - Unscharf maskieren ?

  • Hallo,

    Kenn jemand einen anständigen Filter (Avisynth-Plugin) der was ähnliches macht wie z.B. Adobe Photoshops "Unscharf maskieren" ?

    Gruß Gunnar

  • Von Tritical gibt's TUnsharp.dll, mit verschiedenen Schärfefiltern, auch Unscharfer Maskierung.

    Und, "seit alters her", ist UnsharpMask() im großen WarpSharp-Paket enthalten. (WarpSharp.dll importieren, dann steht neben WarpSharp() auch UnsharpMask() und XSharpen() zur Verfügung.)

    Im Prinzip kann man sich das auch selber sehr einfach zusammenbauen - Unscharfe Maskierung ist ja nix anderes als ein Gaussian Blur "verkehrt herum" (Vorzeichen der Operation wird umgedreht).
    (Und wenn man's eh' schon selber zusammenbaut, z.B. mit BicubicResize und YV12Lutxy, dann lassen sich dabei noch ein paar vorteilhafte Kniffe anwenden ;) )

  • TUnsharp.dll hab ich getestet. Finde ich nicht so richtig gut, wobei die GUI nett ist.

    Wie kann man mit AviSynth selber Unscharf maskieren? Hat jemand ein Beispiel?

  • Avisynth "selber" hat keinen Filter zur Unscharfen Maskierung.

    Wenn Dir TUnsharp nicht gefällt, nimm doch UnsharpMask aus dem WarpSharp Paket. Siehe Post#2 oben - ist zwar anderthalb Jahre alt, gilt aber immer noch.

    Das Plugin "VariableBlur" von tsp hat auch noch einen Filter zur Unscharfen Maskierung. (Benötigt fftw3.dll im /system32 Verzeichnis von Windows.)


    Vielleicht liegt das "Nichtgefallen" auch einfach daran, dass komprimierte Video-Dateien zumeist reichlich Artefakte haben, die dann durch die USM in voller Pracht erblühen ... ?

  • Avisynth "selber" hat keinen Filter zur Unscharfen Maskierung.


    Das weiß ich. Du meintest nur, das man es mit den vorhandenen Filtern leicht selber bauen könnte. Deswegen hab ich nach einem Beispiel gefragt, wie das geht.

  • Code
    source = last
    
    
    GaussianBlur = source.YourGaussFilterOfChoice()
    
    
    UnsharpMasked = source.mt_adddiff( mt_makediff(source,GaussianBlur) , U=2,V=2)

    So geht das. Wie gesagt, Unscharfe Maskierung ist einfach nur die "Umkehrung" eines Gaussian-Blur Filters. (Zumindest heute in der digitalen Welt, nicht im ursprünglichen Photo-Chemischen Original.)

    Als Blur-Filter kann man nehmen, was einem gerade passt. Blur(1) ist der einfachste, für eine Unschärfemaskierung mit Radius=1.
    Für größere Radii kann man BinomialBlur() (schnell) oder GaussianBlur() (langsam) aus dem genannten VariableBlur - Paket nehmen. Allerdings kann man dann auch gleich den dort integrierten Schärfungs-Filter nehmen, kommt aufs gleiche raus.

    Für eine nicht völlig exakte (aber meist hinreichend genaue) und dafür sehr schnelle Variante kann man auch

    BicubicResize(x_klein,y_klein, .33,.33) .BicubicResize(x_orig,y_orig, 1,0)

    als Annäherung eines Gauss-Filters heranziehen. Eine entsprechende Funktion hatte ich schon vor laaanger Zeit hier und da gepostet ... hab' jetzt nicht nur keine Lust, sondern auch keine Zeit (muss nämlich gleich weg, Arzttermin) zum 'rauskramen. Am besten also selber suchen ... es geht nichts über persönliche Erfolgserlebnisse :)

  • Für eine nicht völlig exakte (aber meist hinreichend genaue) und dafür sehr schnelle Variante kann man auch

    BicubicResize(x_klein,y_klein, .33,.33) .BicubicResize(x_orig,y_orig, 1,0)

    als Annäherung eines Gauss-Filters heranziehen.

    Ich bin mal so frech und bringe "GaussResize" ins Spiel... :D

  • Jalogischdoch! (benutz' ich auch recht oft in diesem Sinne ... schau' doch z.B. mal in das z.Zt. aktuelle Script von TempGaussMC_beta1...) ;)
    Was mich an GaussResize ~etwas~ stört, ist dass die Korrelation bzw. "Skalierung" des Schärfe-Parameters "p" nicht so recht klar ist. Bei BicubicResize andererseits ist man mit 1./3,1./3 down und 1,0 up auf jeden Fall einigermaßen nahe an der Gauss-Verteilung dran.

    ---

    Alte Funktion, tut aber immer noch ihren Dienst:

    Code
    function FastGauss(clip clp, float rx, float ry)
    { ox=clp.width()
      oy=clp.height()
      clp.bicubicresize(m4(ox/rx),m4(oy/ry))
      return( bicubicresize(ox,oy,1,0) )
    }
    function m4(float x) {x<16?16:int(round(x/4.0)*4)}
  • Anderes Video, selbes Problem :)

    Ich mach es nun so:

    Code
    # Benötigt:# MaskTools - http://manao4.free.fr/mt_masktools.html# variable blur - http://forum.doom9.org/showthread.php?t=88645source = lastGaussianBlur = source.BinomialBlur(8,8,3,3,3)UnsharpMasked = source.mt_adddiff(mt_makediff(source,GaussianBlur))Overlay(source, UnsharpMasked, mode="blend", opacity=0.5)

    Man muß das ursprungs Material schon um einiges Bluren, wenn man nicht das Rauschen verstärken will, sondern nur die groben Kanten.
    Mit dem letzten Overlay() (opacity Parameter) kann man die Stärke beeinflussen...

    Je nach Material kann man noch das einfügen:

    Code
    UnsharpMasked = UnsharpMasked.TemporalSoften(1, 2, 4)
  • Zu dumm, letztens hat es noch funktioniert. Nun bekomme ich von den MaskTools ein:

    Zitat

    Evaluate: System exception - Integer Divide by Zero

    Weiß jemand warum?

  • Äh, nö, ich schon mal nicht. Wie genau sieht das Script aus? Ist der Input auch YV12?

    Zu Deinem oben geposteten Script - ist in Ordnung, geht aber einfacher: anstelle von adddiff(makediff()) kann man ein einziges lutxy verwenden. Wenn man ein lutxy verwendet, dann kann man auch gleich einen Multiplikator mit einbauen, und somit den finalen Overlay() überflüssig machen:

    Code
    str = 0.789  #  "Stärke" der USM-Operation, von 0.0 bis 9999 - 1.0 ist "normal"
    
    
    source = last
    GaussianBlur = source.BinomialBlur(8,8,3,3,3)
    source.mt_lutxy(GaussianBlur,"x x y - " + string(str) + " * +",U=2,V=2)

    Einmal editiert, zuletzt von Didée (28. Oktober 2009 um 08:50) aus folgendem Grund: Formel korrigiert: &quot; *&quot;

  • Äh, nö, ich schon mal nicht. Wie genau sieht das Script aus? Ist der Input auch YV12?


    Ah, prima, das war der Fehler! Mit einem ConvertToYV12() geht's wieder!

    Code
    str = 0.789  #  "Stärke" der USM-Operation, von 0.0 bis 9999 - 1.0 ist "normal"
    
    
    source = last
    GaussianBlur = source.BinomialBlur(8,8,3,3,3)
    source.mt_lutxy(GaussianBlur,"x x y - " + string(str) + " +",U=2,V=2)


    Sieht nett aus, funktioniert aber nicht wie erwartet. Ich sehe sowas wie eine Maske, aber kein zusammen gerechnetes Bild.

  • Hab jetzt sowas gebastelt:

  • Kleine Anmerkung:

    Blindes ConvertToYV12() ist nicht empfehlenswert, insbesondere falls die Quelle doch "interlaced" (combed) ist. Leider kann AviSynth das nicht einfach so feststellen; man muss wissen, ob die Aufnahme interlaced aufgezeichnet wurde, wenn man von einer Quelle mit feinerer vertikaler Chroma-Auflösung (RGB24 / YUY2) in das planare YV12-Format heruntersampelt. Ansonsten kann es unangenehme Mischfarben geben, wenn U/V-Komplementärfarben sich voreinander vertikal bewegen (z.B. roter Ball vor blauem Himmel).

  • Also mein Quell Material ist interlaced. Es ist DV Material. Ich öffne die AVI Datei mit DirectShowSource()

    info() zeigt mit an, das es YUY2 ist.

    Sollte ich es dann besser so machen:
    1. vor dem Filter mit ConvertToYV12() nach YV12 konvertieren
    2. UnscharfFilter einsetzten
    3. Nach dem Filter mit ConvertBackToYUY2() wieder zurück wandeln

  • Au weia. Wenn der Input interlaced ist, dann ist eh' alles anders. Von der YUY2<->YV12 Konvertiererei einmal ganz abgesehen, die muss dann natürlich mit "interlaced=true" vorgenommen werden ...
    ... man sollte nun wirklich nicht mit einem Schärfe-Filter auf einen interlacten Frame (für LigH: einen combed Frame) 'draufgehen. Beim besten Willen nicht. Da in so einem Frame die vertikal-räumlich benachbarten Pixel in Wahrheit zeitliche Nachbarn sind, würde man damit ja eine Art "temporales Schärfen" durchführen. Und das wäre ziemlicher Käse.

    Daher: für interlacten Input *mindestens* dieses:

    separatefiels() - XYSharpen - weave()

    oder

    bob(0,0.5) - XYSharpen - SeparateFields() - SelectEery(4,0,3) - weave()

  • Nein und nein ;)

    Also ich hab keinen wfv DV Codec installiert. Deswegen geht AVISource nicht.

    Ich pansche auch nicht im interlace Material rum. Mein Skript sieht im groben so aus:


    UnfoldFieldsVertical() und FoldFieldsVertical() kommen von http://avisynth.org/stickboy/ :
    http://www.afterdawn.com/guides/archive…rial_page_6.cfm
    http://avisynth.org/stickboy/jdl-interlace.avsi
    http://forum.doom9.org/showthread.php?s=&threadid=59029

Jetzt mitmachen!

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