Video-Rauschfilter "UFMaskDenoise"

Es gibt diverse Rauschfilter für Videomaterial. Sie arbeiten oft nach unterschiedlichem Prinzip, unterschiedlich gut, haben unterschiedliche Vor- und Nachteile. Durch das skriptbasierte Video-Bearbeitungsprogramm AviSynth lassen sich vorhandene Filter zu neuen zusammensetzen. Nach dem Test verschiedener Rauschfilter habe ich so "meinen" optimalen Filter zusammengebaut, den ich hier vorstellen möchte.


Rauschen ist doch toll?

Ähnlich wie bei digitalen Fotos oft ein Rauschen sichtbar wird, gibt es dies auch bei Filmen (insbesondere HD-Material), da auch hier die Kameras an ihre Grenzen kommen. Das kann man oft bei dunklen Szenen in einem Film sehen. Zusätzlich wird scheinbar auch Rauschen bewußt hinzugemischt, da das Bild dann "wärmer" wirkt. Dies wird auch bei Animationsfilmen gemacht, damit das Bild nicht so künstlich wirkt. Festhalten muss man: Einige finden Rauschen toll!

Wie auch immer, ich sehe das Codieren von Rauschen nicht als sinnvoll an. Durch Anwenden eines guten Rauschfilters kann man die Datenmenge bei Einsatz eines qualitätsbasierten Video-Encoders (ich verwende x264) um 20-40% senken. Oder anders herum gedacht, wenn man von einer festen Datenmenge ausgeht, wäre ein besseres Codieren der tatsächlichen Details im Film sinnvoller als das Konservieren von Rauschen.

Wer ein analoges Rauschen im Bild generell toll findet, kann ja einen Filter zum Hinzufügen von Rauschen bei der Wiedergabe verwenden, wie es z.B. bei ffdshow angeboten wird.


Ziele

Die Ziele des Filters sind somit:


Die Lösung

Beim Test hat sich der FFT3DFilter als sehr gut herausgestellt. Er filtert durch Einsatz von Fast-Fourier-Transformationen hochfrequente Anteile (= Rauschen) aus dem Bild. Ein deutlicher Nachteil dieses Filters war allerdings, dass er auch eine etwas geringere Schärfe bei echten Details im Bild erzeugt. Daher führe ich vor Anwendung des Filters eine Kantenerkennung durch, so dass der Filter nur auf nicht als Kanten erkannte Bereiche (d.h. mehr oder weniger nur auf "einfarbige" Flächen) angewendet wird.

Ziel der Kantenerkennung war, dass im Zweifel lieber das Bild unverändert bleibt, wo eine Kante / Detail vorhanden ist. Es soll also lieber etwas zuviel als Kante erkannt werden. Dies wird dadurch erreicht, dass sowohl in der Zeit (vorheriges und nachfolgendes Bild) als auch in der Fläche (im aktuellen Bild) ein zusätzlicher Bereich als Kante erkannt wird. Die Kantenerkennung wird mit den masktools durchgeführt. RemoveGrain wird zum entfernen einzeln erkannter Detailpixel verwendet. Alle verwendeten Filter sind auf der AVISynth Homepage gelistet.

Folgendes AviSynth-Skript erledigt meine Aufgabe:

# DirectShowSource("...")
LoadPlugin("mt_masktools-25.dll")
LoadPlugin("RemoveGrainSSE3.dll")
LoadPlugin("FFT3DFilter.dll")

Function UFMaskDenoise(clip SRC)
{
  MASK2 = SRC.mt_edge(thY1=7, thY2=10, thC1=7, thC2=10).RemoveGrain()
  FRAMES = MASK2.Framecount()
  MASK1 = MASK2.Trim(0, -1) + MASK2.Trim(0, FRAMES - 2)
  MASK3 = MASK2.Trim(1, 0) + MASK2.Trim(FRAMES - 1, FRAMES - 1)
  MASK = mt_logic(mt_logic(MASK1, MASK3, mode = "and"), MASK2, mode = "or").mt_expand()
  DENOISED = SRC.FFT3DFilter(sigma=3)
  return mt_merge(DENOISED, SRC, MASK)
}

UFMaskDenoise()
AVISynth-Skript mit Filter UFMaskDenoise

In der Funktion UFMaskDenoise wird das Entrauschen durchgeführt. Zuerst wird eine Maske MASK2 erzeugt, die die direkt erkannten Kanten enthält. Dabei werden mit RemoveGrain einzelne Pixel wiederum ausgeschlossen, so dass nur zusammenhängende Kanten übrig bleiben.

Von dieser Maske werden danach zwei weitere Videos (Masken) MASK1 und MASK3 erzeugt, die einen zeitlichen Versatz von einem Bild vor bzw. zurück haben.

Die endgültige Maske MASK ergibt sich dann aus dem Zusammenführen der drei Masken. Ein Pixel gilt als Kantenpixel, wenn er entweder im aktuellen Bild, oder im vorigen UND dem nachfolgenden erkannt wurde. Durch diesen Ansatz wird zeitlich der Erkennungsbereich der Kante vergrößert. Mit mt_expand wird danach noch der Erkennungsbereich in der Fläche um 1 Pixel vergrößert.

Dann wird mit FFT3DFilter das eigentliche Entrauschen durchgeführt und durch Anwenden der vorbereiteten Maske das entrauschte Bild und das Originalbild zusammengeführt.


Ergebnis

Beispiel 1

Originalbild
entrauschtes Bild
die Maske zeigt an, welche Kanten unverändert bleiben

Beispiel 2

Originalbild
entrauschtes Bild
an der Maske erkennt man, dass nur die Flächen
entrauscht werden und Details großflächig unverändert bleiben