2016-08-23 4 views
1

Ich habe ein Programm, das große Sätze von 2d Graustufenbildern verarbeitet und derzeit imgaussfilt() mehrmals in der Verarbeitung jedes Bildes verwendet (Matlab 2015b). Dies erweist sich als sehr kostenintensiv in Bezug auf die Laufzeit. Ich habe einige Fälle von größeren Sigma-Werten, die teurer erscheinen (d. H. Imgaussfilt (image, [1,40]) ... imgaussfilt (image, [10,15])).MATLAB: schnelle Groß-Sigma-Glättung von 2D-Bildern

Kennt jemand schnellere Versionen/Methoden für Gaußglättung?

Ich habe versucht, die FFT/IFFT-Methode zu verwenden, aber das scheint erheblich länger dauern als die native MATLAB imgaussfilt() -Funktion.

Haben Sie auch versucht, Gaussian Glättung auf der X- und Y-Dimension nacheinander auszuführen, aber das dauert etwas länger als die native imgaussfilt() -Funktion.

Eine andere Glättungsmethode kann auch funktionieren, gibt es andere Methoden, die wesentlich schneller sind? (versuchte imboxfilt() ... nur etwas schneller und nicht so gut).

Dank im Voraus

+0

Haben Sie versucht, 'imfilter' mit einem Gaußschen Kernel zu verwenden? 'imfilter' verwendet die Intel Integrated Performance Primitives für effizientes Filtern. – rayryeng

+0

Warum müssen Sie diesen Filter "mehrmals" bei der Verarbeitung eines Bildes anwenden? vielleicht kannst du es nur einmal am start mit der entsprechenden größe verwenden –

+0

@rayryeng habe ich imfilter mit einem gaussian kernel versucht - war zwar ziemlich schnell aber immernoch etwas langsamer als der imgaussfilt() – user3470496

Antwort

0

Eine der günstigsten Glättungsverfahren I ist einfach denken kann, um den Durchschnitt von benachbarten Pixeln nehmen:

A(i,j) = (A(i-1,j) + A(i+1,j) + A(i,j-1) + A(i,j+1) + w*A(i,j))/(4+w); 

wo w=4 einige Gewichtungsfaktor Ihrer Wahl. Sie können das Array mit circshift verschieben:

A(i-1,j) = circshift(A(i,j), [1 0]); 

und so unter der Annahme, dass Sie alle N Ihrer Bilder speichern in einem Array A(x,y,N) die volle Matlab Befehl lautet:

A = (w*A + circshift(A, [-1 0 0]) + circshift(A, [1 0 0]) + circshift(A, [0 -1 0]) + circshift(A, [0 1 0]))/(4+w); 
1

Aus Ihrer Beschreibung scheint es, Sie verwenden stark anisotrope Filter, hier [1,40] oder [10,15]. Wenn dies wirklich der Fall ist, so dass jeder Ihrer Filter keinen Bezug zu dem anderen hat, empfehle ich die Bildmittelung mit integrierten Bildern. Die relevanten Matlab-Funktionen sind Integralimage und Integralfilter. Dies ist keine Gaußsche Glättung, sondern ein Boxfilter. Nach der Berechnung für das Eingangsbild kann das Integralbild jedoch für viele verschiedene Filterungen wiederverwendet werden, und die Stärke des Filtereffekts ist unabhängig von der Kernelgröße (!), Was beim Imgaussfilter wahrscheinlich nicht der Fall ist. Vielleicht sollten Sie jedoch auf Effekte an den Bildgrenzen achten.

+0

Durch Auswahl der richtigen Größe des Boxfilters können Sie die Effekte einer Gaußschen Unschärfe annähern. Gute Beobachtung mit dem Boxfilter. +1. – rayryeng