So che questa domanda è un po 'vecchio, ma ho anche avuto interessati a filtraggio mediano. Se si sta lavorando con segnali o immagini, allora ci sarà una grande sovrapposizione di dati per la finestra di elaborazione. Questo può essere sfruttato.
ho postato un certo codice di riferimento qui: 1D moving median filtering in C++
Si modello basato così dovrebbe funzionare con la maggior parte dei tipi di dati POD.
Secondo i miei risultati std::nth_element
ha scarse prestazioni per una mediana in movimento, in quanto ogni volta deve ordinare la finestra dei valori.
Tuttavia, utilizzando un pool di valori che viene mantenuto ordinato, è possibile eseguire la mediana con 3 operazioni.
- Rimuovere più antico valore fuori dalla piscina (chiamate std :: lower_bound)
- Inserisci nuovo valore nella piscina (chiamate std :: lower_bound)
- Conservare nuovo valore nel buffer storico
La mediana ora è il valore medio nella piscina.
Spero che qualcuno trovi questo interessante e contribuisca alle loro idee!
hai provato std :: nth_element? È O (n) rispetto a O (n log n) per un quicksort. – smocking
Non si desidera modificare questo algoritmo per farlo funzionare a breve poiché il tempo di esecuzione per pixel è proporzionale a 2^n, dove n è il numero di bit nel tipo di dati utilizzato. 256 per gli array a 8 bit è già abbastanza doloroso, non si vuole passare a 65536 per gli array a 16 bit. Vedi la mia risposta per un algoritmo più veloce, anche se è O (log r) per pixel invece di O (1). – HelloGoodbye
Se non si desidera eseguire il filtraggio mediano, che è quello che si fa per l'elaborazione dell'immagine ad esempio dove si trova una mediana per ogni pixel, ma si vuole trovare solo una mediana, il commento di @ smocking è rilevante. – HelloGoodbye