Bildstabilisierung durch VHS-Mehrfachaufnahme

  • Code
    1. function contrabob(clip c, string "speed"){speed = default( speed, "fast" ) # "fast" = bob(), "slow" = NNEDI3(speed=="fast") ? c.bob(-.5,.25) \ c.nnedi3(field=-2)maxx=last.mt_logic(last.selectevery(1,-1),"max",U=3,V=3).mt_logic(last.selectevery(1,1),"max",U=3,V=3)minn=last.mt_logic(last.selectevery(1,-1),"min",U=3,V=3).mt_logic(last.selectevery(1,1),"min",U=3,V=3)clense(reduceflicker=false).merge(last,0.51)mt_adddiff(mt_makediff(last,last.clense(reduceflicker=false),U=3,V=3),U=3,V=3)sharpen(0,1).mt_clamp(maxx,minn,0,0,U=3,V=3)return(last)}




    ... immer unter der Voraussetzung, dass die Quelle das ist, was wir hier annehmen (interlacing mit fieldblending). Bereits eine "kleine" Abweichung von der angenommenen Charakteristik kann die "richtige" Lösung zu einem kapitalen Fehlschlag werden lassen.


    (Es gab schon desöfteren den Fall, dass tage- und seitenlang über eine Lösung theoretisiert wurde, und dann kam schließlich doch noch ein Sample, und - siehe da: "Ach! SO ist das?! Okay, dann waren alle bisherigen Vorschläge leider falsch"...)

  • Oh, ein Sample. Sehr schön.


    Jetzt erinnern wir uns an

    und - siehe da: "Ach! SO ist das?! Okay, dann waren alle bisherigen Vorschläge leider falsch"...)


    Komma,


    besorgen uns außerdem eine Nasenklammer weil wir ganz furchtbar nach Gülle riechen,


    vergessen den ganzen Kram mit Bobbing und Srestore und tralala,


    stattdessen schreiben wir


    Code
    1. movie
    2. assumetff().doubleweave().selectodd()


    und schauen mal was passiert. :)

  • Geniert hab' ich mich ja heut schon, überspring ich jetzt mal einfach.


    Heißt das, das die Felder einfach nur in der falschen Reihenfolge abgespielt werden?


    Japan --> Deutschland bei Bildverschwurbelung hieß dann ja wohl nicht NTSC --> PAL mit Blends. :floet:

  • Zitat

    Bloß ein Phaseshift? Wie langweilig.


    Vielleicht macht es die 4fach-Überlagerung dann wieder spannend. Wenn ich mir ansehe, wie das Bild in einem 10-Sekunden-Sample mehrfach um 4 Rasterzeilen hoch- oder runterspringt ... in Frame 8 scheint eine Bewegungsphase zu fehlen (2 Felder) ... in Frame 26 ist ein Feld an falscher zeitlicher Position, ...


    Ob dies wirklich in allen 4 Captures identisch ist? Wenn nicht, dann gibt's großes Gematsche.

  • Ja, besonders das vertikale Hin-und Hergewander des eigentlichen Bildes hatte ich als nächstes auf dem Plan. (Müssten sich ungleiche Rasterzeilensprünge in den vier Aufnahmen nicht in Geisterbildern äußern? Davon habe ich jetzt beim flüchtigen Sichten keine gefunden in der deinterlaceten Zusammenführung.) Und deine "Rumspielerei" plus Kraut gegen die Laufstreifen brächten wahrscheinlich danach schon ein für mich tolles Ergebnis.


    Edit: Geisterbilder (worunter ich Blends aus pixelversetzten kompletten gleichen Fields oder Blends aus kompletten verschiedenen Fields verstehen würde) habe ich weiterhin nicht gefunden, aber manche aus assumetff().doubleweave().selectodd() [ / .selecteven() (fehlende Fields?)] resultierende Frames wirken, als ob in einer der Ursprungsaufnahmen eine Pixelreihe mehr mitten im Bild war (untere Framehälfte scharf, obere Framehälfte verschwommen, eine scharf begrenzte Pixelreihe in graubunt direkt unter dem oberen schwarzen Balken).


    Und mal so 'ne Idee: Könnte man nicht mit ConditionalReader und Autocrop das eigentliche Bild grob "entrahmen"?

  • Ja, solche "Geisterbilder" wären ein Zeichen für Nicht-Synchronität. Solange alles wirklich synchron ist, sollten die Frames bzw. der Bildinhalt weitgehend deckungsgleich sein. Wenn irgendwas nicht richtig synchron wäre, dann würden in bewegten Szenen Bilder mit unterschiedlicher Bewegungsphase übereinandergelegt, und das sollte man recht eindeutig sehen können.


    manche aus assumetff().doubleweave().selectodd() [ / .selecteven() (fehlende Fields?)] resultierende Frames wirken, als ob in einer der Ursprungsaufnahmen eine Pixelreihe mehr mitten im Bild war


    Die Halbbilder werden aber nicht verändert, nur anders zusammengesetzt. Soll heißen, eine scharf begrenzte Pixelreihe in graubunt diese Pixelreihe muss vorher auch schon drin gewesen sein, im nachfolgenden Frame.



    Dem Hin-und-Her-Springen des Bildes wird man mit automatischen Filtern nicht so einfach begegnen können. Wären es Ausreißer von 1,2,3 Frames oder so, das könnte man wegfiltern. Aber wenn das Bild jeweils für dutzende oder Hunderte von Frames an einer Stelle sitzt, dann die Position wechselt, dort wieder länger verbeibt, später wieder zurückspringt, usw.usf., dann wird's schwierig mit "Automatismen". Man könnte eventuell auf einen harten Offset prüfen (checken ob ein sehr kleiner Bildbereich entweder "Schwarz" (Balken) oder "nicht-Schwarz" (d.h. "Bild") ist, und dann entsprechend korrigieren .... aber das ist ScriptClip-Gefummel, schüttel ich auch nicht eben mal aus dem Ärmel, und mit ziemlicher Sicherheit besteht auch die Gefahr von "Fehlentscheidungen" (die, wenn sie auftreten, die betreffende Stelle dann nicht besser, sondern schlechter machen.)



    Warum fasse ich VHS normaleweise gar nicht erst an? Ach ja .... macht viel Arbeit, und der Erfolg scheint irgendwie niemals den Aufwand zu rechtfertigen ...

  • Code
    1. function contrabob(clip c, string "speed"){speed = default( speed, "fast" ) # "fast" = bob(), "slow" = NNEDI3(speed=="fast") ? c.bob(-.5,.25) \ [B][COLOR='#FF0000']:[/COLOR][/B] c.nnedi3(field=-2)maxx=last.mt_logic(last.selectevery(1,-1),"max",U=3,V=3).mt_logic(last.selectevery(1,1),"max",U=3,V=3)minn=last.mt_logic(last.selectevery(1,-1),"min",U=3,V=3).mt_logic(last.selectevery(1,1),"min",U=3,V=3)clense(reduceflicker=false).merge(last,0.51)mt_adddiff(mt_makediff(last,last.clense(reduceflicker=false),U=3,V=3),U=3,V=3)sharpen(0,1).mt_clamp(maxx,minn,0,0,U=3,V=3)return(last)}



    Sorry Didée aber in den oberen Script muß ein "Doppelpunkt" (ROT) in Line 5 damit es läuft. Nur so als kleine Korrektur....War bestimmt im Eifer des Gefechts. :D


    Aber ich brauche auch nochmal Deine Hilfe dazu.In meiner Sache(anderer Thread...siehe unten) hatte ich ja mal geschrieben das ich mehere DVDs von einen und den selben Film habe( LigH weiß was ich meine). Nun habe ich mit diesen Script noch mal die eine DVD-Version probiert aber es ist immer noch nicht so richtig Perfekt. Die eine DVD(25p) bekomm ich sauber zum laufen aber hat ne niedrige Mpeg2-Rate(Deblock und dieser Kram) und bei dieser DVD(25i---original 23,976fps) da kommt nur Müll bei raus aber sie hat ne hohe Mpeg2-Rate. Sagen wir mal so es funktioniert schon mit Srestore aber irgendwas stimmt da noch nicht so richtig. Ich kann es nicht so richtig beschreiben....müßtest Du mal selber sehen.


    http://forum.gleitz.info/showthread.php?45162-TGMC-Beta3-Spitzenmäßig-Aber!!!

  • Nein von diesen Video noch nicht.
    Momento kommt gleich....45MB...mpv-Datei


    Edit:
    Okay hier ein Ausschnitt: MPV-Datei
    Es funktioniert eigentlich perfekt mit srestore aber gerade bei der reinfahrenden Schrift sieht man das Problem....Was ist das für eine Sch..ße???

  • Ich wollte mir die Ausgabe für die weitere Arbeit etwas handlicher und weniger "sprunghaft" machen und habe das an den Schluss des Skripts gesetzt:


    Code
    1. ScriptClip(movie.assumetff(), "AutoCrop(0, 712, 416, 4, 4, 4, 4, 40, 1, myVar, myVar, 0)")
    2. ConditionalReader("G:\Framelist.txt", "myvar", false)


    Avisynth schreibt mir dann aber nur in die Ausgabedatei (ohne dass ein Zentrieren des Films passieren würde) :


    Zitat

    ScriptClip: Function did not return a video clip with the same width as the source clip!


    Kann mir das bitte einer erklären?

  • nodunlop
    Heuwägelchen ... ConditionalReader/Writer hab ich vor -zig Jahren zum letzten Mal benutzt. Und Autocrop noch gar niemals. :)




    Propaganda


    Ah, jetzt, ja ...


    Sagen wir mal so es funktioniert schon mit Srestore aber irgendwas stimmt da noch nicht so richtig


    Soweit ich sehen kann, macht Srestore weitgehend alles richtig. Das was da "nicht stimmt" ist das Quellmaterial: das ist nämlich sowas von besch....eiden, die Ghost-Artefakte um die Schrift sind bereits in den Originalfeldern drin. (Der Mpeg-Encoder war überfordert, und hat wegen der interlacten Struktur das Ghosting der Nachbarfelder in die vormals sauberen Zwischenfelder hineintransportiert. Vielleicht war auch noch ein temporal-Rauschfilter mit am Werk, der nach der NTSC>PAL Konvertierung angewendet wurde.)


    "Crap in, crap out."

  • Danke Didèe
    Das ist genau das was ich vermutet hatte aber nicht so richtig glauben wollte. Jetzt könnte ich meine ganzen DVD-Quellen nehmen und sie auch aufeinanderlegen.Aber da kommt wahrscheinlich auch nur Müll bei heraus. Schade!

  • Ich kann zwar auf die Art und Weise das Bild etwas stabilisieren und den Speicherbedarf für das Ergebnis senken,


    Code
    1. AutoCrop(movie.trim(0,0),0,716,424,0,0,0,0,30,1,0,0,0) \...+ AutoCrop(movie.trim(11,11),0,716,424,0,0,0,0,30,1,11,11,0) \...+ AutoCrop(movie.trim(99,99),0,716,424,0,0,0,0,30,1,99,99,0)


    aber für den ganzen Film muss das natürlich 'ne Schleife werden. Die hier tut's aber nicht, sondern gibt nur den letzten Frame (den aber wie gewollt beschnitten und zentriert) aus [der jeweils letzte Fame überschreibt den Vorgänger].



    Code
    1. GScript("""for (i=0,99) {AutoCrop(movie.trim(i,i),0,716,424,2,2,4,4,30,1,i,i,0)}""")




    Edit:


    So sieht es jetzt aus. Dauert bloß ewig, bis das Skript geladen ist (deshalb zunächst auf die ersten 100 Frames beschränkt).