Ersatz eines fehlenden Halbbildes durch Interpolation mit Avisynth

  • Hallo,


    ich suche nach einer Avisynth-Funktion oder einem Skript oder einer Möglichkeit, fehlende oder defekte Halbbilder in Interlaced-Material (YUY2) durch ein interpoliertes Halbbild zu ersetzen.

    Dabei sollte das andere vorhandene Halbbild (vorrangig) genutzt werden.

    Lösungen, das ganze Bild durch Interpolation zwischen Vorgänger und Nachfolger zu ersetzen, brigen bei bewegten Bildern schlechte Ergebnisse.


    Gruß

    Highwayman

  • Im Grunde wäre das die Hauptaufgabe eines Deinterlacers mit Bewegungsschätzung, wie QTGMC oder TDeint. Diese erzeugen im Bob-Modus einen Clip, in welchem abwechselnd jeweils ein Field durch eine Interpolation aus Informationen umgebender Fields ersetzt wird. Man müsste im besten Fall also nur das korrekte Field mit exakter Nummer einzeln ersetzen können. Daraus eine Funktion zu bauen, traue ich mir aber ohne Material und Zeit zum Testen erst mal nicht zu...

  • Die Auflösung in aus Halbbildern erzeugten Frames erreiche ich mit folgenden Varianten:


    SeparateFields().Bob(0.0, 1.0)

    TDeintBob(tff=True)

    TMCBob(tff=True)


    Bei meinem Testclip trat bei allen 3 Varianten das Phänomen auf, dass die Frames abwechselnd "brauchbar" und "unscharf" waren. Dann habe ich festgestellt, dass dies schon bei SeparateFields der Fall ist. Es sieht aber wohl so aus, dass das nur bei einem Clip der Fall ist.


    Derzeit experimentiere ich mit TomsMoComp(0,-1,0).


    Mir geht es nicht um ein Ersetzungsskript. Das habe ich bereits: ich hinterlege zu einem Frame aus einer Python-Anwendung heraus eine Zahl, die einen Alternativclip beschreibt. So ist z.B. 2 eine zweite Digitalisierung, 3 eine Bereinigung von Fischen, 4 eine Wiederherstellung aus dem oberen Halbbild etc.


    Jetzt geht es um die Definition der Alternativen, also z.B. eine (optimale) Formel für einen Clip berechnet nur aus oberen Halbbildern.

    Dort, wo ein Bild eine Störung im unteren Halbbild hat, wird der Frame durch den entsprechenden Frame im Alternativclip ersetzt (mit den bekannten Avisynth-Funktionen).

  • Idee ist also, eine Zerlegung in Halbbilder vorzunehmen.

    Mein Material ist TFF:


    ori = ori.AssumeTFF()

    xTop = ori.separatefields().selectEven()

    xBot = ori.separatefields().selectOdd()


    TomsMoComp (0,-1,0) rechnet die Halbbilder hoch, aus sich selbst heraus durch interpolierte Zwischenzeilen, ohne Betrachtung anderer Frames:


    even = xTop.TomsMoComp(0,-1,0).assumeframebased().assumeTFF()

    odd = xBot.TomsMoComp(0,-1,0).assumeframebased().assumeTFF()


    Die Einzelbetrachtung der Clips even und odd macht einen guten Eindruck.


    Jetzt wollte ich zu Testzwecken daraus wieder den Urspungsclip ori berechen:


    even2 = even.separatefields().selectEven()

    odd2 = odd.separatefields().selectOdd()


    q = interleave (even2, odd2).assumetff().weave()

    oder

    q4 = interleave (even, odd).SeparateFields().SelectEvery(4,0,3).weave()


    Ableich mit subtract zeigt q=q4, aber keine Identität mit ori.

    Es sieht so aus, als ob die Bilder vertikal verschoben sind, vielleicht um eine Zeile.

  • OK, ich habe den Fehler gefunden.

    even und odd werden von TomsMoComp natürlich nach dem gleichen Verfahren erstellt.

    Unter einer (Original-) Zeile wird eine interpolierte Zeile eingefügt.

    Die Originalzeilen erhalte ich also in beiden Fällen durch selectEven:


    even2 = even.separatefields().selectEven()

    odd2 = odd.separatefields().selectEven()



    Mit q = interleave (even2, odd2).assumetff().weave() erhält man dann den Originalclip ori unverändert zurück.

    Alternativ dazu geht auch:

    q7 = interleave (even, odd).SeparateFields().SelectEvery(4,0,2).Weave()

    q8 = interleave (even.SeparateFields(), odd.SeparateFields()).SelectEvery(4,0,1).Weave()


    ori = q = q7 = q8

  • Du möchtest also nicht die Variante verwenden, die ich empfohlen habe: QTGMC oder TDeint im Bob-Modus (der sollte bei QTGMC Standard sein)? Da passiert genau das (Halbbilder separieren und Auffüllen der jeweils abwechselnd fehlenden Halbbilder aus der Umgebung), nur mit Bewegungsinterpolation noch hochwertiger, vor allem bei QTGMC. Aus dem Ergebnis erhältst du schon mit SelectOdd() oder SelectEven() jeweils die beiden Clips, in denen überall das eine Halbbild original und das andere interpoliert ist.

  • Du möchtest also nicht die Variante verwenden, die ich empfohlen habe: QTGMC oder TDeint im Bob-Modus (der sollte bei QTGMC Standard sein)?

    Doch, ich möchte nach und nach alle Varianten probieren. QTGMC habe ich erst einmal zurückgestellt, weil ich da die Avisynth-Version wechseln muss (die läuft auf einer anderen, Win 10-Partition). Mit TDeint hat es noch nicht so funktioniert, dass die Gegenprobe (Wiederherstellung ori) Identität zeigt.

  • Oh, bei den Vergleichen mit subtract (zwischen ori und den jeweils aus einem Halbbild berechneten Clips) ist mir erneut aufgefallen, dass die Abweichungen bei odd größer sind als bei even.

    Nun habe ich auch eine Erklärung.

    Das Verfahren oben arbeitet nicht symmetrisch.


    Bei even sind die oberen Halbbilder zeilenweise identisch.

    Bei odd hingegen (hier müsste die interpolierte Zeile jeweils oberhalb eingefügt werden) findet eine Verschiebung statt, die Originalzeile matcht mit der interpolierten Zeile.



    Wenn es bei TomsMoComp keinen entsprechenden Parameter gibt (den ersten teste ich noch), dann muss ich vielleicht mit FlipVertical arbeiten. Das funktioniert dann jedenfalls in der Theorie (und dann auch mit üblichen selectEvery(4,0,3).