Pregunta

escribo mi propio filtro gaussiano, pero es muy lento.

algoritmo de Gauss de OpenCV es mucho más rápido, 20 veces más que mi filtro gaussiano. Quiero volver a escribir el algoritmo de Gauss de OpenCV en mi proyecto, y yo no quiero incluir OpenCV en mi proyecto.

Sin embargo,

  

Puede alguien darme la descripción del algoritmo, el código fuente de OpenCV   parece demasiado difícil de entender?

¿Fue útil?

Solución

El filtro de Gauss tiene una propiedad que hace que sea muy fácil de acelerar: el filtro puede ser aplicado en ambas dimensiones de forma independiente. Se define un unidimensional filtro que opera verticalmente, y otro que funciona en posición horizontal, y se aplican a los dos; esto produce el mismo efecto que un único filtro aplicado en dos dimensiones.

Más allá de eso, es probable que tengas que mirar los por ejemplo, SSE3 disponible para su procesador.

Otros consejos

Para responder a la segunda parte de su pregunta, un desenfoque gaussiano es simplemente la de una superficie gaussiana 3-D aplicado como un núcleo de convolución sobre la imagen. Wikipedia tiene una gran referencia en el propio algoritmo, pero básicamente, se toma el valor de una gaussiana curva y convertir eso en una matriz cuadrada, y se multiplica por cada píxel en la imagen, por ejemplo:

Kernel:               
[0 1 2 0 0
1 4 6 4 1      X   Iterate over every single pixel in the image
2 6 10 6 2
1 4 6 4 1
0 1 2 1 0]

(Tenga en cuenta que esto es sólo una muestra de núcleo, hay ecuaciones muy específicas que, dependiendo de las variables gaussianas, obtendrá resultados diferentes)

Para responder a la pieza del funcionamiento de su pregunta, la velocidad general de este algoritmo dependerá de algunas cosas, asumiendo una imagen de tamaño constante. Digamos que la imagen es NxM píxeles, y el núcleo de convolución es PxP píxeles. Vas a tener que hacer P P operaciones N * M. Cuanto mayor sea P, las más de las operaciones que van a tener que hacer para una imagen dada. Puede obtener astuta con el algoritmo utiliza aquí, haciendo fila muy específico o matemáticas basada columnar.

La aplicación también es muy importante. Si quieres ser extremadamente eficiente, es probable que desee utilizar las instrucciones más avanzadas que ofrece su arquitectura. Si está usando un chip de Intel x86, es probable que desea mirar en conseguir una licencia para las primitivas de rendimiento Intel (IPP) y llamar a esas instrucciones directamente. IIRC, OpenCV hace uso de IPP cuando su disposición ...

También podría hacer algo muy inteligente y trabajar con todos los números enteros a escala si el rendimiento de punto flotante en su arquitectura dada es pobre. Esto probablemente acelerar las cosas un poco, pero me gustaría ver otras opciones primero antes de ir por este camino.

Trate de ver aquí . ¿Quieres averiguar la matriz discreto gausiano antes de tiempo, entonces convolución con la imagen.

Si el kernel de convolución es relativamente grande y va a implementar convolución directa, la diferencia de rendimiento puede deberse a que OpenCV está implementando convolución utilizando una transformada rápida de Fourier (FFT).

No me gusta ser pedante, pero está solicitando un algoritmo, es decir, una secuencia precisa de pasos necesarios para realizar una tarea. Ya tiene el algoritmo de Gauss. Así que el punto clave de su pregunta es cuando se pide algo rápido , que no es lo mismo que preguntar por un algoritmo.

Para responder a la rápido pregunta - usted quiere saber cómo OpenCV optimiza su código, que es un tema muy técnico y amplia. Me gustaría aventurar una respuesta diciendo que utiliza el lenguaje ensamblador, y las funciones específicas en la GPU. Yo empezaría por el conjunto de aprendizaje, e investigando el paquete CUDA para aprovechar la GPU.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top