Korrektur einzelner Frames mit Avisynth

  • Hallo,


    beim Digitalisieren meiner (alten) Hi8-Kassetten tritt ein Problem sporadisch auf: eine horizontale Störung.

    Eigentlich gibt es drei verschiedenen Ausprägungen:

    1. ein dünner schwarzer, horizontaler Strich über das ganze Bild (läuft nicht wie bei VHS-Dropouts von oben nach unten)
    2. ein etwa fingerdicker Streifen über das gesamte Bild mit Verzerrungen
    3. ein etwa fingerdicker Streifen über das gesamte Bild mit verfälschten Farben


    Meistens ist nur ein Frame betroffen, oft nur ein Halbbild.

    Manchmal sind es Stellen, die besonders wichtig sind.


    Was ist von einer Lösung zu halten, nur ein Halbbild zu verwenden (für den betroffenen Frame)?


    oriB = oriA.SeparateFields().Bob().SelectEven()

    oriC = oriA.SeparateFields().Bob().SelectOdd()


    Ich würde dann den Frame aus oriA durch den entsprechenden aus oriB oder oriC ersetzen.

    Gibt das Probleme, leidet die Qualität darunter?


    Gibt es bessere Ansätze?

    Z.B. ein Frame durch einen aus vorherigem und nachfolgendem Frame zu berechnen?

    Oder nur einen Zeilenbereich zu ersetzen?


    Die Werkzeuge stehen mir eigentlich durch avsPmod, Python und Avisynth zur Verfügung.

    Für die Korrektur von weißen Fischen setze ich das auch schon ein, wäre nur zu erweitern.


    Highwayman.

  • Hallo,

    kurz zu dem Problem mit den diversen Streifen. Da gibt es meiner Erfahrung nach nur zwei Möglichkeiten, dass das so dargestellt wird.

    Entweder liegt es an den alten Bändern, oder an alten Elkos, die bei deinem Camcorder getauscht werden müssten.


    Mir sieht es aber nicht wie nach Drop-out’s aus, ich tippe eher auf einige defekte Elkos.

    Ich schlage vor, dass du das einmal mit einem anderen Hi8-Wiedergabegerät überprüfst.


    Gruß

    Jo

  • Hallo,


    ich greife das Thema noch einmal auf.

    Ich möchte gerne einen Clip definieren, der jeden Frame (der ersten und letzten erst einmal ausgeklammert) durch eine Interpolation des vorherigen und des nachfolgenden ersetzt.

    Dabei bin ich auf folgendes gestoßen:


    function fflow (clip c)

    {

    sup = c.msuper (pel=1)

    bv = sup.manalyse (isb=true)

    fv = sup.manalyse (isb=false)

    c.mflowfps (sup, bv, fv, num=0)

    return(c.mflowfps (sup, bv, fv, num=0))

    }



    Aufruf dieser Funktion wie folgt:


    function I1ClipV (clip c)

    {

    o = c

    flowed = interleave( o.selecteven().fflow(), o.selectodd() .fflow() ).selectevery(4, -1, 2)

    return (flowed)

    }


    Ist das so korrekt bzw. was lässt sich verbessern?


    Mich irritiert, warum hier oberes und unteres Feld nicht erst getrennt werden müssen, also so:


    function I1ClipV (clip c)

    {

    o = c.SeparateFields()

    flowed = interleave( o.selecteven().fflow(), o.selectodd() .fflow() ).selectevery(4, -1, 2)

    return(flowed.weave())

    }


    Das Ergebnis ist hier aber ein anderes, unerwünschtes.

    Aus einer Sequenz von Frames blau blau rot blau blau macht

    (1) blau dunkelrot blau dunkelrot blau

    (2) blau violett dunkelrot violett blau


    Demnach arbeitet nur (1) richtig, weil es den roten Fehlerframe durch einen blauen ersetzt.

  • Das war schon klar, allerdings hatte ich die Funktion fflow nicht verstanden. Ich bin davon ausgegangen, dass ich mit selecteven und selectodd die Halbbilder getrennt bearbeite.

    OK, mit selecteven und selectodd nehme ich jeweils nur jeden zweiten Frame, und fflow setzt dann immer einen interpolierten Frame dazwischen.

    Dann werden die getrennten Clips wieder zusammengefügt (interleave) und jeweils nur die interpolierten Frames herausgepickt (selectevery).

    Das ist prinzipiell das, was ich wollte.

  • SeparateFields erzeugt aus dem Paar Halbbildern, das sonst zu einem Vollbild verwoben ist, zwei neue Vollbilder nacheinander. Du hast damit also doppelt so viel Frames halber Höhe. Danach würden SelectOdd und SelectEven die neuen Halbbilder von diesen neuen Frames bilden.

  • Leider ist die Qualität des interpolierten Frames nur bei ruhigen Bildern akzeptabel, bei Bewegungen haben Personen schon mal 3 Beine oder 6 Finger.

    Kann man an der Funktion noch etwas schrauben?


    function fflow (clip c)

    {

    sup = c.msuper (pel=1)

    bv = sup.manalyse (isb=true)

    fv = sup.manalyse (isb=false)

    c.mflowfps (sup, bv, fv, num=0)

    return(c.mflowfps (sup, bv, fv, num=0))

    }

  • Bei bewegten Bildern erscheint es besser, den Ersatzframe aus einem Halbbild zu berechnen. Natürlich nur, wenn die Störung auf ein Halbbild beschränkt ist.

    Wie oben beschrieben:


    oriB = oriA.SeparateFields().Bob().SelectEven()

    oriC = oriA.SeparateFields().Bob().SelectOdd()


    Hier ist mir aufgefallen, dass der Odd-Frame in der Regel sehr viel schlechter ist als der Even-Frame.

    Woran kann das liegen?


    stackhorizontal (oriA, oriB, oriC)