Nachbearbeitung mit AviSynth

Der Einsatz von AviSynth hat gegenüber VirtualDub mehrere Vorteile:

Wir benutzen VirtualDubMod anstelle von VirtualDub, denn

  1. VirtualDubMod kann YV12 verarbeiten (notwendig für AviSynth 2.5)
  2. VirtualDubMod hat einen Script-Editor
  3. VirtualDubMod kann die Trim-Befehle zum Schneiden des Videos selbstständig erzeugen
Mehr Information über AviSynth und Filter gibt's hier.

Werbung herausschneiden mit VirtualDubMod:
Das Herausschneiden der Werbung mit VirtualDubMod verläuft so, wie im Kapitel Werbung entfernen beschrieben. Zuvor müssen wir aber ein Grund-AviSynth-Script erstellen, mit dem VirtualDubMod arbeiten kann.
Dazu erstellen wir mit einem beliebigen Texteditor eine Datei mit dem Inhalt

AviSource("d:\capture.avi")

oder bei einer segmentierten Aufnahmedatei:

SegmentedAVISource("d:\capture.avi")

bei der die Dateinamen d:\capture.00.avi, d:\capture.01.avi usw. bis capture.99.avi lauten.

Diese Datei speichern wir mit der Dateiendung *.avs (also z.B. capture.avs) und öffnen sie anschließend mit VirtualDubMod (File/Open Video File)

Nachdem wir die Werbeblöcke markiert und mit der Del-Taste entfernt haben, öffnen wir den Script-Editor (im Menü Tools oder mit der Tastenkombination Strg-E). Setzt den Cursor unter die AviSource-Zeile und wählt aus dem Edit-Menü "Import Frameset as Trims" (oder durch Drücken von Strg-I). VirtualDubMod fügt nun automatisch die entsprechenden Trim()-Befehle ein. Das sieht dann etwa so aus:

AviSource("c:\lopez-Jenny_from_the_bronx.avi")
Trim(0,3) ++ Trim(8,31) ++ Trim(43,101)

Für den gleichen Zweck gibt es auch ein Programm namens vcf2avs. Es konvertiert die Verarbeitungs-Datei (vcf) in eine AviSynth-Script-Datei (avs), die die Trim()-Befehle enthält. Mehr Informationen gibt's bei AviSynth Q&A oder vcf2avs by Dark$oul71 (Diskussion und download) und vcf2avs von bb (Diskussion und download). Dies sind zwei unterschiedliche Programme, die zur selben Zeit entwickelt wurden und deshalb den selben Namen tragen.

Wenn Ihr die Trim()-Befehle manuell erstellen wollt, denkt daran, dass VirtualDubMod die Framezählung ab 1 beginnt, AviSynth dagegen ab 0. Beispiel: Angenommen Ihr wollt die Frames 1-2000 behalten, dann lautet das Script:

AviSource("d:\capture.avi")
Trim(0, 1999)

Wenn Ihr etwas aus der Mitte herausschneiden wollt (z.B. die Frames 100-200):

clip=AviSource("d:\capture.avi")
Trim(clip, 0, 99)+Trim(clip, 201, 1999)

bzw. bei segmentierter Aufnahmedatei:

SegmentedAVISource("d:\capture.avi")
Trim(0, 1999)

Entfernen von Regenbogen-Effekten und Flimmern:
Häufig enthält die Aufnahme Regenbogen-Effekte oder dot crawls. Regenbogen-Effekte entstehen durch unzureichende Trennung von Luma (Helligkeit) und Chroma (Farbe) des Video (-composite) Signals. Dies fällt meistens bei computergenerierten Bildteilen wie Untertiteln, Wetterkarten oder Senderlogos auf. Wo immer Kanten im Luma-Signal (=hohe Frequenzen) auftreten, entstehen Regenbogen-Effekte. Flimmern tritt dagegen bei hohen Unterschieden im Chroma-Signal auf (typischerweise bei Senderlogos). Wie man diese Effekte mit AviSynth beseitigt, steht im Kapitel Entfernen von Regenbogen-Effekten und Flimmern.

Deinterlacing:
Bei der Aufnahme von Fernseh-Sendungen muss man sich ggf. entscheiden, ob ein Deinterlacing durchgeführt werden soll, oder nicht. Folgende Punkte müssen in Betracht gezogen werden:

Wenn Ihr Euch entschieden habt, kein Deinterlacing durchzuführen, solltet Ihr Euch auch das Kapitel "Verarbeitung von Interlaced Video" anschauen. Hier gehen wir jetzt weiter davon aus, dass das Video deinterlaced wird:

Deinterlaced werden sollte vor der Anwendung von smoothe-, cropping- oder resize-Filtern. Zuerst muss ermittelt werden, welche Art von Interlacing-Effekt Euer Quellvideo hat. Da die Methode für jeden Sender oder auch für jede Sendung anders sein kann, bedeutet das, dass Ihr die folgende Prozedur für jede aufgenommene Sendung durchführen müsst:

PAL:
1) Phase shift und/oder vertauschte Felder (swapped fields). Für weitere Informationen seht Euch die Dokumentation zum Decomb-Plugin für AviSynth an.
2) Echtes interlaced Material
3) Schlechte NTSC-->PAL-Konvertierung

Möglicherweise funktioniert der Deinterlacer, den Ihr verwenden wollt, nicht in dem Farbformat, mit dem Euer Video aufgezeichnet wurde. Decomb z.B. erfordert YUY2 oder YV12. In diesem Fall muss das Farbformat der Halbbilder konvertiert werden. Beispiel:

AviSource("d:\capture.avi")  # Annahme: Quelle ist RGB
Trim(begin, end)
SeparateFields()
ConvertToYUY2()
Weave()

Um zu erkennen, welcher Fall vorliegt, trennen wir die Halbbilder, so dass sie getrennt betrachtet werden können:

AviSource("d:\capture.avi")  # Annahme: Quelle ist YUY2
Trim(begin, end)
SeparateFields()

Diese avs-Datei öffnen wir in VirtualDubMod. Mit einem Rechtsklick auf das linke Fenster (Quelle) öffnen wir das Popup-Menü und wählen "2x size", um die Ansicht zu vergrößern. Mit dem Schieberegler wandern wir Bildweise durch das Video. Wenn Ihr keine horizontale Linien in beiden Feldern sehen könnt, liegt Fall 1 vor. Sollten dagegen immer noch horizontale Linen sichtbar sein, liegt Fall 2 vor. Wenn Ihr gemischte Frames seht (Geisterbilder), liegt Fall 3 vor.

1) Im ersten Fall sorgt das folgende Script für die Behandlung der Interlace-Effekte (Decomb-Plugin):

AviSource("d:\capture.avi")
Trim(begin, end)
Telecide()

2) Im zweiten Fall könnt Ihr folgendes Script versuchen (Decomb-Plugin):

AviSource("d:\capture.avi")
Trim(begin, end)
FieldDeinterlace()

oder falls einige Frames echt interlaced sind:

AviSource("d:\capture.avi")
Trim(begin, end)
FieldDeinterlace(full=false)

Alternativ könnt Ihr natürlich auch ähnliche Deinterlacer wie GreedyHMA oder TomsMoComp versuchen. Wenn ihr mit der Qualität nicht zufrieden seid (und AviSynth 2.5x benutzt), versucht einen langsameren "Area based deinterlacer". Beachtet, dass dieser Deinterlacer RGB32 benötigt.

3) In diesem Fall habt Ihr kein Glück. Beschwert Euch beim Sender :-). Wenn überwiegend Mischfelder in einem oder beiden Halbbildern vorliegen, könnt Ihr ein Halbbild entfernen und das andere Halbbild mit folgendem Script "reduzieren":

AviSource("d:\capture.avi")
Trim(begin, end)
SeparateFields()
SelectEven()  # oder SelectOdd() falls Ihr die ungeraden Felder verwenden wollt
HorizontalReduceBy2()

Mit dieser Methode verliert Ihr Informationen, aber das ist immer noch besser, als das Vorhandensein von Mischfeldern. Beachtet, dass Euer Video horizontal und vertikal mit dem Faktor 2 skaliert wird. Wenn Mischfelder in beiden Halbbildern vorliegen, gibt es keinen zufriedenstellenden Weg, solches Material zu behandeln. Ihr habt drei Möglichkeiten:

a) Nicht deinterlacen, siehe "Verarbeitung von interlaced Video".

b) Behandelt Euer Video als vollständig interlaced und benutzt das folgende Script:

AviSource("d:\capture.avi")
Trim(begin, end)
FieldDeinterlace()

c) Benutzt Bob:

Bob()
SelectEven()

oder für bessere Qualität, smart Bob (z.B. aus dem SmoothDeinterlace-Plugin):

 # SmoothBob uses Smoothdeinterlace to bob the video.
 # Parameter Topfirst = 1 (Vorgabe) bentzt das Top-Field als das erste Field
 #                              0 benutzt das Bottom-Field als das erste Field

function SmoothBob(clip clip, int "Topfirst")
{
  t = default(Topfirst, 1)
  top = (t==1) ? true : false
  clip.SmoothDeinterlace(tff=true, doublerate=true)
}

 # SmoothDeinterlace erfordert YUY2:
SeparateFields()
ConvertToYUY2()
Weave()
SmoothBob()
SelectEven()

NTSC:
1) telecined Material (29.97 fps)
2) phase shifts und/oder vertauschte fields (23.976 fps)
3) echt interlaced (29.97 fps)

Möglicherweise funktioniert der Deinterlacer, den Ihr verwenden wollt, nicht in dem Farbformat, mit dem Euer Video aufgezeichnet wurde. Decomb z.B. erfordert YUY2 oder YV12. In diesem Fall muss das Farbformat der Halbbilder konvertiert werden. Beispiel:

AviSource("d:\capture.avi")  # Annahme: Quelle ist RGB
Trim(begin, end)
SeparateFields()
ConvertToYUY2()
Weave()

1) Überprüft zuerst, ob das Video telecined ist. Öffnet das avs-Script in VirtualDubMod:

AviSource("d:\capture.avi")  # Annahme: Quelle ist YUY2
Trim(begin, end)

Wenn Ihr in jeder Gruppe aus 5 Frames drei progressive and zwei interlaced Frames findet, habt Ihr ein telecined Video. In diesem Fall wendet man ein InVerse TeleCine an (IVTC):

AviSource("d:\capture.avi")
Trim(begin, end)
Telecide()
Decimate(cycle=5)

Für die anderen beiden Fälle, ändert Euer avs-Script so, dass Ihr die Halbbilder getrennt betrachten könnt:

AviSource("d:\capture.avi")
Trim(begin, end)
SeparateFields()

und öffnet das Script in VirtualDubMod. Vergrößert wieder das Quellfenster (Rechtsklick, "2x size"). Wandert mit dem Schieberegler langsam durch das Video. Wenn Ihr keine horizontalen Linien in beiden Halbbildern erkennen könnt, liegt Fall 2 vor, sonst Fall 3.

2) Das folgende Script behandelt die Interlacing-Effekte (Decomb-Plugin):

AviSource("d:\capture.avi")
Trim(begin, end)
Telecide()

3) In diesem Fall könnt Ihr das folende Script versuchen (Decomb-Pluging):

AviSource("d:\capture.avi")
Trim(begin, end)
FieldDeinterlace()

oder falls einige Frames echt interlaced sind:

AviSource("d:\capture.avi")
Trim(begin, end)
FieldDeinterlace(full=false)

Alternativ könnt Ihr natürlich auch ähnliche Deinterlacer wie GreedyHMA oder TomsMoComp versuchen. Wenn ihr mit der Qualität nicht zufrieden seid (und AviSynth 2.5x benutzt), versucht einen langsameren "Area based deinterlacer". Beachtet, dass dieser Deinterlacer RGB32 benötigt.

Die obigen Scripte gehen davon aus, dass Euer Video in YUY2 (oder YV12) vorliegt, denn Decomb erfordert YUY2 (oder YV12). Wenn Euer Video in RGB vorliegt, muss eine entsprechende Farbraumkonvertierung eingefügt werden:

AviSource("d:\capture.avi")
Trim(begin, end)
SeparateFields()
ConvertToYUY2()
Weave()
Telecide()

Weiterführende Referenzen:
IVTC tutorial: Mehr über IVTC und Deinterlacing.
Decomb, GreedyHMA und andere Deinterlacer: Hier gibt's Plugins für AviSynth 2.0x und 2.5x.

Korrektur von Farbverschiebungen (Chroma Shifts):
Manchmal hat die Aufnahme von VHS-Quellen Farbverschiebungen ("Ausbluten" der Farben). Dabei sind eine oder mehrere Farben in eine Richtung verschoben. Dies kann mit dem ChromaShift-Plugin behoben werden. Für weitere Infos: Korrektur von Farbverschiebungen (Chroma Shifts)!

Logo entfernen:
Erwartet keine Wunder! Wenn das Logo sehr klein ist, können die Ergebnisse brauchbar sein. Ich persönlich würde keine Logos entfernen, denn es bleibt immer ein sichtbarer Rückstand. Ist auch nichts für Capture-Anfänger. Für weitere Infos: Entfernen von Logos!

Unbrauchbare Zeilen am unteren (und oberen) Ende des Videos entfernen:
Normalerweise sind (etwa) zehn Zeilen am unteren Rand des Videos unbrauchbar, manchmal auch einige Zeilen am oberen Rand. Da dies natürlich nicht schön aussieht sollten wir diese Zeilen entfernen und durch einen schwarzen Balken ersetzen. Beispiel-Script (PAL):

LoadPlugin("c:\LoadPluginEx.dll")
LoadPlugin("c:\AviSynth2\plugins\dustv5.dll")
AviSource("d:\capture.avi")
Trim(begin, end)
Telecide()
LetterBox(0, 16)  # Damit können auch die Bereich rechts und links bearbeitet werden. Crop und AddBorders kann man auch verwenden (etwas langsamer).

Beachte, dass die bei YUY2 und YV12 ein gerade Anzahl Zeilen gecroppt werden müssen.

Entrauschen (Smoothing):
Grundsätzlich gibt es zwei Gründe, ein Video zu entrauschen:

a) Aufnahmen von analoger Quelle enthalten Rauschen (digitale Quellen sind meistens sauber).
b) Das Endergebnis kann besser komprimiert werden. Dies ist besonders wichtig, wenn das Ziel SVCD (oder VCD) ist, denn DivX/Xvid komprimiert besser.

Die größte Schwierigkeit ist das Finden eines guten Kompromisses zwischen Rauschen/Komprimierbarkeit, den Details, die erhalten bleiben sollen und der Codierungszeit. Am besten entrauscht man das Video vor dem Resize mit einem räumlich-zeitlichen oder einem räumlichen und einem zeitlichen Filter.

Auf diese Weise entfernt man mehr Rauschen als wenn man nur einen räumlichen Filter benutzt. Beachtet aber, dass ein zeitlicher Filter mit starker Einstellung die Bilder verwäscht. Benutzt deshalb zeitliche Filter mit nur geringer Einstellung.

Einen Rauschfilter setzt man am Besten vor dem Resizing ein. Wenn das Bild noch in der Originalgröße vorliegt, hat es eine höhere Auflösung und enthält mehr Daten mit denen der Rauschfilter arbeiten kann, daher werden Rauschstörungen besser erkannt. Anschließend wird auf eine kleinere Größe resized, wodurch weitere Rauschstörungen verschwinden. Der Nachteil ist ein erhöhter Zeitaufwand, da der Filter mit mehr Daten arbeiten muss, als wenn man ihn erst nach dem Resizing anwendet.

Wenn man sich die Scripte einiger Forenbenutzer ansiehst, stellt man manchmal fest, dass einige Leute mehrere Rauschfilter einsetzen. Dies ist normalerweise nicht nötig und erhöht nur die Codierzeit. Bedenke, dass bereits ein einziger Rauschfilter die Codierzeit deutlich erhöht.

Welche Rauschfilter sollte man benutzen? Dies ist zum Teil Geschmacksache, hängt vom benötigten Farbformat des Rauschfilter und der Codierzeit ab. Einige Beispiele für räumlich-zeitliche Rauschfilter:

Wenn Du AviSynth 1.0x/2.0x-Plugins für AviSynth 2.5x benutzen willst, findest Du hier eine Beschreibung, wie's gemacht wird. Zu beachten ist, dass diese Plugins YUY2 benötigen. AviSynth 2.5x kann Plugins automatisch laden, deshalb ist es nicht nötig, die Plugins explizit zu laden.

 # LoadPlugin("c:\LoadPluginEx.dll")
 # LoadPlugin("c:\AviSynth2\plugins\dustv5.dll")
 # LoadPlugin("c:\AviSynth2\plugins\peachsmoother.dll")
 # LoadPlugin("c:\AviSynth2\plugins\nomosmooth.dll")

 # AviSynth v1.0x/v2.0x-Plugins:
 # PixieDust(5)  # sehr langsam, aber die Komprimierbarkeit (und Rauschentfernung) ist gut, viele Details bleiben erhalten.
 # PeachSmoother()  # soll einen bug enthalten (erzeugt verwischte Bilder, sichtbar in allen Einstellungen)
 # NoMoSmooth()
 # Convolution3d(preset="vhsBQ")
 # FluxSmooth(7, 7)
 # STMedianFilter(8, 15, 4, 7)

 # AviSynth v2.5x plugins:
 # Convolution3d(preset="vhsBQ")
 # FluxSmooth(7, 7)
 # STMedianFilter(8, 15, 4, 7)
 # deen("c3d", 0, 10, 12, 3)

Hier sind die Standardeinstellungen aufgeführt, die man natürlich verändern kann, wenn man mit dem Ergebnis nicht zufrieden ist. Für kurze Videos gefällt mir der PixieDust gut, das Script sieht dann etwa so aus:

 # AviSynth v2.5x (Video liegt in YUY2 vor):
LoadPlugin("c:\!LoadPluginEx.dll")  # be carefull not to put this plugin in your plugin dir.
LoadPlugin("c:\!AviSynth2\plugins\dustv5.dll")
AviSource("d:\capture.avi")
Trim(begin, end)
Telecide()
LetterBox(0, 16)
PixieDust(5)

 # AviSynth v2.0x (Video liegt in YUY2 vor):
LoadPlugin("c:\AviSynth2\plugins\dustv5.dll")
AviSource("d:\capture.avi")
Trim(begin, end)
Telecide()
LetterBox(0, 16)
PixieDust(5)

Für längere Videos kann man z.B. Convolution3d verwenden.

Wenn Ihr einen räumlichen und einen separaten zeitlichen Rauschfilter verwenden wollt, sind z.B. der "Chroma Noise Reducer (CNR2)" und der TemporalCleaner geeignet. Beispielscript:

 # AviSynth v2.5x (Video liegt in YUY2 vor):
LoadPlugin("c:\LoadPluginEx.dll")  # be carefull not to put this plugin in your plugin dir.
AviSource("d:\capture.avi")
Trim(begin, end)
Telecide()
LetterBox(0, 16)
ConvertToYV12()  # TemporalCleaner benötigt YV12
Cnr2()
TemporalCleaner()

Weiterführende Referenzen:
Rauschfilter: Plugins für AviSynth v2.0x und v2.5x.

Resizen:
Nach dem Deinterlacen, dem Entfernen unbrauchbarer Zeilen und dem Entrauschen muss ein Video noch resized werden. Die korrekte Zielgröße für Euer Video hängt von Eurem Zielmedium (Xvid oder SVCD) ab. Die korrekten Größen sind:

Resizen für PAL:
704x576 mit einem PAR von 128/117 und 2 Pixeln Overscan
720x576 mit einem PAR von 128/117 und 18 Pixeln Overscan
720x576 ohne Overscan -> nicht ITU-konform -> Generisches PAR von 48/45
768x576 mit einem PAR von 1/1 ohne Overscan

Dies impliziert die folgenden beiden Situationen:
[1]: Aufnahme mit 704x576, 768x576 oder 720x576 ohne Overscan.
[2]: Aufnahme mit 720x576 mit 18 Pixeln Overscan (nicht ITU-konform).

 # PAL [1], XviD:
BicubicResize(640, 480)  # or scalings of this size

 # PAL [2], XviD:
Crop(8, 0, 704, 576)
BicubicResize(640, 480)  # or scalings of this size

 # PAL [1], SVCD
BicubicResize(480, 576)

 # PAL [2], SVCD
Crop(8, 0, 704, 570)
BicubicResize(448, 544)
AddBorders(16, 16, 16, 16)  # adds overscan to your SVCD

Resizen für NTSC:
704x480 mit einem PAR of 72/79 und 2 Pixeln Overscan
704x480 ohne Overscan -> nicht ITU-konform -> Generisches PAR von 81/88
720x480 mit einem PAR von 72/79 und 9 Pixeln Overscan
720x480 ohne Overscan -> nicht ITU-konform -> Generisches PAR von 9/10
640x480 mit einem PAR von 1/1

Dies impliziert die folgenden drei Situationen:
[1]: Aufnahme mit 704x480, 640x480 oder 720x480 (alle drei ITU-konform).
[2]: Aufnahme mit 720x480 mit Overscan (nicht ITU-konform).
[3]: Aufnahme mit 704x480 (nicht ITU-konform).

 # NTSC [1], XviD:
BicubicResize(640, 480)  # or scalings of this size

 # NTSC [2], XviD:
Crop(8, 0, 712, 480)
AddBorders(0, 6, 0, 0)
BicubicResize(640, 480)  # or scalings of this size

 # NTSC [3], XviD:
AddBorders(0, 6, 0, 0)
BicubicResize(640, 480)  # or scalings of this size

 # NTSC [1], SVCD
BicubicResize(480, 480)

 # NTSC [2], SVCD
Crop(8, 0, 712, 480)
BicubicResize(448, 448)
AddBorders(16, 16, 16, 16)  # Fügt Overscan zur SVCD hinzu

 # NTSC [3], SVCD
AddBorders(0, 6, 0, 0)
BicubicResize(448, 448)
AddBorders(16, 16, 16, 16)  # Fügt Overscan zur SVCD hinzu
 

Beispiel-Scripte (PAL [1] und Ziel XviD):

LoadPlugin("c:\LoadPluginEx.dll")
LoadPlugin("c:\AviSynth2\plugins\dustv5.dll")
AviSource("d:\capture.avi")
Trim(begin, end)
Telecide()
LetterBox(0, 16)
PixieDust(5)
BicubicResize(640, 480)

Weiterführende Referenzen:
Square and non-square pixels: Über quadratische und nicht-quadratische Pixel.
Resolutions, Aspect Ratios And The ITU-R BT.601 Standard: Allgemeinere Einführung über Auflösungen, Aspect Ratios und den ITZ-R BT.601 Standard.
FitCD: Sehr nützliches Utility zum Ausrechnen der Resize/Crop-Parameter verschiedener Quellen und Ziele.
Der Karl's Apect Ratio for Dummies: Der Name sagt bereits alles (nur für PAL)
A Quick Guide to Digital Video Resolution and Aspect Ratio Conversions: Wie der Name schon sagt.

Farb-Korrekturen (mit AviSynth v2.5):
Wenn Ihr Euch Eure Aufnahme betrachtet, fällt Euch vielleicht auf, dass die Farben etwas verzerrt sind. Leuchtende Farben leuchten stärker, dunkle Farben sind noch dunkler. Normalerweise reichen die YUV-Werte nicht von 0-255 (PC-Wertebereich), sondern sind begrenzt (TV-Wertebereich). Dieser begrenzte Bereich umfasst die Werte von 16-236 für den Luma-Anteil und die Werte von 16-240 für den Chroma-Anteil des YUV-Signals. Das Problem entsteht dadurch, dass die meisten Capture-Geräte eine Skalierung in den Bereich 0-255 vornehmen und diese Skalierung muss wieder in den Bereich 16-240 zurückskaliert werden. Scrollt durch das Video und achtet darauf, ob die Farben tatsächlich verzerrt sind. Wenn ja, kann dies durch den internen ColorYUV-Filter korrigiert werden (für AviSynth 2.08 ist ein ColorYUV-Plugin verfügbar):

ColorYUV(levels="PC->TV")

Scrollt nach Anwendung dieses Filter wieder durch das Video, um zu überprüfen, ob die Verzerrungen korrigiert wurden. Wenn nicht, entfernt die Zeile aus dem Script und führt die Korrektur manuell aus. Ihr müsst die Einstellungen nur einmal finden. Für die nächste Aufnahme könnt Ihr die selben Werte verwenden, vorausgesetzt, Ihr verändert Eure Aufnahme-Einstellungen nicht. Ich weiss nicht, wie man die Einstellungen in AviSynth 2.08 ermittelt, da die Histogramm-Funktion nur in AviSynth 2.5 exisitert.

Wir benutzen das Histogramm, um Helligkeit und Kontrast zu korrigieren. Da das Histogramm YV12 benötigt, fügen wir folgende Zeilen zu unserem Script hinzu:

ColorYUV(off_y=0, gain_y=0)
ConvertToYV12()
Histogram()

Öffnet dieses Script in VirtualDubMod. Vergrößert das Video-Fenster ggf. auf Normalgröße (Rechtsklick --> "normal size"). Ihr seht das Video mit einem Histogramm. Auf der horizontalen Achse ist die Luminanz abgetragen. Bei genauer Betrachtung werdet Ihr sehen, dass der (ungültige) Bereich 0-15 braun dargestellt ist, der (gültige) Bereich 16-236 schwarz und der (ungültige) Bereich 237-255 wieder braun. Die Histogrammdarstellung selbst kann weiss (wenn es im gültigen Bereich 16-236 liegt) oder gelb (im ungültigen Bereich) sein. Die braunen Bereiche sind zur Verdeutlichung übertrieben dargestellt.

Schaut nach einem schwarzen Bildausschnitt (z.B. schwarze Balken). Wenn das Histogramm für diesen Bereich gelb ist, müssen wir die Luminanz (d.h. die Helligkeit) erhöhen, bis das Histogramm weiss wird. Wenn das Histogramm bereits weiss ist, müssen wir die Helligkeit soweit verringern, dass das Histogramm gerade noch nicht gelb wird. Öffnet den Script-Editor (Strg-E oder über das Menü "Tools"), korrigiert den Wert für off_y und drückt F5 für die Vorschau. Hier ein Beispiel-Script:

ColorYUV(off_y=-20, gain_y=0)
ConvertToYV12()
Histogram()

Schaut nach einem sehr hellen Bildausschnitt. Erhöht bzw. verringert den Wert für gain_y, um die Luminanz soweit wie möglich zu strecken, ohne in die braunen Bereiche zu kommen. Beispiel:

ColorYUV(off_y=-20, gain_y=64)
ConvertToYV12()
Histogram()

Dabei verschiebt sich auch der linke Grenzwert, der bei etwa 16 lag und nicht bei 0 und das Ändern von gain_y mulitpliziert den Wert. Dieser Wert muss also erneut korrigiert werden. Beispiel:

ColorYUV(off_y=-28, gain_y=64)
ConvertToYV12()
Histogram()

Wiederholt dies, bis das Ergebnis zufriedenstellend ist. Wenn dies erledigt ist, muss die Chrominanz eingestellt werden (d.h. die Sättigung). Die Parameter cont_u und cont_v beeinflussen die Sättigung folgendermaßen:

cont_u = cont_v = - (1 - saturation) * 256

Beispiel: saturation = 0.8 bedeutet cont_u = cont_v = -0.2 * 256 = -51.2. Sucht ein Bild mit sehr roten oder blauen Bereichen (z.B. Kleidung), oder schaut Euch die Haut von Menschen an und verändert die Sättigung. Beispielscript:

saturation = 0.8
cu = - (1-saturation)*256
ColorYUV(off_y=-28, gain_y=64, cont_u=cu, cont_v = cu)

Um sicherzustellen, dass Luminanz und Chrominanz in einem gültigen Bereich liegen, setzt opt="coring" als Parameter in ColorYUV. Entfernt das Histogramm wieder, da wir es nicht länger brauchen:

saturation = 0.8
cu = - (1-saturation)*256
ColorYUV(off_y=-28, gain_y=64, cont_u=cu, cont_v = cu, opt="coring")

Ein- und ausblenden:
Es ist zwar nicht notwendig, das Video weich ein- und auszublenden, sieht aber doch besser aus. Um das zu erreichen, könnt Ihr den FadeIO2-Filter benutzen. Beispielscript:

LoadPlugin("c:\LoadPluginEx.dll")
LoadPlugin("c:\AviSynth2\plugins\dustv5.dll")
AviSource("d:\capture.avi")
Trim(begin, end)
Telecide()
LetterBox(0, 16)
PixieDust(5)
BicubicResize(640, 480)
ColorYUV(levels="PC->TV")
FadeIO2(13)

4.2.1 Verarbeitung von interlaced Video
Wenn Ihr interlaced Videos verarbeiten wollt (d.h. das Video interlaced belassen), müsst Ihr folgende Punkte beachten: Wenn Ihr einen räumlichen Rauschfilter einsetzt, reicht folgendes Script:

SeparateFields()
Filter(...)
Weave()

aber wenn Ihr einen räumlich-zeitlichen Rauschfilter (oder nur einen zeitlichen Rauschfilter) einsetzt, erhaltet Ihr falsche Ergebnisse. Der Grund ist, dass das zeitliche entrauschen über zwei Halbbilder des selben Bildes angewendet wird (betroffen sind also die Hälfte aller Frames). Um dies zu vermeiden, solltet Ihr die Halbbilder getrennt verarbeiten:

SeparateFields()
even = SelectEven(last).Filter(...)
odd = SelectOdd(last).Filter(...)
Interleave(even, odd)
Weave()

Das obige Script für einen räumlichen Rauschfilter:

LoadPlugin("c:\LoadPluginEx.dll")
LoadPlugin("c:\AviSynth2\plugins\dustv5.dll")
AviSource("d:\capture.avi")
Trim(begin, end)
SeparateFields()
LetterBox(0, 16)
SpaceDust(5)  # räumlicher Rauschfilter
BicubicResize(640, 240)  # Beachtet, dass die Höhe durch 2 geteilt wird, da wir die Halbbilder resizen, nicht die Frames
ColorYUV(levels="PC->TV")
FadeIO2(13)
Weave()

und für einen räumlich-zeitlichen Rauschfilter:

LoadPlugin("c:\LoadPluginEx.dll")
LoadPlugin("c:\AviSynth2\plugins\dustv5.dll")
AviSource("d:\capture.avi")
Trim(begin, end)
SeparateFields()
LetterBox(0, 16)
even = SelectEven(last).Convolution3d(0, 10, 17, 10, 13, 2.8, 0) # Räumlich-zeitlicher Rauschfilter
odd = SelectOdd(last).Convolution3d(0, 10, 17, 10, 13, 2.8, 0) # Räumlich-zeitlicher Rauschfilter
Interleave(even, odd)
BicubicResize(640, 240)  #Beachtet, dass die Höhe durch 2 geteilt wird, da wir die Halbbilder resizen, nicht die Frames
weave()
ColorYUV(levels="PC->TV")
FadeIO2(13)
Weave()

4.2.2 Verwendung mehrerer Aufnahmen zur Rauschreduktion
Das Rauschen in der Aufnahme entsteht hauptsächlich durch die analoge Signalübertragung über das Kabel. Das bedeutet, das Rauschen ist zufällig verteilt, verglichen mit einer anderen Ausstrahlung des selben Videos. Mit AviSynth ist es möglich, mehrere verschiedene Aufnahmen (des selben Videos) zu mitteln, indem man den Layer-Filter anwendet. Der Grundgedanke ist, das Video zunächst zu deinterlacen, die Videos dann mittels Layer zu mitteln und zum Schluss einen leichten Rauschfilter einzusetzen. Zunächst muss ermittelt werden, ob Frames, die in der ersten Quelle vorhanden sind, in der zweiten Quelle fehlen und umgekehrt. Indem Ihr beide Aufnahmen gleichzeitig öffnet, das erste gemeinsame Frame findet und dann durch die Aufnahmen springt (z.B. jeweils 1000 Frames), könnt Ihr solche fehlenden Frames auffinden. Beispielscript:

clip1 = AviSource("f:\atomic_kitten-the_tide_is_high.avi").Trim(248,5389).Telecide()
clip2 = AviSource("f:\atomic_kitten-the_tide_is_high2.avi").Trim(129,5271).DeleteFrame(501).Telecide()
Layer(clip1, clip2, "fast")
LetterBox(0, 16)
ConvertToYV12()  # falls nötig, Convolution3d erfordert YV12
Convolution3d(preset="movieLQ")
BicubicResize(640, 480)
saturation = 0.8
cu = - (1-saturation)*256
ColorYUV(off_y=-28, gain_y=64, cont_u=cu, cont_v = cu, opt="coring")
FadeIO2(13)

Weiterführende Referenzen:
Averaging two analog captures for noise reduction: Ein langer Thread im Doom9-Formum über das Mitteln von analogen Aufnahmen zur Rauschreduktion.


Zurück zum Anfang: <HOME>


Last edited on: 03/06/2003 | First release: 10/22/2002 | Author:Wilbert | Translated by zisoft | Content by Doom9.de | Partner Gleitz.de