Ich habe ein 2D-Bild, das ich filtern möchte, mit diesen Einschränkungen / Qualitätsmetriken:
- Ich kann dem Bild kein Licht "hinzufügen", daher sollte jedes Pixel im Ergebnis <= das entsprechende Pixel in der Eingabe sein.
- Die Tiefpass-Grenzfrequenz sollte ein Parameter sein, mit dem experimentiert werden soll
- Das wiederholte Anwenden dieses Filters sollte das Ergebnis nicht wesentlich verändern.
- Die Zeit, die benötigt wird, um diesen Algorithmus auszuführen (5 Minuten für ein 5MPix-Image scheinen angemessen)
- Minimierung der Lichtmenge, die weggefiltert wird.
Im Folgenden sind einige Ansätze aufgeführt, die ich zusammen mit ihren Nachteilen ausprobiert habe:
Gauß-Filter wie gewohnt, dann ziehen Sie das Ergebnis nach unten, um die Bedingung 1 zu erfüllen. Dies entspricht sehr gut den ersten 3 Punkten, reduziert jedoch viel mehr Licht als nötig.
Anpassen von "Aufwärts" -Parabeln durch die "Tief" -Punkte und "Abwärts" -Parabeln zwischen ihnen, um zu glätten. Dies funktioniert in 1D sehr gut, aber wenn Sie es zuerst horizontal und dann vertikal anwenden, werden in 2D schlechte Ergebnisse erzielt. Es dauert viel länger, aber nicht zu lange für meine Bewerbung. Durch wiederholtes Anwenden dieses Filters wird das Ergebnis jedoch drastisch geändert. Wenn der (1D) -Eingang eine perfekte "Abwärts" -Parabel ist (die überhaupt nicht gefiltert werden sollte), wird er durch 2 "Aufwärts" -Parabeln ersetzt, die am Anfang / Ende sitzen.
Verwenden einer anderen Form von 2D-Grundfunktionen und lineares Lösen, um die optimalen Parameter zu finden. Dies ist eine Idee, die derzeit noch nicht implementiert / getestet ist.
Mein Erfahrungsbereich in der Signalverarbeitung ist fast ausschließlich die Bildverarbeitung, daher hoffe ich, mit dem Input von Experten, die in anderen Bereichen der Signalverarbeitung tätig sind, Alternativen zu diesem Problem zu finden.
Update 18.08.2011
Auf der Grundlage der aktuellen Reaktionen habe ich beschlossen, die Dinge etwas klarer zu gestalten, indem ich Diagramme eines typischen Inputs und die Ergebnisse der drei ursprünglich beschriebenen Ansätze + der Vorschläge, die ich bisher erhalten habe, hinzufügte. Zum einfachen Vergleich habe ich in diesen Beispielen nur 1D-Filterung verwendet.
Eingabedaten:
Gauß-Filter + senken, um die Anforderung (1) zu erfüllen.
Sie können sehen, dass ein Herunterfahren zu unnötigen Lichteinsparungen auf der rechten Seite führt.
Parabeln
Was mich betrifft, ist dies ziemlich gut, leider lässt es sich nicht perfekt in 2D übersetzen, wenn zuerst horizontal, dann vertikal angewendet wird. In diesem Fall sehe ich auch, dass ich die angepassten Parabeln in Gleitkommaauflösung auswerten kann, was ein kleiner Vorteil ist, aber nicht unbedingt erforderlich.
Graustufenerosion
Auf Anregung von rwong habe ich Graustufenerosion ausprobiert. Ich habe ein Strukturierungselement mit der gleichen parabolischen Form wie meine "angepassten" Parabeln verwendet. Das Ergebnis ist nahezu identisch, das sieht also vielversprechend aus. Es gibt jedoch noch einige Probleme: 1. Mein Strukturierungselement war nicht "groß genug" (obwohl es bereits 801 Pixel breit war) 1. Ich habe nur "aufwärts" -Parabeln, keine "abwärts" -Parabeln, um den Übergang von einer Parabel zu glätten zum nächsten.
Medianfilterung
Nur der Vollständigkeit halber ist es nicht wirklich das, was ich will.
Rohdaten
Ich habe die Rohdaten + die verschiedenen Python-Befehle in den Pastebin eingefügt, damit Sie auch mit denselben Daten experimentieren können.
http://pastebin.com/ASnJ9M0p