Pseudocode für blockweise nicht lokale Mittel zur Rauschreduzierung

8

Ich habe einen netten Algorithmus implementiert (" Non Local Means ") zur Reduzierung von Bildrauschen. Es basiert auf seiner Matlab-Implementierung .

Das Problem mit NLMeans ist, dass der ursprüngliche Algorithmus selbst in kompilierten Sprachen wie c / c ++ langsam ist und ich versuche, ihn mit einer Skriptsprache auszuführen.

Eine der besten Lösungen ist der verbesserte Blockwise NLMeans-Algorithmus das ~ 60-80 mal schneller ist. Das Problem ist, dass das Papier, das es beschreibt, in einer komplexen mathematischen Sprache geschrieben ist, und es ist wirklich schwer für mich, eine Idee zu verstehen und zu programmieren (Ja, ich habe am College kein Mathe gelernt).

Deshalb suche ich verzweifelt nach einem Pseudocode dieses Algorithmus.

(Modifikation der ursprünglichen Matlab-Implementierung wäre einfach perfekt)

    
Termos 12.08.2011, 14:54
quelle

1 Antwort

7

Ich gebe zu, ich war fasziniert, bis ich das Ergebnis sah - 260+ Sekunden auf einem Dual-Core, und das setzt nicht den Overhead einer Skriptsprache voraus, und das ist für den Optimized Block Non Local Means Filter.

>

Lassen Sie mich die Mathematik für Sie aufschlüsseln - Meine Idee des Pseudo-Codes ist das Schreiben in Ruby.

Nicht lokale Filterung

Nehmen Sie ein Bild mit 200 x 100 Pixel (insgesamt 20000 Pixel) an, was ein ziemlich kleines Bild ist. Wir müssen 20.000 Pixel durchgehen und jede auf dem gewichteten Durchschnitt der anderen 19.999 Pixel bewerten: [Sorry über den Abstand, aber die Gleichung wird als ein Link ohne es interpretiert]

NL [v] (i) = Σ w (i, j) v (j) [j I]

wobei 0 ≤ w (i, j) ≤ 1 und Σ j w (i, j) = 1

Verständlicherweise kann dieser letzte Teil ein wenig verwirrend sein, aber das ist wirklich nichts weiter als ein Faltungsfilter, der die Größe des gesamten Bildes auf jedes Pixel anwendet.

Blockweise nicht lokal bedeutet Filtern

Die blockweise Implementierung erfordert überlappende Sätze von Voxeln (volumetrische Pixel - die Implementierung, auf die Sie uns hingewiesen haben, ist für den 3D-Raum). Vermutlich könnte man dies auf ähnliche Weise auch auf den 2D-Raum anwenden, indem man überlappende Pixelsätze verwendet. Mal sehen, ob wir das beschreiben können ...

NL [v] (i j k ) = 1 / | A | Σ w (i sub > k , i) v (i)

Wobei A ein Vektor der zu schätzenden Pixel ist und ähnliche Umstände wie oben angewendet werden.

[NB: Ich bin vielleicht etwas abseits; Es ist ein paar Jahre her, seit ich schwere Bildbearbeitung gemacht habe]

Algorithmus

Wahrscheinlich handelt es sich um die Reduzierung der Komplexität des Algorithmus bei minimalen Kosten für die Reduzierung der Qualität. Je größer der Probenvektor, desto höher die Qualität und desto höher die Komplexität. Durch Überlappung, dann Mittelung der Mustervektoren aus dem Bild, dann Anwenden dieses gewichteten Durchschnitts auf jedes Pixel werden wir viel weniger Male durch das Bild laufen.

  • Durchlaufen Sie das Bild, um die Beispielvektoren zu sammeln und den gewichteten Mittelwert in einem Array zu speichern.
  • Wenden Sie jeden gewichteten Durchschnitt (eine Zahl zwischen 0 und 1) auf jedes Pixel mal den Pixelwert an.

Ziemlich einfach, aber die Verarbeitungszeit wird mit größeren Bildern schrecklich sein.

Abschließende Gedanken

Sie werden einige schwierige Entscheidungen treffen müssen. Wenn Sie eine Skriptsprache verwenden, haben Sie bereits mit erheblichen interpretativen Mehraufwand zu tun. Es ist bei weitem nicht optimal, eine Skriptsprache für die Verarbeitung von Hochleistungs-Bilddateien zu verwenden. Wenn Sie keine medizinischen Bilder verarbeiten, gibt es aller Wahrscheinlichkeit nach viel bessere Algorithmen für kleinere O's.

Ich hoffe, das ist hilfreich ... Ich bin nicht besonders gut darin, einen Punkt klar und deutlich zu formulieren. Wenn ich also etwas klarstellen kann, lassen Sie es mich wissen.

    
stslavik 19.08.2011, 17:40
quelle

Tags und Links