Sé que esta pregunta es un poco viejo pero también se interesó en la mediana de filtrado. Si uno está trabajando con señales o imágenes, habrá una gran superposición de datos para la ventana de procesamiento. Esto puede ser aprovechado.
He publicado un código de referencia aquí: 1D moving median filtering in C++
Se basa plantilla así que debería funcionar con la mayoría de tipos de datos POD.
De acuerdo con mis resultados std::nth_element
tiene bajo rendimiento para una mediana móvil, ya que debe ordenar la ventana de valores cada vez.
Sin embargo, utilizando un conjunto de valores que se mantienen ordenados, se puede realizar la mediana con 3 operaciones.
- quitar valor más antiguo fuera de la piscina (llamadas std :: límite distinto)
- Insertar nuevo valor en la piscina (llamadas std :: límite distinto)
- tienda nuevo valor en el búfer de historial
La mediana ahora es el valor medio en el grupo.
¡Espero que alguien encuentre esto interesante y contribuya con sus ideas!
¿usted intentó std :: nth_element? Es O (n) comparado con O (n log n) para un quicksort. – smocking
No desea modificar este algoritmo para hacer que funcione en corto, ya que el tiempo de ejecución por píxel es proporcional a 2^n, donde n es el número de bits en el tipo de datos que se utiliza. 256 para matrices de 8 bits ya es lo suficientemente doloroso, no desea ir a 65536 para matrices de 16 bits. Vea mi respuesta para un algoritmo más rápido, aunque sea O (log r) por píxel en lugar de O (1). – HelloGoodbye
Si no desea hacer un filtrado mediano, que es lo que hace, por ejemplo, en el procesamiento de imágenes donde encuentra una mediana para cada píxel, pero solo quiere encontrar una mediana, el comentario de @ smocking es relevante. – HelloGoodbye