Optimiertes RemoveDirt -oder- grobes Grain an speziellen Stellen

  • Hallo allerseits,

    ich möchte hier ein Problem vorstellen, das mich schon lange beschäftigt, und für das ich noch immer keine Lösung gefunden habe:

    Zum Digitalisieren meiner alten VHS-Aufnahmen habe ich in den letzten Monaten folgendes Script entwickelt:

    Das Resultat gefällt mir eigentlich außerordentlich gut, jedoch gibt es ein großes Problem mit RemoveDirt:

    Dieses Plugin spielt hier eine sehr große Rolle, da es die vom VHS-Recorder erzeugten Ausreißer zwischen den einzelnen Zeilen eines Vollbildes, abschwächt.
    Leider killt es aber bei schnell bewegten Frames auch eine Menge wichtiger Details (siehe Beispielframes unten).

    Wenn ich RemoveDirt an der angegebenen Stelle weglasse, dann bildet sich an bestimmten Stellen ein sehr grobes Grain, welches ich einfach nicht wirksam reduziert kriege (siehe Beispiel-Video unten).

    Daher nun meine Frage:

    • Wäre es irgendwie möglich, RemoveDirt zu limitieren (so dass nur Änderungen vorgenommen werden, die das Bild nicht zu sehr verändern) o.ä.?
    • Oder hat vielleicht jemand eine Idee, wie ich das grobe Grain loswerden kann (DeGrainMedian und LRemoveDust helfen nicht genug oder matschen die Details kaputt...)?


    Ich wäre wirklich froh, wenn ihr mir bei dem Problem helfen könntet - denn ich bin mit meinem Latein inzwischen am Ende...

    CU, Chris

    --------------------------------

    Beispiel-Video (Ausschnitt - nicht verkleinert, Huffyuv-kodiert):
    - Original (1,36 MB - man achte auf die Zeilen-Artefakte, hineinzoomen!)
    - ohne RemoveDirt (1,85 MB - grobes Grain an Hand und Unterarm beachten!)
    - mit RemoveDirt (1,85 MB - Grain ist sehr deutlich reduziert!)

    Beispiel-Frame (zur Illustration des Detail-Verlustes):
    - Original (ca. 500 kB)
    - ohne RemoveDirt (ca. 400 kB)
    - mit RemoveDirt (ca. 400 kB - am besten mal zwischen beiden umschalten!)

    Und hier noch alles zusammen als ZIP-Archiv: Download (ca. 5,7 MB)

  • Zitat

    RemoveDirt mit Bewegungskompensation unterstützen. Sensibilitäts-Thresholds von RemoveDirt dann ggf. etwas heruntersetzen.


    Die Idee ist nicht schlecht - allerdings kann die Bewegungskompensation auf Grund des starken Rauschens leider kaum etwas ausrichten (du meinst doch DePanEstimate oder?)...
    Und RemoveDirt (die ältere Plugin-Version) nimmt leider keine Parameter!

    Zitat

    RemoveHighNoiseMC&Co sind für solche Quellen auch ganz praktisch


    Diese habe ich auch schon ausprobiert. Das Problem dabei ist allerdings, dass sie das Bild zu sehr kaputtmatschen. Der fragliche RemoveDirt-Aufruf erfolgt ja vor dem Deinterlacen, um nur die gröbsten Ausreißer zu entfernen. Das eigentliche Entrauschen erfolgt später.

    Cu, Chris

  • Also ... am Ende gilt wieder mal die Binsenweisheit: "Du kannst kein Omelett backen, ohne ein Ei zu zerbrechen."

    Erstmal ist mir die direkte Anwendung von RemoveDirt() auf interlacten Inhalt ist sowieso suspekt, aber das musst Du wissen. (Es kann durchaus so sein, dass bei Bewegung/Interlacing so viel Artefakte entstehen, dass RemoveDirt sich automatisch selber deaktiviert.)

    Vom Grundprinzip her ist RemoveDirt ja nichts anderes als ein temporaler Medianfilter mit vielen Sicherheitschecks. Die braucht er auch, weil ein "nackter" temporaler Medianfilter *zwingend* schlimme Artefakte produziert, sobald sich etwas bewegt. Im günstigsten Fall macht RemoveDirt bei bewegtem Inhalt also gar nichts. Dass das nicht immer funktioniert, siehst Du an dem Detailverlust den RemoveDirt hervorruft. Das ist das Ei, das man für das Omelett zerbrechen muss.

    Um Abmilderung zu schaffen gibt es zwei Vorgehensweisen:

    1) Beschränkung auf eher kleinen spatialen Radius
    Damit kann man wohl einerseits der Detailverlust in Grenzen gehalten; andererseits verliert man damit aber die Möglichkeit, die "Dreck"-Artefakte zu entfernen (wie z.B. der Fussel, der in dem Videosample auf des Mannes T-Shirt auftaucht.)
    => "You win here, you lose there."

    2) Nochmal: Bewegungskompensation
    Das hilft in der Gesamtheit auf jeden Fall. Natürlich ist Bewegungskompensation nicht immer perfekt; manchmal macht sie Fehler, und in bestimmten Fällen von Bewegung kann sie gar nicht erfolgreich arbeiten. Man wird also insgesamt ein besseres Filterergebnis bekommen, an vereinzelten Stellen aber auch ein schlechteres Ergebnis kriegen.
    => "You win here, you lose there."

    Zitat

    allerdings kann die Bewegungskompensation auf Grund des starken Rauschens leider kaum etwas ausrichten (du meinst doch DePanEstimate oder?)...


    Nö, ich dachte da eher an blockbasierte Kompensation mit MVTools. Depanning ist zwar schneller, hilft aber auch viel weniger.
    Das Rauschen ist natürlich ein Problem, aber da könnte man den Input schon ausreichend breitmatschen, um es für die Bewegungssuche genehmer zu machen.

    Zitat

    Und RemoveDirt (die ältere Plugin-Version) nimmt leider keine Parameter!


    Was, echt jetzt? Komisch. In der Doku zu der Plugin-Version v0.6.1 von RemoveDirt steht bei mir:

    [Blockierte Grafik: http://img4.myimg.de/RemoveDirtVariables15892.png]


    Noch zu etwas aus der ersten Post:

    Zitat

    hat vielleicht jemand eine Idee, wie ich das grobe Grain loswerden kann (DeGrainMedian und LRemoveDust helfen nicht genug oder matschen die Details kaputt...)?


    Das ist nicht verwunderlich. Wenn die Unerwünschten Anteile des Inputs eine hinreichend große räumliche Ausdehnung haben, dann beißen sich Filter mit spatialem Anteil (oder temporalfilter mit spatialer Kopplung) daran meist die Zähne aus: Ein zu einem unerwünschten Bildanteil gehörendes Pixel wird nicht bereinigt, weil die Umgebung des Pixels hinreichend ähnlich aussieht. Gerade bei VHS ist das völlig normal, und ein echtes Problem.

    *****

    Zusammenfassung:

    Nein, mir springt hier leider auch kein Kaninchen aus dem Zylinder. Probieren kann man viel - wofür ich aber gerade überhaupt keine Zeit habe, sorry - und am Ende muss man immer einen Kompromiss schließen, entsprechend der eigenen Wertung und dem eigenen Geschmack. Denn, was auch immer man unternimmt,

    "You win here, you lose there"

    ist und bleibt eine felsenfeste Grundregel aller automatisierten Bereinigungsverfahren. Wirklich entkommen kann man diesem Teufelskreis nur mit heftigstem manuellem Einsatz, sprich Einzelbildbearbeitung. :ninja:
    Andernfalls bleibt eben nur, aus den vorhandenen Übeln dasjenige auszuwählen, das einem selbst als das kleinste erscheint ...

  • Wow Didée, herzlichen Dank für diesen ausführlichen Beitrag. Damit habe ich wieder etwas zum Ausprobieren :daumen:

    Zitat

    Erstmal ist mir die direkte Anwendung von RemoveDirt() auf interlacten Inhalt ist sowieso suspekt, aber das musst Du wissen.


    Ich hatte mir Folgendes dabei überlegt (lass mich aber gern von dir korrigieren):
    Das Material ist zwar eigentlich schon interlaced, aber dies wird ja durch Zusammenblenden von jeweils 2 Frames des gebobbten Streams behoben (also werden die Fields im Prinzip sowieso zusammengemischt).
    Und das dabei entstehende "groben Grain" scheint mir durch die vorherige Anwendung von RemoveDirt deutlich abgeschwächt zu werden...

    Zitat

    1) Beschränkung auf eher kleinen spatialen Radius


    Tatsächlich, da gibt es ja doch Parameter :wall: Tut mir Leid, da muss ich irgendwas verwechselt haben...
    Allerdings habe ich das Problem, dass ich hier mit der Dokumentation nicht wirklich zurechtkomme (zu viele Parameter, deren Sinn ich nicht verstehe...)

    An welchem/n Parameter/n müsste ich denn drehen, um den von dir erwähnten spatialen Radius zu verkleinern?
    Und kann man dafür vielleicht durch andere Einstellungen den Effekt etwas steigern?

    Zitat

    2) Nochmal: Bewegungskompensation
    ...blockbasierte Kompensation mit MVTools...


    Das hatte ich mir jetzt fast gedacht, dass du da noch was Besseres kennst...
    Könntest du mir da vielleicht mit einem kleinen Beispiel auf die Sprünge helfen :winken:

    Cu, Chris

  • Hi nochmal,

    ich habe jetzt einiges ausprobiert, allerdings kann ich einfach nicht nachvollziehen, welche(r) Parameter von RemoveDirt sich auf den von Didée erwähnten spatialen Radius auswirken, und wie man diese tunen kann!

    Didée:
    Und wie soll denn diese "...blockbasierte Kompensation mit MVTools..." funktionieren? Ich kenne leider nur Bewegungskompensation mittels DePan...
    Falls du da ein Beispiel hättest wäre das echt toll!

    Cu, Chris

  • allerdings kann ich einfach nicht nachvollziehen, welche(r) Parameter von RemoveDirt sich auf den von Didée erwähnten spatialen Radius auswirken, und wie man diese tunen kann!


    Gar nicht. Wo hätte ich denn gesagt, dass RemoveDirt einen solchen Parameter haben würde? RemoveDirt hat keine solchen Parameter, also kann man sie auch nicht tunen.

    Mein Wortlaut war "Man müsste ... spatial beschränken", und damit war ein selbstgebastelter Sieb-Filter gemeint.


    Zitat

    Und wie soll denn diese "...blockbasierte Kompensation mit MVTools..." funktionieren? Ich kenne leider nur Bewegungskompensation mittels DePan...
    Falls du da ein Beispiel hättest wäre das echt toll!

    Ha, ich brauch' gar kein Beispiel zu geben:

    Die Beispiele stehen in der Doku zu MVTools bereits drin!!!

  • Zitat

    ...und damit war ein selbstgebastelter Sieb-Filter gemeint.


    Oh oh, das wird ja immer komplizierter... Da steh ich jetzt komplett auf dem Schlauch :huh:

    Kannst du mir vielleicht wenigstens verraten, wie man an so etwas herangehen könnte, oder wo man Informationen dazu finden könnte? Ein kleines Beispiel wäre natürlich auch herzlich willkommen (falls es nicht zuviel Arbeit macht...)

    Cu, Chris

  • Eine einfache Möglichkeit, um einen temporalen Filter spatial zu "sieben":

    Code
    c = last
    
    
    RD   = c.RemoveDirt()
    RDD1 = mt_makediff(c,RD,U=3,V=3)
    RDD2 = RDD1.RemoveGrain(4).RemoveGrain(11)
    RDD3 = mt_lutxy(RDD2,RDD1,"x 128 - y 128 - * 0 < y x 128 - abs y 128 - abs > y y 128 - x 128 - - 128 + ? ?",U=3,V=3)
    
    
    c.mt_makediff(RDD3,U=3,V=3)

    Ist wirklich nur ein Beispiel ... man kann das mindestens auf zwei oder drei verschiedene Art und Weisen machen, die am Ende alle recht ähnlich aussehen, sich aber in ihrer Charakteristik etwas unterscheiden.
    Der spatiale Radius der Beschränkung beträgt hierbeim obigen Script ~ungefähr~ r=1.5.

    Insgesamt könnte man hier wieder basteln ohne Ende:
    Wenn man ein Postprocessing für RemoveDirt baut, weil die eingebauten Sicherheits-Checks nicht gut genug sind, dann könnte man RemoveDirt auch gleich bleiben lassen, und durch Clense ersetzen.
    Oder: Wenn man RemoveDirt mit MVTools unterstützt, ist ja gut und schön ... aber dann wäre es wiederum Schade, in seinem Script erst das hypothetische RemoveDirtMC() zu verwenden (mit dem rechentechnischen Aufwand für die Bewegungskompensation), dann jedoch im weiteren Scriptverlauf die nachfolgenden Filter weiterhin "dumm" laufen zu lassen (also ohne Bewegungskompensation), obwohl ja der entscheidende Aufwand dafür vorher schon betrieben wurde.

    Und so kommt man vom einen zum anderen, vom hundertsten ins tausendste, und kein Ende in Sicht ...

  • Danke dir vielmals, Didée! Ich weiß dein Engagement und deine wertvollen Tipps wirklich zu schätzen :floet:

    Das werde ich auf jeden Fall sorgfältig austesten (komme aber wahrscheinlich erst am Wochenende wieder dazu...)

    Cu, Chris

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!