Wie ReInterlace ich richtig ? |
Herbie
Mitglied
Dabei seit: 25.04.2004
Beiträge: 41
Herkunft: Aus der Kurpfalz
|
|
|
01.08.2004 21:04 |
|
|
Selur
spamming old Newbie
Dabei seit: 13.03.2002
Beiträge: 10.933
|
|
|
01.08.2004 23:28 |
|
|
Balm
DVDtoOgm&DVDtoMkv-Team
Dabei seit: 17.03.2002
Beiträge: 2.397
Herkunft: Sachsen
|
|
Warum antwortest du dann?
Cu Balm
__________________
|
|
02.08.2004 03:42 |
|
|
Selur
spamming old Newbie
Dabei seit: 13.03.2002
Beiträge: 10.933
|
|
weil ich auf das exotisches Interlacing hinweisen wollte.
Cu Selur
__________________ Hybrid
|
|
02.08.2004 08:08 |
|
|
Videostation
Super Moderator
Dabei seit: 16.03.2002
Beiträge: 1.533
Herkunft: Dresdner Raum
|
|
Wieso willst du wieder Interlacing einführen? Wenn das Material schon mal deinterlaced wurde, z.B. mit TomsMoComp, kann man es nicht einfach wieder in interlaced Material wandeln. Denn die höhere zeitliche Auflösung des Quellmaterials ist mit dem Deinterlacing schon verloren gegangen. Deshalb macht es eigentlich auch keinen Sinn.
CU Videostation
__________________ WWW.VIDEOSTATION-ONLINE.DE
|
|
02.08.2004 15:13 |
|
|
Herbie
Mitglied
Dabei seit: 25.04.2004
Beiträge: 41
Herkunft: Aus der Kurpfalz
Themenstarter
|
|
Hallo,
@ Videostation
danke für Deinen Ratschlag.
Man sagt man in Fachkreisen, daß z. B. der Deshaker eben bei deinterlactem Material bessere Ergebnisse abliefert und wenn man mit einem Bobber, z.B. kernelbob() oder tmcbob() deinterlaced, dann werden aus den 50 Halbilder nicht 25 Vollbilder sondern 50 Vollbilder, da ein Bobber das Halbbild durch Interpolation auf ein Vollbild streckt und es sollen alle Bildinfos erhalten bleiben. Danach soll man dann wieder ReInterlacen.
Deshalb meine Frage.
Wie siehst denn Du diese Sache ?
Gruß Herbie
|
|
02.08.2004 15:48 |
|
|
Videostation
Super Moderator
Dabei seit: 16.03.2002
Beiträge: 1.533
Herkunft: Dresdner Raum
|
|
Zum Deshaker kann ich nichts sagen, da ich damit noch nicht gearbeitet habe. Was den Bob-Filter angeht hast du natürlich recht, die zeitliche Auflösung bleibt erhalten. Allerdings sehe ich das Problem in der Interpolation des Bildes, weil man nachher nicht einfach wieder jede zweite Zeile daraus entfernen kann. Ich denke da kann es recht unschöne Artefakte geben, wobei das von der Ausgangsqualität abhängt.
Prinzipiell könnte das Skript wie folgt aussehen:
...
VerticalReduceBy2()
AssumeFieldBased()
Weave()
Damit bekommst du zumindest aus 50 Vollbildern wieder einen Interlaced Clip. Wie es mit der Bildqualität ausschaut weiß ich aber nicht.
CU Videostation
__________________ WWW.VIDEOSTATION-ONLINE.DE
|
|
02.08.2004 16:41 |
|
|
EthanoliX
Kaiser
Dabei seit: 11.04.2002
Beiträge: 1.310
Herkunft: Mainz
|
|
Das Problem wird sein, daß man bei den geraden Frames jede 2. Zeile, beginnend mit der ersten, und bei den ungeraden Frames jede 2., beginnend mit der 2. Zeile auswählen muß oder umgekehrt, je nach dem ob das Video TTF oder BFF war.
Frage, gibt es einen Filter, der zwei Clips derart kombinieren kann, daß die Bilder abwechselnd eingeflochten werden? Eine Art Weave() sozusagen, nur daß als Vorlage nicht ein field based Video , sondern zwei frame based Clips dienen?
Falls Ja, könnte man den bob-deinterlaced Clip (50 fps, 576 Zeilen) folgendermaßen bearbeiten:
top=SelectOdd(clip).separateFields().AssumeFrame.Based().SelectEven()
bottom=SelectEven(clip).SeparateFields().AssumeFrameBased().SelectEven()
Und danach müßte man dann die meiden Clips top & bottom mittels der Funktion, von der ich nicht weiß, ob sie existiert, zu einem Video zusammensetzen.
__________________ "Der größte Trick, den der Teufel je gebracht hat, war die Menschheit glauben zu lassen, es gäbe ihn gar nicht."
Roger "Verbal" Kint, Die üblichen Verdächtigen
|
|
03.08.2004 11:50 |
|
|
Selur
spamming old Newbie
Dabei seit: 13.03.2002
Beiträge: 10.933
|
|
meinste Weave ?
__________________ Hybrid
|
|
03.08.2004 11:57 |
|
|
EthanoliX
Kaiser
Dabei seit: 11.04.2002
Beiträge: 1.310
Herkunft: Mainz
|
|
Zitat: |
Original von Selur
meinste Weave ? |
Kann Weave zwei separate Clips zu einem zusammenfügen? Falls ja, dann ja.
Ich dachte damit würden jeweils zwei benachbarte Frames eines Clips, zu einem doppelt so hohen Frame zeilenverwebt.
Hm, nachher mal testen.
__________________ "Der größte Trick, den der Teufel je gebracht hat, war die Menschheit glauben zu lassen, es gäbe ihn gar nicht."
Roger "Verbal" Kint, Die üblichen Verdächtigen
|
|
03.08.2004 12:03 |
|
|
Selur
spamming old Newbie
Dabei seit: 13.03.2002
Beiträge: 10.933
|
|
Zitat: |
Kann Weave zwei separate Clips zu einem zusammenfügen? |
ne, aber:
Interleave(top, bottom)
bzw.
Interleave(bottom, top)
sollte das machen, was Du willst
Cu Selur
__________________ Hybrid
|
|
03.08.2004 14:31 |
|
|
EthanoliX
Kaiser
Dabei seit: 11.04.2002
Beiträge: 1.310
Herkunft: Mainz
|
|
Yo, damit sollte es dann gehen. Werde ich nachher gleich mal testen.
__________________ "Der größte Trick, den der Teufel je gebracht hat, war die Menschheit glauben zu lassen, es gäbe ihn gar nicht."
Roger "Verbal" Kint, Die üblichen Verdächtigen
|
|
03.08.2004 14:42 |
|
|
EthanoliX
Kaiser
Dabei seit: 11.04.2002
Beiträge: 1.310
Herkunft: Mainz
|
|
Hab's mal getestet, hat geklappt. Das Skript (edit: Achtung Fehler, s. nächster Post) dazu sieht folgendermaßen aus:
clip=SegmentedAviSource("g:/_temp/capture001.avi").AssumeTFF().Bob(1/3,1/3)
#(1)
Top=SelectOdd(clip).separateFields().AssumeFrameBased().SelectOdd()
Bottom=SelectEven(clip).separateFields().AssumeFrameBased().SelectEven()
#(2)
fertig=Interleave(Top,Bottom).AssumeFieldBased().weave()
#(3)
return fertig
zu (1)
An dieser Stelle hat man den Bob-deinterlaced Clip mit voller Auflösung und 50 fps. Hier kann man nach Herzenslust Filtern
zu (2)
Hier wird's ein wenig komplizierter, deshalb nochmal die drei Schritte mit der Erklärung warum in der entsprechenden Reihenfolge (für Top):
SelectOdd() Die ungeraden Frames von Clip entsprechen den Top Fields der Source und genau das sollen die Frames aud Top auch wieder werden
SeparateFields() Wir brauchen nicht die ganzen Frames, sondern nur ein Field
SelectOdd() Wir brauchen das TopField, also alle mit ungerader Nummer.
Das Zweifache SelectOdd() sieht doppelt gemoppelt aus, ist aber notwendig, um zwei Dinge Sicherzustellen:
a) den Zeitversatz zwischen den späteren Halbbildern, dafür das 1. SelectXY()
b) das richtige Field (Top oder Bottom) auszusuchen, denn der Bobber fügt, einfach ausgedrückt, bei den TF unter jeder Zeile, bei den BF über jeder vorhandenen Zeile eine weitere ein, weswegen ein interlaced Clip nach einem einfachen SeparateFields() auch vertikal zu zittern scheint.
zu (3) Wenn man die Prozedur bis (2) abgeschlossen hat, erhält man zwei Clips (Top, Bottom), die zeitlich gesehen um 20 ms versetzt sind, was dem Zeitversatz der beiden Fields eines interlaced Frames entspricht.
Mit Interleave() werden die beiden frameweise verwoben und mit AssumeFieldBased().Weave() wieder ein interlaced Clip erstellt.
Damit solltest Du dann wieder einen echten interlaced Clip erhalten.
__________________ "Der größte Trick, den der Teufel je gebracht hat, war die Menschheit glauben zu lassen, es gäbe ihn gar nicht."
Roger "Verbal" Kint, Die üblichen Verdächtigen
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von EthanoliX: 06.08.2004 00:01.
|
|
03.08.2004 18:37 |
|
|
empty
Super Moderator
Dabei seit: 14.04.2002
Beiträge: 1.879
|
|
@Herbie warum deshakest du nicht einfach die Halbbilder?
Viele Grüße bb empty
__________________ The brain needs oxygen,
so why wear a tie?
|
|
05.08.2004 18:01 |
|
|
EthanoliX
Kaiser
Dabei seit: 11.04.2002
Beiträge: 1.310
Herkunft: Mainz
|
|
Das könnte er schon machen, aber dafür müßte er trotzdem das ganze in einen top und einen bottom Clip splitten, da der Deshaker das alternieren von top und bottom Field sonst als Zittern wahrnehmen und zu entfernen versuchen würde.
edit: Hab' das Skript noch mal verändert, klappte noch nicht so, wie es sollte, waren noch ein paar Fehler in der Syntax.
Hier die korrigierte Version:
Source = SegmentedDirectShowSource("g:\_temp\test000.avi").killaudio().AssumeTFF().C
rop(0,72,-0,-72).ConvertToYUY2()
Clip = Bob(Source, 1/3, 1/3)
\.Cnr2()
\.undot()
\.peachsmoother(NoiseReduction=30,Stability=20)
\.GuavaComb(Mode="PAL",Recall=75,MaxVariation=25,Activation=30)
\.Convolution3d(preset="movieLQ")
Top = SelectOdd(clip).separateFields().SelectOdd()
Bottom =SelectEven(Clip).SeparateFields().SelectEven()
Fertig=Interleave(Top,Bottom).Weave()
#return Fertig
So, bis hier ist es einfach nur das korrigierte Skript von oben. Was mir aufgefallen ist ist, daß die interlaced Struktur beibehalten wird, sondern das Filtern zur Rauschunterdrückung und Retusche von Artefakten hat weniger starkke Nebenwirkungen und arbeitet effektiver. Soweit ich bei einem kurzen Test beurteilen konnte auch bei nicht interlaced Material.
Der Rechenaufwand hält sich auch noch in Grenzen mit o.g. Filtern erreiche ich auf meinem Athlon XP 2400+ bei 704*576 ca. 8 fps, was noch akzeptabel ist.
Und das Dollste ist, falls man sehr stark verrauschtes Material hat, kann man die prozedur mittels folgendem Zusatz noch einmal wiederholen, ohne daß das Bildzu sehr leidet. und dennoch der subjektive Eindruck besser ist.
Clip2 = Bob(Fertig, 1/3, 1/3)
\.Cnr2()
\.undot()
\.peachsmoother(NoiseReduction=30,Stability=20)
\.GuavaComb(Mode="PAL",Recall=75,MaxVariation=25,Activation=30)
\.Convolution3d(preset="movieLQ")
Top2 = SelectOdd(clip2).separateFields().SelectOdd()
Bottom2 =SelectEven(Clip2).SeparateFields().SelectEven()
Fertig2=Interleave(Top2,Bottom2).Weave()
return Fertig2
__________________ "Der größte Trick, den der Teufel je gebracht hat, war die Menschheit glauben zu lassen, es gäbe ihn gar nicht."
Roger "Verbal" Kint, Die üblichen Verdächtigen
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von EthanoliX: 05.08.2004 23:58.
|
|
05.08.2004 18:07 |
|
|
Videostation
Super Moderator
Dabei seit: 16.03.2002
Beiträge: 1.533
Herkunft: Dresdner Raum
|
|
Das Skript funktioniert einwandfrei. Beim Testen ohne Zwischenfilterung ist mir aufgefallen, dass die Rekonstruktion des Bildes, d.h. Wiederherstellung der Interlacedstruktur, besser gelingt, wenn bei Bob für die Werte des BicubicResize b=0 und c=0.5 gewählt wird. Vergleicht man dann das Original mit dem "ReInterlaced" Bild sind kaum Unterschiede feststellbar, während mit den Standardparametern b=1/3 und c=1/3 noch sichtbare Abweichungen bei den Bildkonturen zu erkennen sind. Die Unterschiede hab ich natürlich nicht durch hin- und herschalten erkannt, sondern mittels Subtract(Original,ReInterlaced) deutlich gemacht.
Bei einer Zwischenfilterung ist das aber ziemlich egal, weil die Bildinfos eh verändert werden.
CU Videostation
__________________ WWW.VIDEOSTATION-ONLINE.DE
|
|
06.08.2004 19:49 |
|
|
EthanoliX
Kaiser
Dabei seit: 11.04.2002
Beiträge: 1.310
Herkunft: Mainz
|
|
Was ich gerne noch mal testen würde ist iBob(), was im Unterschied zu Bob() einen bilinearen Upsizer verwendet. Nur leider stürzt VDiub immer ab, sobald die .DLL im Plugin-Verzeichnis liegt.
__________________ "Der größte Trick, den der Teufel je gebracht hat, war die Menschheit glauben zu lassen, es gäbe ihn gar nicht."
Roger "Verbal" Kint, Die üblichen Verdächtigen
|
|
06.08.2004 19:56 |
|
|
Videostation
Super Moderator
Dabei seit: 16.03.2002
Beiträge: 1.533
Herkunft: Dresdner Raum
|
|
|
06.08.2004 20:08 |
|
|
empty
Super Moderator
Dabei seit: 14.04.2002
Beiträge: 1.879
|
|
Schade, dass ich zur Zeit wenig Zeit zum Testen habe. Verstehe zum Beispiel nicht wozu ihr bobbt. IMHO sollte es doch reichen die Halbbilder zu separieren, in Top und Bottom-Fields zu unterscheiden, beide Clips filtern und anschließend per Interleave wieder zusammenfügen. Falls ich da jetzt nicht einen kompletten Denkfehler drin habe, sparst du dir damit auch das doppelte SelectOdd().
Edit: Sowas in der Form
Source().SeparateFields()
Bottom=SelectEven().Filter()
Top=SelectOdd().Filter()
Interleave(Bottom,Top)
Weave()
sollte funktionieren.
Viele Grüße bb empty
__________________ The brain needs oxygen,
so why wear a tie?
|
|
06.08.2004 23:14 |
|
|
EthanoliX
Kaiser
Dabei seit: 11.04.2002
Beiträge: 1.310
Herkunft: Mainz
|
|
Das klappt zwar auch, und für Filter, die ausschließlich räumliche Informationen auswerten, ist dies wahrscheinlich, allein schon der höheren Geschwindigkeit halber, die Methode der Wahl.
Aber falls es sich um Filter handelt, die auch zeitliche Effekte bearbeiten wie z.B. der Deflicker, könnte es im Schlimmsten Fall z.B. so sein, daß die TF alle gleichmäßig heller als der "Durchschnitt" und die BF dunkler sind.
Und falls man nur die Felder trennt und separat filtert, würde das in dem Fall bedeuten, daß der Deflicker sowohl bei den TF als auch bei den BF nichts zu korrigieren findet, da die Unterschiede, auf die er anspringt, nur zwischen den benachbarten TF und BF besteht.
Im Endeffekt läuft es darauf hinaus, daß man so nicht die volle zeitliche Auflösung berücksichtigen kann.
edit:
Hab' das Skript mal mit 'ner analogen Aufnahme getestet, und obwohl die Quelle progressiv war, muß ich sagen, daß o.g. Vorgehensweise, auch wenn sie auf den ersten Blick total überflüssig erscheint, auch bei Progressivmaterial Vorteile hat:
Zum einen scheint die Rauschunterdrückung effektiver zu sein, besonders in bewegten und detailreichen Bildausschnitten. Und zum anderen scheinen scharfe Kanten, die sich in Schneller Bewegung befinden, nicht mehr so stark auszufransen, sondern behalten recht gut ihre Kontur.
edit2:
Hab das Skript mal auf Gleitz/Doom9 gepostet.
S. hier
Das eigentliche ReInterlacing kann einfacher bewerkstelligt werden:
statt zwei Clips einfach:
SeparateFields()
SelectEvery(4,0,3) oder SelectEvery(4,1,2)
Weave()
auf den Gebobbten Clip anwenden
__________________ "Der größte Trick, den der Teufel je gebracht hat, war die Menschheit glauben zu lassen, es gäbe ihn gar nicht."
Roger "Verbal" Kint, Die üblichen Verdächtigen
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von EthanoliX: 19.08.2004 12:17.
|
|
07.08.2004 00:36 |
|
|
|