Schnell Median-Filter in C / C++ für `UINT16` 2D-Array
Weiß jemand eine schnelle median-filter-Algorithmus für 16-bit (unsigned short) arrays in c++?
Dieser scheint Recht vielversprechend, aber es scheint nur zu arbeiten mit byte-arrays. Weiß jemand, wie es zu ändern, um die Arbeit mit shorts oder einen alternativen Algorithmus?
- Haben Sie versucht, std::nth_element? Es ist O(n) gegenüber O(n log n) für ein quicksort.
- Sie wollen nicht, dies zu ändern-Algorithmus, um es mit kurzarbeit, da die Laufzeit pro pixel ist proportional zu 2^n, wobei n die Anzahl der bits, die in der Datentyp verwendet wird. 256 8-bit-arrays ist schon schmerzhaft genug, Sie nicht wollen, zu gehen bis 65536 für 16-bit-arrays. Siehe meine Antwort für einen schnelleren Algorithmus, obwohl es ist O(log r) pro pixel anstelle von O(1).
- Wenn Sie nicht wollen, zu tun, median-Filterung, die ist, was Sie tun, zum Beispiel in der Bildverarbeitung, wo Sie einen Mittelwert für jeden pixel, sondern wollen einfach nur, um eine zu finden, median, @smoken Kommentar relevant ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Technik in der Papier stützt sich auf die Schaffung eines Histogramm mit 256 bins für eine 8-bit-pixel-Kanal. Konvertierung zu 16 bit pro Kanal würde erfordern ein Histogramm mit 65536 Ablagen und ein Histogramm erforderlich ist, für jede Spalte des Bildes. Aufblasen die Anforderungen an den Arbeitsspeicher von 256 macht dies zu einer weniger effizienten Algorithmus, insgesamt aber wahrscheinlich noch machbar mit der heutigen hardware.
Mit dem vorgeschlagenen Optimierung der Zerschlagung der Histogramm in grob-und fein-Abschnitten sollten weitere Verringerung der Laufzeit Treffer nur 16x.
Für kleine radius Werte, die ich glaube, Sie finden traditionelle Methoden der median-Filterung wird schneller.
Schnell Median Suche - Ein ANSI-C-Implementierung (PDF) ist etwas für C, es ist ein Papier mit dem Titel "Fast median Suche: eine ANSI-C-Implementierung". Der Autor behauptet, es ist O(log(n)), er bietet auch etwas code, vielleicht kann es dir helfen werde. Es ist nicht besser als dein vorgeschlagener code, aber vielleicht einen Blick Wert.
Dieser Artikel beschreibt eine Methode für die median-Filterung von Bildern, die läuft in O(log r) Zeit pro pixel, wobei r wird die filter-radius, und funktioniert für alle Datentypen (sei es 8-bit-Integer oder Double):
Schnell Median und Bilaterale Filterung
Ich weiß, diese Frage ist etwas alt, aber ich habe auch interessiert in der median-Filterung. Wenn man die Arbeit mit Signalen oder Bildern, dann wird es eine große überschneidung von Daten für die Verarbeitung der Fenster. Dies kann in Anspruch genommen werden.
Ich habe einige benchmark-code hier: 1D moving median-Filterung in C++
Es ist template-basiert, so sollte es funktionieren mit den meisten POD-Datentypen.
Laut meiner Ergebnisse
std::nth_element
hat schlechte Leistung für einen gleitenden median, als es muss die Art der Fenster jeweils die Werte.Jedoch, mit einem pool von Werten, die gehalten wird sortiert, die man durchführen kann, der median mit 3 Betrieb.
Der median ist nun der mittlere Wert in den pool.
Ich hoffe, jemand findet diese interessante und trägt Ihre Ideen!
Siehe Gleichungen 4 und 5 in dem folgenden Papier. Die Komplexität ist O(N*W) wo W ist die Breite des filters und N ist die Anzahl der Proben.
Sehen Rauschunterdrückung durch Vektor-Median-Filterung.