• Diese Vergleiche gibts ja bereits im doom9.org,
    da oben im Link hat jedoch die Funktion den Vorteil, das via Maksing die Flächen in halber Auflösung denoised- und sodann wieder zurück auf die original Auflösung gebracht werden.
    Ich habe damit gestern ein Culty Trashy Roberto Blanco Capture (lief auf NDR3) wieder lecker hin bekommen.

  • Ah, man beginnt die MaskTools zu entdecken ;)

    incredible:

    Was Du da in Deinem Script machst, ist von der Idee her durchaus okay (obwohl ich das seit längerem etwas anders mache ;) )
    Jedenfalls: Die von Dir verwendete Maskierung der Kanten ist ausgesprochen grob, zumindest für meinen Geschmack. Schau' Dir mal die Maskierungen an, die ich in Restore24 bzw. LimitedSharpen verwende *). Jawohl, die Methode ist spürbar langsamer. Sie ist aber auch viel besser. Überhaupt ist meinereiner ein sehr großer Freund von "weichen" Maskierungen. Wenn die Entscheidung "to filter, or not to filter" über "harte" (annähernd "binäre") Maskierungen getroffen wird, gibt's eigentlich immer hässliche Nebeneffekte. Das kannste auch allein mit dem "blur(1.5)" Deiner Maskierung nicht 'rausreißen.
    Natürlich müsstest Du die Maskierung etwas härter einstellen als ich es z.B. in LimitedSharpen oder auch im iiP tue - maskiertes Schärfen ist *eine* Sache; maskiertes Blurren/Entrauschen eine *andere*. Trotzdem allem aber "beisst" der doppelte Sobel einfach besser (besseres Ansprechen auf Detail, weniger anfällig gegen Rauschen) als dieser verquarkte "einzel-Kernel Quasi-Sobel" - der hat mir noch nie so sonderlich geschmeckt.

    Probier's einfach mal. Siehst dann schon, ob's was bringt oder nicht. Ich prophezeie mal "ja".

    *) Die Maskierungen aus'm iiP empfehle ich lieber 'mal nicht ...


    [edit]

    Um das ganze 'mal bildlich zu belegen:

    [Blockierte Grafik: http://img68.exs.cx/img68/4185/Vergleich2_EdgeMask.jpg]

    Oben: Deine Maskierung mit defaults (2,6) - links "nackt", rechts nach dem "blur(1.5)"
    Unten: Die von mir favorisierte "doppelte" Maskierung.

    Denke mal, der Unterschied ist klar.

    Die Funktion sieht folgendermaßen aus:

    Code
    edge = logic( DEdgeMask(0,255,0,255,"5 10 5 0 0 0 -5 -10 -5", divisor=2)
     \           ,DEdgeMask(0,255,0,255,"5 0 -5 10 0 -10 5 0 -5", divisor=2)
     \           ,"max")
    # \.levels(0,1.0,255,0,255,false) 
    # \.inflate()
    # \.FitY2UV()


    Funktionsmäßig zu parametrisieren wären "divisor" und, falls gewünscht/benötigt, die "levels" Parameter. Man könnte auch die "Ylevels" Funktion nehmen - läuft im prinzip schneller, bringt aber in diesem Fall nicht allzu viel.
    Den "inflate" kann man nehmen oder nicht, je nach Fall und Bedarf. Alternativ tut's meist auch ein blur().
    Das abschließende "FitY2UV" braucht man nur, wenn dann später auch die UV-planes entsprechend behandelt/kopiert werden sollen.

  • Na, da bedanke ich mich aber sehr! :)

    Bin mit dem Script auch erst seit ca. 3 oder 4 Tagen dran.
    Die verrückten Ideen entstehen meist, wenn ich am Feierabend von der Arbeit in Düsseldorf nach Köln fahre.
    Ich wollte ebenso versuchen, die spatiale soften komponente via 1,0 in bicubicresize umzudrehen, also beim downsizen zu verwenden, mal sehen.

    Und dein "Leckerchen" als Zugabe werde ich mir heute Abend zu Herzen nehmen! ;)

    Selur
    Yep, die meinte ich. Wilbert hat auch einen größeren Test mit Plugins und Routinen gemacht, habe aber im Moment den Link nicht.

  • Und weiter gehts ....

    Diesmal mit erweiterter Syntax

    ADS(int "Top", int "Bottom", int "Overscan", bool "Letterbox", int "Sharpen", int "Threshold", bool "HQmask", bool "Show")

    Top = Größe des oberen zu croppen'den orig. Balkens
    Bottom = Größe des unteren zu croppen'den orig. Balkens
    Overscan = Der Overscan (overlayed) in 1,2 oder 3
    Letterbox = Anamorph zu 4:3 Letterboxing
    Sharpen = Schärfefactor (0 = inaktiv, 10 ist max)
    Threshold = Detail Schwellenwert (moment. nur bei non-HQ mask)
    HQmask = Didées Maske basierend auf doppeltem Sobel
    Show = Preview der Maske

    Beispiel:
    ADS(72,72,2,Letterbox=false,Sharpen=3,Threshold=4,HQmask=true,show=false)

    Ich wollte ein Script erstellen um mittlere bis schlechte DVDsources via Rebuilder , sowie captures via regulärem Encoding auf DVD zu bringen, und das kam (bis jetzt) dabei raus.

    (Vorsicht beim Kopieren des Codes, es scheint als ob dieses Board hier bzgl. Spacings etc. rumpfuscht :( )
    Links zur Erläuterung und zu Masktools Download sind im Ersten Post dieses Threads.




    @ Didée
    Jupp! Deine "Mask" ist weitaus detaillierter und pfiffiger :)

  • Zitat von Didée

    Ah, man beginnt die MaskTools zu entdecken ;)


    :ani_lol: Köstlich! -- Schön zu sehen, dass manche Leute ihre Freizeit sinnvoll nutzen! :daumen:

    [denk]Irgendwie erinnert mich "Double Sobel" - wenn man's absichtlich entsprechend ausspricht - an Baby Bruno von den Ottifanten.[/denk]

    Hab ich das bisher richtig verstanden, dass das Prinzip der "Unsharp Mask" auf die Rauschfilterung erweitert wurde? Oder steckte da doch noch was wesentliches mehr drin, was ich da übersehen hatte?

    Und wie sieht's bisher aus mit dem Preis-Leistungs-Verhältnis? (Rechenzeit / Effizienz)

  • Das Prinzip beläuft sich auf effizienteres Denoisen und ZUDEM erhalten der Details.
    Das wäre ja theoretisch das Optimum, jedoch kenne ich keinen .dll Filter der in einem solchem Maße denoisen kann, dass zudem die fürs Auge wesentlichen Details erhalten bleiben. Ich sage nur analog captures und trashy DVDs ("Black Rain" ist da ein Beispiel - voller Korn).

    Ausgangsbasis war dieser Test:
    http://www.kvcd.net/forum/viewtopic.php?t=6863

    Dort habe ich im letzen Jahr festgestellt, dass ein denoisen bei halber horiz. Auflösung ("One-Half-One" Method) weitaus effektiver ist, ein scharfes re-resizing bewirkt zwar ein besseres Bild als bei halber horiz. Auflösung zu bleiben und das an den Player zu senden, ABER man verliert selbstverständlich Details via Interpolation.

    Und da ist mir eben in den Sinn gekommen, via Masktools diese Details zu "cachen" ... mal simpel ausgedrückt.

    Also gehe ich hin, nehme den Stream, stauche ihn vertikal (mit spatialem softening via bicubics 1,0 Parameter), denoise ihn durch die halbe Auflösung besser, re-resize ihn und setze die originalen Details wieder drauf, welche ich zudem extra via sharpening behandeln kann.
    Ich resize aus folgenden Gründen vertikal:
    - Kameraschwenks in Filmen sind zum größten Teil horizontal, würde ich hingehen und sodann auf halber horiz. Aufl. temporal denoisen und dies sodann wieder horiz. auf die orig Aufl. strecken, so hätte ich viel mehr temporal-denoising Artefakte bei eben diesen Kameraschwenks (kennt man ja).
    - Oft sind Details durch ihre horizontale Auflösung definiert, so z.B. lange Haare etc. Diese würden bei horiz. Interpolation mehr leiden.

    Wenn interlaced material da durchgejagt wird MUSS die bob/ads()/seperatefields/selectevery/weave Methode genutzt werden!

    ZUDEM ists mit der "normalen Maske" sehr flott, da der Denoiser eben nur auf halber Pixel Anzahl arbeiten muss (zwei Fliegen mit einer Klappe). Bei Zuhilfenahme von Didées Double Sobel "HQmask" wird das Ergebnis zwar noch genauer! aber auch langsamer.
    Aber dies lässt sich eben alles via Parameter ein/ausschalten.

  • Zitat von incredible

    ... zwar noch genauer! aber auch langsamer.


    Pfh, pah! Unter "langsam" versteh' ich was gaaanz anderes. Wer meine Scripte kennt ... :D (... der wird ein geduldiger Mensch)

    Zumindest den "levels(0,1.0,255,0,255,false)" kannste bedenkenlos aus der HQmask-routine rausnehmen, wenn Du ihn nicht zum Aussteuern des Detail-levels verwendest (das geht nämlich prima damit). Solange da nur 0-255-0-255 drinsteht, ists eine reine Verschwendung von CPU-Zeit ...


    Zitat von incredible

    Das Prinzip beläuft sich auf effizienteres Denoisen und ZUDEM erhalten der Details.


    Hmmja ... ein wenig arbeitet die Methode aber schon in Richtung "scharfe Suppe": Was als direkt als prominentes Detail erkannt wird, wird geschärft, was nicht nach Detail aussieht, wird flachgemacht.

    Interessant wird's dort, wo sich Detail und Bildrauschen die Hände schütteln. Da mit milli-FPS Scripten noch die Reste 'rauszukratzen ... mhjamjam.
    (Hab' da gerade das DVB-capture eines Konzertvideos in Arbeit: 480*576 letterboxed, DAR1.85. Ein Feld komplett unbrauchbar: 480*288. Nach croppen: 464*208 - 'ne bessere Briefmarke, schlimm genug. Dazu noch ausreichend Rauschen und Artefakte,buhuu -- wenn's fertig ist [in anamorpher DVD-res], muss ich mal was posten...)


    Noch so'n paar lose Gedanken zu Deinem Script - rein theoretisch, weil ja alles so furchtbar laaangsaaam ist ...

    - das mit dem vorwiegend horizontalen Kameraschwenks & dem verträglicheren vertikalen Stauchen ist schon weitgehend richtig.
    Ausser bei horizontalen Kanten, und ausser wenn eben doch mal vertikal geschwenkt wird.

    Man könnte z.B. einen zweiten entrauschten Clip produzieren, bei dem aber horizontal gestaucht wird, und diesen dann über den ersten (vertikal gestauchten) drüberlegen mit einer Maske, die nur auf horizontale Kanten anspricht (den "5 10 5 0 0 0 -5 -10 -5" - Teil. Oder noch besser: aus der horizontal-Maske die vertikal-Maske mit yv12lutxy raussubtrahieren [wegen den Diagonalen]). Das passt dann in allen Fällen.


    - derzeit werden die Detail-Bereiche in Deinem Script fast gar nicht gefiltert ("nur" undot), höchstens geschärft. Mit allem Rauschen, das noch drin sein mag. Wenn die Quelle schon mit stärkerem Rauschen oder Film-Korn daherkommt (wie z.B. eben Black Rain), dann fliegen die Moskitos auch im Winter ...

    Da würden sich womöglich so Sachen wie STMedianFilter mit deaktiviertem temporalem Teil, oder eventuell DeGrainMedian, anbieten .
    Selber würde ich auch mal tritical's Filter antesten (hauptsächlich TBilateral, vielleicht TAnisotropic). Eignen sich oftmals gut, um Detail zu "bereinigen" - Manchmal aber auch nicht so dolle. Es kommt halt drauf an, wie üblich. Und die thresholds sind recht kitzlig.
    Jedenfalls, *wenn*, dann wohl eher nach dem Schärfen.

    Nor 'so Gedankenspiele, wie gesagt.


    @ LigH

    Ähm, mit Ottifanten kenn' ich mich gar nicht aus. Da geht der Scherz doch glatt an mir vorbei.

  • Zitat

    Pfh, pah! Unter "langsam" versteh' ich was gaaanz anderes. Wer meine Scripte kennt ...


    Ich schrieb nicht "langsam" sondern "langsamer". Det iss ja schoh' n Unterschied nich? (ich nutze oft R24() daher bin ich die Ruhe selbst) ;)

    Zitat

    Zumindest den "levels(0,1.0,255,0,255,false)" kannste bedenkenlos aus der HQmask-routine rausnehmen, wenn Du ihn nicht zum Aussteuern des Detail-levels verwendest (das geht nämlich prima damit).


    Und genau das habe ich vor, denn die "normale" Maske lässt sich ja via "th" in ihrem Schwellenwert steuern aber gestern Abend war ich dann zu faul, eine extra formel bzgl. th zu erstellen, welche dann auch th im gleichen Verhältnis auf die Levels() ansetzt. *öh

    Zitat

    Interessant wird's dort, wo sich Detail und Bildrauschen die Hände schütteln.


    Also deine Maske ist da meine erste Wahl bei guten DVD sourcen, da sie sehr gut Rauschen und echte Kanten differenziert (levels muss ja auch noch konfigurierbar via gleicher "th" Variable gemacht werden.)
    Bei eh nich so dollen Analogen Übertragungen reicht (mir momentan) die simple Maske (bei den beiden -bis jetzt- Testcaptures) aus. Aber ich bin bis jetzt bei meinen Threshold Wert findings immer mit vorab Preview der Maske und sodann ohne Preview mit Auge vorgegangen.
    Aber du hast Recht "final" ist das Ganze noch nicht ;)

    Zitat

    Man könnte z.B. einen zweiten entrauschten Clip produzieren, bei dem aber horizontal gestaucht wird, und diesen dann über den ersten (vertikal gestauchten) drüberlegen mit einer Maske, die nur auf horizontale Kanten anspricht (den "5 10 5 0 0 0 -5 -10 -5" - Teil. Oder noch besser: aus der horizontal-Maske die vertikal-Maske mit yv12lutxy raussubtrahieren [wegen den Diagonalen]). Das passt dann in allen Fällen.


    Hört sich SEHR interessant an!
    Werde heute Abend eh viel ausprobieren, denn ....

    Zitat

    derzeit werden die Detail-Bereiche in Deinem Script fast gar nicht gefiltert ("nur" undot), höchstens geschärft. Mit allem Rauschen, das noch drin sein mag. Wenn die Quelle schon mit stärkerem Rauschen oder Film-Korn daherkommt (wie z.B. eben Black Rain), dann fliegen die Moskitos auch im Winter ...
    Da würden sich womöglich so Sachen wie STMedianFilter mit deaktiviertem temporalem Teil, oder eventuell DeGrainMedian, anbieten .


    ... das ist genau der Punkt, welchen ich heute angehen wollte.
    Die Verwendung von TemporalSoften auf temporaler Ebene "sollte" eh nur eine Vorablösung sein, es gilt also noch andere Temp. Filter (Removegrain, sowie Tritical's Filter) zu testen.
    Die Edge-Filterung muss (wie du o.g. hast ) ebenso angegangen werden ... STmedianFilter(x,x,0,0) hatte ich schon ausprobiert, werde heute mal DeGrainMedian ausprobieren.

    Zitat

    Nor 'so Gedankenspiele, wie gesagt.


    Und solche "Gedankenspiele" sind ja die Wurzel aller leckeren Dinge.
    Thanks!


    PS: Eine Frage noch:
    Wie setzt sich so eine 3x3 Matrix zusammen ("5 10 5 0 0 0 -5 -10 -5") ??
    Hast du einen Link, wo das gut erklärt wird?
    Wäre gut zu wissen, was die Nummern in ihrer Anordnung bewirken, denn in Masktools steht da nicht viel, auch nicht, was den Divisor angeht.
    So z.B. wie Nummern von Nöten snd um ledigl. vertikal oder nur horizontal zu maskieren.

  • Zitat von incredible

    PS: Eine Frage noch:
    Wie setzt sich so eine 3x3 Matrix zusammen ("5 10 5 0 0 0 -5 -10 -5") ??


    Die Sobel-Funktion ermittelt die Differenzen zwischen den Pixeln in einer Dimension, um damit Kanten in der dazu senkrechten Dimension hervorzuheben. Überlagert man beide Funktionen, erhält man Kanten in jeder Richtung hervorgehoben.

    Code
    5  10   5
      0   0   0
     -5 -10  -5


    In dieser Anordnung sollte es etwas klarer werden. Soweit ich mich erinnere (ich war da mal editoriell am Wiki dran) hat die Webseite von AviSynth für "GeneralConvolution" ein paar brauchbare Links mit Beispielen, mindestens auf der englischen Seite.
    __

    Ach, auf der deutschen Seite auch; und "Emboss" hatte ich ja selber eingefügt...

  • Also ich kommentiere einfach mal weiter hier, statt auf KVCD. (Kein Bock mich auf ALLEN Foren anzumelden.)

    Nicht wahr, es ist lustig, dem Endverbraucher das Parameter-Tweaken für EdgeMasks beizubringen? Irgendwoher kenne Ich das ...

    Zitat von incredible

    BE CAREFUL with the adding of sharpeness as captures do also got a lot of noise on edges. That means if just sharpen those edges, mosquitos will be the result.
    And thats why still no new version of ads() was relesed this Weekend: I was searching for a best possible mask method based on an optimal convolution kernel.


    Den optimalen Kernel kannste suchen bis Du schwarz wirst: noch besser wird's nicht. Wenn sich die Leutchen über Ghosting beschweren, sollte die Maske mit levels(_low, _gamma, 255, 0, 255, false) angepasst werden: _gamma --> 1.5 < gamma < 3.5, um die schwächeren Details besser zu schützen, und _low für den Noise-Cutoff. (Hab vorher schon gesagt, dass Du Maske vermutlich härter einstellen solltest). Bei *starkem* Rauschen wär's bestimmt besser, die EdgeMask auf einem relativ grob entrauschen Input zu erstellen, und dann auf den originalen Input anzuwenden.

    Zumindest für Rauschen in den "flachen" Bereichen wär's das. Bleibt das Problem des Restrauschens in den Detail-Bereichen, die beim Schärfen so hinderlich sind.

    Aber wenn ich da jetzt noch lange weitermachen, landen wir irgendwann bei "iiP by Credible inc." ...

    Trotzdem wirst Du, um sauberes zusätzliches Schärfen zu ermöglich, an irgendeiner Form von Deringing kaum vorbei kommen. Ich wüsste da ein Script, das eine feine Maskierung dafür bereithält - aber laaangsaaam ... :D
    (Schneller Tip noch: eine gedünnte EdgeMask von einer verdickten subtrahieren, und die Bereiche dann vorsichtig beruhigen. Oder eben doch bilateral filtern. Oder beides :))

  • Bzgl. der Kernels hast du recht, lässt sich nur noch via (wie du oben genannt hast) Levels regeln. Was eine Generierung einer Maske auf einen vorher "grob" entrauschten Input angeht, das hatte ich gestern versucht (c =c.Temporalsoften(xxxx).hqmask().levels(...).blabla() ) wobei hqmask() die Funktion einer HQmask wäre (deine Double Sobel). Da kam dann aber leckeres Noise Ghosting bei raus, aber wie immer - der Teufel steckt im Detail - und Probieren geht über studieren (kennt man ja)

    Ich habe das Releasen von Script updates erstmal eingestellt und werde mich generell erst mal mit diversen Maskierungsmethoden und Masken untereinander beschäftigen - also was da möglich ist, so wie du es schriebst (add/subtract etc.).

    Wollte ja Anfangs mit einem Skript "nur" die Details beibehalten, aber dann wurds doch intensiv und "interessant", was da hinter "Maskierung" via Maktools alles steckt und möglich ist.
    Ist ein Studium für sich :) und wird so manche Abende kosten.

    Demnach nochmals danke und alles, was ich von deinen Tips übernehme wird natürlich "remark'ed" ;)

    Ich habe zudem noch festgestellt, das Masktools beim mergen sehr "eigen" vorgeht, was die "lower'en" Bereiche einer Maske angeht, da wird manchmal nur dass an Details später "overlayed", was in der Maske einen sehr sehr hohen y Wert hatte, also bei unter Y=128, da wird's quasi später im Overlay nicht mit übernommen (bei overlay meine ich den Vorgang von mergemask, nicht den avs command).

    Ich habe hier im Job viel mit Digitaler Bildbearbeitung via Photoshop zu tun und vor ca. einem Jahr hatte ich mal bei Apple.com einen Photoshop Trick gesehen (ein special .mov). Es wurde ein hoch komprimiertes jpeg aus dem www genommen (Flächen voll mit DCT Artefakten), sodann im Schulungs-Film hier und da was mit Ebenen und greyscale gemacht, die Farben volles Brot weichgezeichnet, sowie dass dann alles mit Ebene multipizieren "ge'merged" oder wie auch immer --- und schwupps .... das Bild hatte klare flächen und alles war bene.
    Ich könnte mich heute noch in den Hintern treten, da ich dieses mov auf meinem MAC nicht mehr finde.

Jetzt mitmachen!

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