High Quality - Deinterlacing mit AVISynth

  • Natürlich nicht, kriege ich auch jetzt nicht hin.

    nimm das code-Tag...

    ich muss meine Aussagen von frueher widerrrufen.

    separatefields().selectevery(4,0,3).weave()

    ist die variante, die die Fieldorder unangetastet laesst.

    nur leider gibts in AVS mehrere Filter, die das Vereiteln.
    Allen voran bob() und assumeframebased().

    beide filter fuehren intern ein assumebff() durch, auch wenn das eingangsvideo TFF war.

    somit waere dieses script eine Nichtstuaktion:

    avisource("dv-video.avi") #DV-Video ist immer BFF, jenes ist AVS-Standard!
    bob() #bobbt das Video, es wird nochmals als BFF markiert.
    separatefields().selectevery(4,0,3).weave()

    anders sieht es bei TV-Karten-Video aus.

    hier muss diese Befehlsfolge ran:

    avisource("dv-video.avi") #TV-Karten-Video ist (fast) immer TFF, aber AVS setzt BFF!
    assumetff() #deswegen setzen wir hier TFF
    bob() #bobbt das Video, es wird aber faelschlicherweise als BFF markiert.
    assumetff() #deswegen muss es jetzt wieder als TFF markiert werden.
    separatefields().selectevery(4,0,3).weave() # und nun wird es sauber als TFF interlaced ausgegeben.


    Die Frage die sich mir immer wieder stellte: warum am Ende SelectEvery(4,1,2) oder 4,0,3? Den Fragestellern ging es doch meistens um das "de"interlacen, womit sie wahrscheinlich das beseitigen der Kämme meinten; die beiden SelectEvery-Befehle erzeugen dagegen zwangsläufig wieder unglaublich scharfe Interlacing-Kämme bei bewegten Szenen. Wenn(!) ich die dann wieder entfernen will, kann ich auch gleich SelectEven() oder SelectOdd() nehmen und dafür ein interpoliertes Feld in Kauf nehmen?! Interpoliert ja nur im nicht statischen Teil, genau da würde ja ein nachgeschaltetes FieldDeinterlace() - oder was auch immer - auch interpolieren.

    ganz einfach: viele Filter koennen interlaced video nicht korrekt verarbeiten.

    und diese methoden:


    1)
    separatefields().filter().weave()

    oder
    2)
    separatefields()
    e=selecteven().filter()
    o=selectodd().filter()
    interleave(e,o).weave()


    sind nicht immer die besten moeglichkeiten, zu filtern.
    1) ist nicht gut fuer temporale filter geeignet
    und
    2) reduziert die temporale aufloesung um die haelfte.

    was also tun?

    BOB-Deinterlacen!

    3)
    assume?ff()
    bob()
    filter()
    assume?ff()
    separatefields().selectevery(4,0,3).weave()

    eines ist allen drei varianten gemein: ihr output ist INTERLACED.
    nur bietet die variante 3 die beste Qualitaet.

    es geht hierbei garnicht darum das video zu deinterlacen, sondern nur darum, das video dem filter moeglichst schmackhaft zu machen.

  • Yoei! Ich glaub mich tritt ein Perd...

    Ich hab bisher immer einfach mit separatefields.filter.weave gearbeitet. Jetzt teste ich gerade Variante 3 und ich kann's kaum glauben, ich bin begeistert! :ja:
    Muss Dich auch noch mal loben, scharfi!!!

  • Interessant - ich hatte das ja bisher immer so vorgesehen:

    1) Bei DV-Video (BFF):

    Code
    AviSource("DV-BFF.avi",true,"YUY2")    a = AssumeBFF()    # TMCBob    f = a.TomsMoComp(-1,5,0)    e = a.DoubleWeave().SelectOdd().TomsMoComp(-1,5,0)    Interleave(f,e).AssumeFrameBased()    Filter()    # Reinterlace    ConvertToYUY2()    SeparateFields().SelectEvery(4,0,3).Weave()


    2) Bei TV-Capture (TFF):

    Code
    AviSource("TV-TFF.avi",true,"YUY2")           a = AssumeTFF()           # TMCBob           f = a.TomsMoComp(-1,5,0)           e = a.DoubleWeave().SelectOdd().TomsMoComp(-1,5,0)           Interleave(f,e).AssumeFrameBased()           Filter()           # Reinterlace           ConvertToYUY2()           SeparateFields().SelectEvery(4,1,2).Weave()


    Punkt 1 (DV BFF) müsste dann ja so passen.

    Punkt 2 (TV TFF) muss ich dann aber ändern: aufgrund der Verwendung von AssumeFrameBased() in TMCBob wird das ursprüngliche TFF-Video als BFF gemarkt, so dass man also im Falle eines TFF-Videos beim Reinterlacen so verfahren muss:

    Code
    # Reinterlace
           ConvertToYUY2()
           AssumeTFF()
           SeparateFields().SelectEvery(4,0,3).Weave()


    Scharfis_brain, kannst du mir das bitte kurz bestätigen bzw. ggf. korrigieren?

    Edit: Habe meine Zusammenfassung hier aktualisiert: http://web.utanet.at/grundlau/Filtern von interlaced Video.pdf

    Danke, grua

  • Zitat

    beide filter fuehren intern ein assumebff() durch, auch wenn das eingangsvideo TFF war.


    Ich hoffe doch als letzte und nicht erste Aktion.

    Man kann auch

    Code
    function bobb(clip c){
      return getparity(c) ? c.bob().AssumeTFF() \
                          : c.bob().AssumeBFF()
    }
    
    
    function afrb(clip c){
      return getparity(c) ? c.assumeframebased().AssumeTFF() \
                          : c.assumeframebased().AssumeBFF()
    }


    usw. in ein avsi-Script packen und die benutzen. Solange die internen Funktionen sich nicht gegenseitig aufrufen, oder?
    Muß man jetzt sicherheitshalber nach jedem Funktionsaufruf ein AssumeTFF() einfügen?

    Zitat

    es geht hierbei garnicht darum das video zu deinterlacen, sondern nur darum, das video dem filter moeglichst schmackhaft zu machen.

    Das ist mir nach der Lektüre einiger Threads klar geworden. Damit bleibt aber die Frage nach dem High Quality - "Deinterlacing" noch offen, oder sollte ich das überlesen haben?

    Ich sehe 3 Möglichkeiten:
    (Bitte auch als Frage verstehen, ob ich die Funktionsweise wirklich verstanden habe.)

    Für alle zunächst einmal matchbob() (o.ä.) + gewünschte Filter, die ignoriere ich unten mal. Dann:

    1.)
    SeparateFields().SelectEvery(4,0,3) # liefert Kämme, deshalb
    FieldDeinterlace() # oder etwas in der Art

    2.)
    SelectEven() # habe fertig

    3.)
    das Video bei 50 FPS belassen


    zu 1.)
    Zeile 1 erhält zwar das Video möglichst originalgetreu - bezogen auf meine obige Grafik, würden z.B. bei Frame 1 die Fields B und b unverändert durchgeschleift zu C' bzw. d'-, FieldDeinterlace muß diese aber verändern, sonst bekomme ich die Kämme ja nicht weg.

    zu 2.)
    SelectEven() würde jetzt zum Beispiel Frame 2' auswählen, der besteht aus den Fields C' und c', die aber nicht weiter separiert werden. Davon ist C' das durchgeschleifte Field B, c' ist durch den Bobber interpoliert. Bei dieser Interpolation werden aber, wenn ich dich früher richtig verstanden habe, als statisch betrachtete Pixel von Field b übernommen (also gar nicht interpoliert), "bewegte" Pixel aber berechnet aus:

    b (dessen Position es ja einnimmt),

    B (enthält darüber und darunterligendes Pixel) und

    a und c (enthalten das entsprechende Pixel im vorausgehenden und nachfolgenden Frame).

    Und nur in der Art dieser Berechnung und der Erkennung dieser Pixel unterscheiden sich die verschiedenen Bobber (ist jetzt vielleicht etwas extrem formuliert, aber über die interne Funktionsweise weiss ich nicht viel).
    Vom Quellframe 1 gehen also nur "bewegte" Pixel in b "verloren", bzw. werden sie durch interpolierte Information ersetzt.

    zu 3.)
    enthält zwar die gesamte Originalinformation, aber genauso viel redundante (in statischen Bereichen) bzw. interpolierte (in bewegten Bereichen).


    Wenn das alles stimmt, würde ich Methode 2 beim Deinterlacen den Vorzug geben weil:

    1. dürfte sie etwas schneller sein wie Methode 1,

    2. wollen wir ja Filtern, es kommt also nie das Originalvideo unten raus; ob also 1 oder 2 ohne Filter etwas besser abschneiden dürfte egal sein,

    3. sollte man rein spatiale Filter oder Resizer genausogut auch nach SelectEven() einsetzen können, es sei denn, sie sollen vor einem temporalen Filter angewendet werden; was sich bei den Odd-Frames tut fällt ja eh raus. Das könnte enorm Zeit einsparen.


    Eine zusätzliche Überlegung:
    Könnte nicht der Einsatz eines rein temporalen Filters vor dem Bobber bei verrauschtem Video dessen Arbeit genauer machen? Oder haben die alle entsprechende Parameter dafür vorgesehen? Ich glaube, jetzt wäre die richtige Zeit, mir noch mal die Readmes dazu durchzulesen, ich habe damals nicht mal die Hälfte davon verstanden.

  • Hallo 0815-0815

    es kommt alles darauf an, ob Du ein
    progressives oder ein interlaced
    Video haben willst.

    Auf DVD kann man beides brennen.

    Die Kämme, die Du nach Methode 1 auf dem
    Computermonitor siehst, sind auf dem
    Fernseher nicht mehr zu sehen, weil die
    Halbbilder ja nacheinander dargestellt werden.

    Ein rein temporaler Filter müßte mit dem
    ursprünglichen interlaced Material zurecht-
    kommen - allerdings mit allen Problemen,
    die ein solcher Filter bei Bewegungen mit
    sich bringt. FluxSmooth oder Convolution3d
    kommen hier nicht in Frage, weil sie ja
    temporal und spatial kombinieren.

  • Ich glaub ich hab jetzt soviel ueber den Einsatz des TMCKernelBob-Scripts gegruebelt, jetzt bin ich ploetzlich verwirrt (haette ich mal nicht gegruebelt)...

    Ich habe eine interlaced Quelle, Deinterlacing via TMCKernelbob, und will dann Resizen... ist es denn jetzt noch erforderlich das Resizing mit SeparateFields.Resize.Weave zu machen? Ich muesste doch jetzt eigentlich mit progressivem Material arbeiten... allerdings ist in meinem Hinterkopf noch irgendwas in der Schwebe von wegen, das sollte besser mit Zerlegung in Fields gemacht werden.


    Edit: Hm, keiner weiss was... kommt mir ja katalanisch vor... :nein:

  • Hi,

    ich habe seit einiger Zeit auch scharfis's TMCKernelBob (mit Ligh's kleiner Abänderung) im Einsatz und bin schwer beeindruckt von diesem Skript!

    Aber: zusammen mit anderen Filtern (mvdenoise+limitedsharpen+removedirt+deen) kam es immer wieder zu hässlichen Artefakten. Die Lösung war SetMemoryMax(128) statt nur 64!
    Ausserdem finde ich den default-threshold zu hoch, da es bei schnellen Bewegungen so doch wieder Artefakte (keine Kämme aber falsche Punkte/Linien/kleine Flächen) gibt. Ich nehme dann lieber einen kleinen Detailverlust in Kauf und setze th=3..4.

    mfg

  • Hallo zusammen,
    ich weiß, dieser Beitrag ist schon uralt, aber ich versuche es dennoch einmal.
    Und zwar bin ich ein absoluter Neuling, was AviSynth und VirtualDub angeht. Und ich würde auch gerne diesen Deinterlacer benutzen, ohne die Schärfe in den Videos zu verlieren, und ohne die Übergänge der einzelnen Bilder zu sehen. Wie es aussieht, soll das ja auch in diesem Beitrag mit den Skripten möglich sein. Nur so langsam verzweifle ich.
    Kann mir da vielleicht jemand (Schritt für Schritt) erklären, wie ich diese Plugins und Skripte benutzen muss, damit ich mein aufgenommenes Video (Hi8 über TV-Karte) deinterlacen kann.

    Bitte, bitte, bitte...

    Vielen Dank schon einmal im Voraus.

    P.S.: Oder gibt es da jetzt schon einfachere, bzw. bessere Möglichkeiten dies zu tun???

Jetzt mitmachen!

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