Hinweis: Ich frage nicht nach Median Filter.
Ich habe eine Folge von Bildern sagen wir:
%Vor%Ich möchte alle diese Bilder in einem zusammenfassen. Dieses eine Bild sollte genügen:
Jedes Pixel des neuen Bildes ist der Median seiner entsprechenden Pixel aus der Sequenz. Mit anderen Worten:
%Vor%Gibt es dafür eine eingebaute Funktion? Was wäre der schnellste Weg?
Was ich bis jetzt versucht habe: Um über jedes Pixel von der ganzen Sequenz zu iterieren und zu sortieren, dann nehme den Mittelwert und speichere ihn dann im Ergebnis. Es ist jedoch so übertrieben.
Sie können den sequentiellen Median für jede Position mithilfe von Histogrammen berechnen.
Wenn Sie Mat1b
images verwenden, hätte jedes Histogramm 256 Werte.
Sie müssen das Histogramm sowie die Summe aller Bins speichern:
Der Medianwert ist der Index im Histogramm, der der Hälfte der Pixel count / 2
entspricht. Auszug aus Rosetta-Code :
Wenn Sie ein Bild hinzufügen oder entfernen, aktualisieren Sie das Histogramm für jede Pixelposition und berechnen den Median neu. Dieser Vorgang ist ziemlich schnell, weil Sie nicht sortieren müssen.
Es gibt einige Nachteile:
uchar
-Werte, andernfalls ist die Länge jedes Histogramms zu groß rows x cols
Histogramme benötigt. Es funktioniert möglicherweise nicht für große Bilder. Sie können einen Ansatz verwenden, der auf zwei Heaps oder ungefähren Methoden basiert. Details finden Sie hier:
Code:
%Vor%Sie können die folgende Technik verwenden, wenn die Anzahl der Bilder in Ihrer Sequenz ungerade ist.
Unten habe ich die obigen Punkte mit einem einfachen Code und seiner Ausgabe illustriert.
einzelne Kanäle
%Vor%Ausgabe für N = 3
%Vor%Ausgabe für N = 5
%Vor%Code:
%Vor%