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
risposta
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.
Grazie, lo esaminerò. Inoltre, scrivendo 3x3 ho inteso che la dimensione della finestra mediana è 3x3, l'immagine reale in cui è usata è megapixles grande. – bla
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
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 ...
Questo è elegante, ma sfortunatamente calcola la mediana di ogni 3x3 non sovrapposto, non la mediana di ogni possibile 3x3. –
Prova questo: Rolling median in C - Turlach implementation
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à :)
grazie Alex, non l'ho ancora provato, ma sembra promettente. – bla
- 1. binning Quantile/Mediano/2D in Python
- 2. Convoluzione 2D veloce per DSP
- 3. Filtraggio veloce di una collezione di stringhe per sottostringa?
- 4. uso awk per identificare record di più linee e filtraggio
- 5. mediano di boxplot ggplot2 mediano non stanno tramando come previsto
- 6. python/NumPy metodo più veloce per 2g filtraggio kernel rango su array mascherati (e/o posizionamento selettiva)
- 7. Modo rapido per implementare la convoluzione 2D in C
- 8. Come implementare un heap mediano
- 9. Un algoritmo per il testo di filtraggio dei file
- 10. Sigma ottimale per il filtraggio gaussiano di un'immagine?
- 11. Motivo di progettazione per il filtraggio degli oggetti
- 12. Set di dati reattivi per il filtraggio in lucido R
- 13. Uso del campo statico pubblico, buona pratica di programmazione/veloce?
- 14. jqGrid Stato di raggruppamento durante il filtraggio
- 15. memoria dinamica per array 2D 2D
- 16. modello di Django: Filtraggio per utente, sempre
- 17. Perché l'algoritmo mediano-mediano è descritto come utilizzando lo spazio ausiliario O (1)?
- 18. Filtraggio per autore in TortoiseHg
- 19. Libreria Python per filtraggio XSS?
- 20. sostituire zeri in matrice numpy con il valore mediano
- 21. Uso di OpenGL per sostituire Canvas - Android
- 22. Qual è l'approccio corretto quando si utilizza il contenitore STL per il calcolo mediano?
- 23. Scaling di LibGDX Grafica 2d
- 24. filtraggio condizionale aderire
- 25. Algoritmo per l'interpolazione 2D
- 26. Facendo uso di C++ per velocizzare PHP
- 27. Filtraggio sull'unione?
- 28. Eliminare ramificazione quando ritrovamento mediano in un binario {0, 255} immagine
- 29. Motori 2D per Javascript
- 30. Come accedere a maven.build.timestamp per il filtraggio delle risorse
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
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
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