Pixelweise Median der Sequenz von cv :: Mat's

8

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.

    
Humam Helfawi 12.08.2016, 06:00
quelle

2 Antworten

5

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:

%Vor%

Der Medianwert ist der Index im Histogramm, der der Hälfte der Pixel count / 2 entspricht. Auszug aus Rosetta-Code :

%Vor%

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:

  1. Dies funktioniert nur für uchar -Werte, andernfalls ist die Länge jedes Histogramms zu groß
  2. Dieser Ansatz wird eine Menge RAM verwenden, da er rows x cols Histogramme benötigt. Es funktioniert möglicherweise nicht für große Bilder.
  3. Die folgende Implementierung funktioniert für Einkanalbilder, aber sie kann leicht auf 3 Kanäle erweitert werden.
  4. Sie können einen Ansatz verwenden, der auf zwei Heaps oder ungefähren Methoden basiert. Details finden Sie hier:

Code:

%Vor%     
Miki 12.08.2016, 10:41
quelle
2

Sie können die folgende Technik verwenden, wenn die Anzahl der Bilder in Ihrer Sequenz ungerade ist.

  • Bereiten Sie ein N-Kanalbild (das ungerade) aus der Sequenz der Bilder vor, die Sie haben
  • Umformen Sie dieses Bild in einen 1-Kanal-Spaltenvektor
  • Wenden Sie nun einen Medianfilter der Größe N auf diesen Spaltenvektor an. Da das Bild ein 1-Kanal-Spaltenvektor ist, berechnet der Filter den Median der Kanäle (natürlich gibt es einige zusätzliche Berechnungen, die für uns nicht nützlich sind)
  • Formatieren Sie dieses gefilterte Bild in seine ursprüngliche Form mit N Kanälen und der ursprünglichen Anzahl von Zeilen und Spalten
  • Wählen Sie den mittleren Kanal dieses N-Kanal-Bildes, das das Medianbild der Sequenz enthält

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%     
dhanushka 13.08.2016 13:54
quelle

Tags und Links