2010-09-02 13 views
7

Como parte de una simulación de Python tengo que tomar una matriz 2d y tomar el gradiente de esta matriz. Esto se hace en scipy/numpy al combinar el 2d array con un filtro con los pesos adecuados.¿Cuál es la mejor manera de procesar una imagen en clojure?

Así que mi pregunta es si quiero hacer esto en clojure razonablemente rápido, ¿tiene sentido hacer esto en puro clojure, o es mejor utilizar una biblioteca de procesamiento de imágenes Java y llamar desde clojure?

Respuesta

5

Un bucle bien optimizado en Clojure tendrá rendimiento cercano al código Java.

Aconsejaré utilizar los vectores primitivos o directamente las matrices de clojure para obtener un muy buen rendimiento.

He leído una entrada de blog sobre el tema: http://www.bestinclass.dk/index.clj/2010/03/functional-fluid-dynamics-in-clojure.html

El buen proceso es comenzar con código que es clara y obras y en tweek para la perfomance de después.

A menudo, el rendimiento en Clojure gira en torno a deshacerse de la reflexión y el uso de primitivos. Esto se explica aquí: http://clojure.org/java_interop

1

Puede usar las bibliotecas de procesamiento de imágenes Java de Clojure. Aquí hay algo para comenzar.

(defn getPixels [^BufferedImage image] (-> image .getRaster .getDataBuffer .getData)) 

No sé si esto va a compilar (un poco de ayuda soy) yo sólo lo tradujo de un cierto código Scala mío en mi cabeza.

http://clojure.org/java_interop

+0

Gracias, pero estoy realmente más interesado en comprender las diferencias de rendimiento en el uso de bibliotecas Java que en escribir Clojure puro. – 2daaa

1

Si realmente desea un rendimiento óptimo, lo que probablemente va a tener que hacer sus cálculos en código nativo (que, como yo lo entiendo, es lo que hace NumPy). Usamos JAI en un proyecto anterior, y funcionó bien, pero no lo usábamos para nada avanzado. Parece tener soporte para kernels y convolutions, por lo que podría funcionar para sus propósitos. Sin embargo, no creo que sea tan flexible como NumPy.

Cuestiones relacionadas