2daaa
2daaa

Reputation: 2868

What's the best way to process an image in clojure?

As part of a python simulation I have I take a 2d array and take the gradient of this array. This is done in scipy/numpy by convolving the 2d array with a filter with the appropriate weights.

So my question is if I want to do this in clojure reasonably fast does it make sense to do this in pure clojure, or is it better to use a Java image processing library and call into it from clojure?

Upvotes: 7

Views: 3659

Answers (3)

Daniel Yankowsky
Daniel Yankowsky

Reputation: 7006

If you really want optimal performance, you're probably going to need to do your calculations in native code (which, as I understand it, is what NumPy does). We used JAI on a previous project, and it worked well, but we weren't using it for anything advanced. It does seem to have support for kernels and convolutions, so it might work for your purposes. However, I don't believe that it is as flexible as NumPy.

Upvotes: 1

Nicolas Oury
Nicolas Oury

Reputation: 406

A well optimized loop in Clojure will have performance close to Java code.

I will advise using either the primitive vectors or directly arrays from clojure to get very good performance.

I have read a blogpost on the subject: http://www.bestinclass.dk/index.clj/2010/03/functional-fluid-dynamics-in-clojure.html

The good process is to start with code that is clear and works and tweek in for perfomance afterwards.

Often, performance in Clojure revolves around getting rid of reflection and using primitives. This is explained here: http://clojure.org/java_interop

Upvotes: 5

user405163
user405163

Reputation: 1219

You can use Java image processing libraries from Clojure. Here is something to get started.

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

I don't know if this will compile(some help I am) I just translated it from some Scala code of mine in my head.

http://clojure.org/java_interop

Upvotes: 2

Related Questions