QCleaner - ein ein dezenter Rauschfilter für Avisynth,
der Pixelbewegungen berücksichtigt

Stand: 3. Mai 2004


QCleaner (QCleaner-20 / 25) ist ein Rauschfilter, der Pixelbewegungen abzuschätzen versucht, um zu entscheiden, ob ein Pixel als Rauschen einzuordnen ist.

Er ist (zur Zeit noch) sehr sehr langsam (s.u.), glättet nicht so stark wie die meisten anderen Denoiser (und erhöht daher die Komprimierbarkeit des Films nicht so deutlich), erhält dafür aber einen Großteil des Bildkontrastes.

Brauchbar ist der Filter bisher eher für besseres Video-Material, das man noch etwas aufpeppen und glätten will. Selbst gutes DV-Material kann von dem Filter profitieren.

Einschränkungen:
- Höhe und Breite des Filmes müssen durch 16 Teilbar sein (SSE-Version) !
-------------------------------------------------------------------------------------------------------------
Parameter:

QCleaner(clip, temp_precision, motion_depth, method, spat_precision, spat_depth, threshold)

dabei ist:

temp_precision ist die Genauigkeit, mit der Bewegungen verfolgt werden. Ein Wert von 20 hat sich bei mir als praktikabel erwiesen. Geringere Werte verringern die Wirkung des Filters; größere Werte können zu Artefakten (Bildveränderungen) führen.
(Voreinstellung: 20)

motion_depth beschreibt die Größe des Suchbereichs (Radius in Pixeln) für Bewegungen. Ein Mindestwert von 5 bis 6 erschien mir als wünschenswert, doch hat dieser Parameter direkte Auswirkungen auf die Schnelligkeit des Filters. Jede Verdopplung des Wertes verdoppelt die Filterdauer ! Andererseits kann selbst eine ruhige Bewegung bereits eine Veränderung von 5 Pixeln und mehr pro Field bedeuten, was entsprechend höhere Werte sinnvoll erscheinen läßt.
In der SSE-Version hat der Filter eine automatische Anpassung von motion_depth (pro 16x16-Pixel-Einheit), wobei der angegebene Wert dem um 1 verminderten Maximalwert entspricht. Also bei einem Wert von 5 für motion_depth wird mit maximal 6 gearbeitet. Für sehr ruhige Bilder müßte dies zu einer deutlichen Beschleunigung führen. (Habe ich aber noch nicht gemessen ...)
(Voreinstellung: 5)

method beeinflußt die Arbeitsweise des Filters (hilfreich bei interlaced Material, s.u.):
0 berechnet alle Fields in allen Frames
1 berechnet pro Frame nur 1 Field, und zwar abwechselnd (Top-Field in Frame 0, Bottom Field in Frame 1, usw.)
2 arbeitet wie 1, nur mit umgekehrter Field-Reihenfolge
(Voreinstellung: 0)

spat_precision bestimmt die maximale Abweichung, die ein Nachbarpixel haben darf, um als gleichartig angesehen zu werden. Sinnvolle Werte liegen im Bereich von einem Viertel der Werte für temp_precision. Der spatiale Teil des Filters ist dem temporalen vorgelagert mit der Folge, daß ein spatial korrigiertes Pixel nicht mehr temporal bearbeitet wird. Dies bedeutet eine Beschleunigung. Hohe Werte für spat_precision verkürzen also die Bearbeitungszeit, führen aber auch sehr schnell zu unerwünschten Bildveränderungen.
(Voreinstellung: 3)

spat_depth bestimmt den maximalen Abstand eines Nachbarpixels, das in den Suchbereich einbezogen wird. Kann etwa gleich groß wie motion_depth gewählt werden.
(Voreinstellung: 5)

threshold die maximale Veränderung eines Pixels gegenüber seinem Ursprungswert. Kann auf 255 (max.) gesetzt werden, da der Filter sehr sorgfältig arbeitet. Bei auftauchenden Artefakten kann dieser Parameter dennoch nützlich sein (auch wenn temporal_precision die sauberere Lösung ist).
(Voreinstellung: 255)
-------------------------------------------------------------------------------------------------------------
Für interlaced Material (z.B. Pal) empfehle ich folgende Filterkombination:

     Bob().QCleaner(20,5,1).SeparateFields().SelectEvery(4,0,3)

Wenn nur ein grünes Bild erscheint, muß entweder Methode 2 gewählt ( QCleaner(20,5,2) ) oder es müssen die anderen Frames genommen werden ( SelectEvery(4,1,2). Ausprobpieren, wie man die korrekte Field-Reihenfolge erhält.

Das Skript läuft bei mir bei einem 720x576 Pixel-Film mit 0,8 Bildern pro Sekunde; ohne SSE sind es 0,4 Bilder pro Sekunde; Methode 0 liefert qualitativ das gleiche Ergebnis, läuft aber nur halb so schnell. Mein Rechner ist ein AMD XP 2400.

Auch eine Kaskadierung mehrerer Filter-Instanzen ist möglich (und auch sehr sinnvoll), doch sollte man in diesem Fall für die erste Instanz Methode 0 wählen; es ergibt sich dabei eine Erhöhung der Komprimierbarkeit, allerdings auch eine deutliche Verlangsamung (insgesamt eine Verdreifachung!). Für Perfektionisten empfiehlt es sich, mit vorsichtigen Werten und 2 Instanzen zu arbeiten (temp_precision um 10 - 15, spat_precision um 2 - 3).

     Bob().QCleaner(20,5,0).QCleaner(20,5,1).SeparateFields().SelectEvery(4,0,3)

eMail: georg@gero-net.de