Restruct -

zugleich Denoiser und Sharpener


Restruct (Ver. 0.6) / (Ver. 0.7) ist ein Filter, der versucht, Strukturen im Bild ausfindig zu machen und 'falsche' Pixel entsprechend zu ersetzen. Bei großen Werten für die Parameter geht der Filter dabei nicht zimperlich mit dem Bild um, läßt Pixel verschwinden und zeichnet andere einfach hinzu. Im Extremfall bekommt das Bild den Touch einer Animation.

Sind die Parameter richtig ausbalanciert, wird Pixelrauschen (Mosquito-Noise) deutlich vermindert und das Bild bekommt einen verbesserten Schärfeeindruck.

Die jetzige Version arbeitet ohne jede Assembler- und SSE-Optimierung. Einige Verbesserungen sind da sicher noch möglich - und ich hoffe, mir fallen nicht noch Dinge ein, die den Filter langsamer machen ...


Für interlaced Material (also z.B. PAL) empfehle ich folgendes Vorgehen:

A=AviSource("meinfilm.avi").ConvertToYUY2()

A.Bob(0,6).Restruct().SeparateFields().SelectEvery(4,0,3).Weave()


Auf meinem AMD 2400 erreiche ich damit eine 'Geschwindigkeit' von (schrecklich langsamen) 4 Bildern pro Sekunde.

Es ist auch möglich, auf Bob() zu verzichten, wobei man sich aber leichter Artefakte einhandelt, allerdings auch besser entrauschen kann; und natürlich ist es dann auch deutlich schneller.

A.SeparateFields().Restruct(0,7).Weave()


Zur Veranschaulichung der Arbeitsweise des Filters habe ich einen kleinen Testfilm erstellt (testfilm.avi).


Die entsprechende avs-Datei könnte dann etwa so aussehen:

V0=AviSource("testfilm.avi")
V1=V0.ConvertToYUY2().Restruct(0,15,24)
Interleave(V0,V1).PointResize(512,512)


Parameter:

Restruct(clip,tolerance,surr_var,intensity,threshold)



tolerance beeinflußt den Glätteeindruck des Bildes. Für maximale Rauschbeseitigung sollte er auf 0 gesetzt werden.

Vorgabewert: 0


surr_var betrifft die Genauigkeit der Bildanalyse; kleine Werte (unter 15) führen zu geringeren Bildveränderungen, aber auch zu größerem Restrauschen. Arbeitet man mit Halbbildern (also nach SeparateFields(), sollte der Wert auf ca. 7 gesetzt werden.

Vorgabewert: 15


intensity beeinflußt den Suchaufwand und damit auch die Verarbeitungsgeschwindigkeit des Filters. Sinnvolle Werte liegen zwischen 8 und 32, wobei mir 16 als guter Kompromiß zwischen Geschwindigkeit und Filterintensität erscheint. Werte oberhalb 32 machen den Filter zwar langsamer, bringen aber keine größere Veränderung mehr gegenüber dem Wert 32.

Vorgabewert: 16


threshold ist für alle die, die unbedingt ein Limit für die Bildveränderung haben wollen; man könnte diesen Parameter als Sicherheitsnetz gegen übermäßige Bildverunstaltung betrachten. Die maximale Veränderung jedes Pixels bleibt unterhalb des hier angegebenen Wertes.

Vorgabewert: 255

History

Version
Beschreibung
0.7
Durch einige zusätzlich Arbeitsschritte konnte die Zahl der entstehenden Bildfehler weiter gesenkt werden, jedoch ist das Ganze nun um einiges langsamer.
Der YV12-Teil ist immer noch deaktiviert.

0.6
Nach einigem Herumfeilen tut der Filter nun das, was ich ursprünglich wollte; der Testfilm (testfilm.avi) zeigt die Arbeitsweise des Filters.
Der YV12-Teil arbeitet nicht fehlerfrei und wurde deaktiviert.

0.5
einen Format-Konversions-Fehler beseitigt, der dazu führte, daß negative Werte falsch interpretiert wurden; das Ergebnis: nun arbeitet der Filter sorgfältiger, aber auch langsamer.
0.4
kleinere Fehler beseitigt, Verbesserte Glättung, immer noch langsam
0.3
jetzt auch Unterstützung für YV12
weitere Verringerung von Artefakten, statt dessen leichter Weichzeichner-Effekt bei höheren Werten für surr_var
0.2
Verringerung von Artefakten durch kleinere Veränderungen
Teilbarkeit der Bildweite durch 4 wird jetzt geprüft
0.1
Erste Veröffentlichung