2012-03-26 11 views
5

Ho un collo di bottiglia in un filtro mediano 2D (finestra 3x3) Io uso su un set di immagini molto grande, e mi piacerebbe provare ad ottimizzarlo. Ho testato scipy.ndimage median_filter, nonché PIL, scipy.signal e scikits-image. Tuttavia, navigando in SO ho imparato che c'è un filtro O (n) veloce là fuori in C (Median Filtering in Constant Time vedi Rolling median algorithm in C), e mi chiedevo se posso implementarlo in Python usando scipy.weave.inline? Qualche suggerimento su un percorso alternativo?Uso di scipy.weave.inline per il filtraggio mediano 2D veloce

+2

Ho un involucro Cython per Perreault + Hebert, filtraggio mediano in tempo costante, da qualche parte - ma che sarei overkill per 3x3, meglio fare una rete di smistamento, 9 ingressi in 25 confronti. Gli input sono 0..25 o cosa? – denis

+0

Vuoi semplicemente elaborare il set di immagini? [OpenCV] (http://opencv.org/) è un percorso alternativo? [medianBlure] (http://docs.opencv.org/modules/imgproc/doc/filtering.html#medianblur) forse? Hai anche implementazioni CUDA e OpenCl. – mfrellum

+0

la maggior parte del framework del codice è già in python, le piccole parti sono in matlab, sarebbe meglio implementare questa parte del codice in python in qualche modo. – bla

risposta

1

Non conosco l'algoritmo sottostante, ma l'immagine di scikits ha uno rolling median filter.

Altrimenti, mi consiglia di scriverlo in Cython (linguaggio pidgin C/Python). Assicurati di controllare il convolution example/tutorial per lavorare con gli array numpy.

+0

Grazie, lo esaminerò. Inoltre, scrivendo 3x3 ho inteso che la dimensione della finestra mediana è 3x3, l'immagine reale in cui è usata è megapixles grande. – bla

+0

Beh, sembra che gli scikits siano ancora più lenti di PIL e scipy.ndimage. Sfortunatamente, le immagini su cui lavoro sono a 16 bit, quindi l'opzione 0..255 non è rilevante. Next Cython ... – bla

1

Se rimodellare e mediana del NumPy ancora interessato mi piacerebbe provare:

a= some big array 
a.reshape(N,3,3) #N being specific to your array 
[numpy.median(m) for m in a] 

Non so come questo scale rispetto ai vostri metodi testet, ma se si desidera ottimizzare con C si potrebbe fissare il per ciclo nella lista di comprensione ...

+1

Questo è elegante, ma sfortunatamente calcola la mediana di ogni 3x3 non sovrapposto, non la mediana di ogni possibile 3x3. –

2

Prova questo: Rolling median in C - Turlach implementation

http://ideone.com/8VVEa

Uso:

Mediator* m = MediatorNew(9); 
for (...) 
{ 
     MediatorInsert(m, value); 
     median = MediatorMedian(m); 
} 

credo che questo è lo stesso come il R algo, ma più pulito (incredibilmente così, in effetti).

È possibile eseguire il wrapping o portarlo e utilizzare Numba (o Cython). Penso che raccomanderei Numba su Cython, se non altro perché è codice Python semplice.

mi consiglia di aggiungere questo per scikits, se si corre più veloce di quella di scikits già :)

+0

grazie Alex, non l'ho ancora provato, ma sembra promettente. – bla

Problemi correlati