Каков наилучший способ обработки изображения в clojure? - PullRequest
7 голосов
/ 02 сентября 2010

В рамках симуляции Python у меня есть 2d массив и беру градиент этого массива. Это делается в scipy / numpy путем свертки 2d массива с фильтром с соответствующими весами.

Итак, мой вопрос: если я хочу сделать это достаточно быстро, имеет ли смысл делать это в чистом режиме или лучше использовать библиотеку обработки изображений Java и вызывать ее из clojure?

Ответы [ 3 ]

5 голосов
/ 03 сентября 2010

Хорошо оптимизированный цикл в Clojure будет иметь производительность, близкую к коду Java.

Я посоветую использовать либо примитивные векторы, либо непосредственно массивы из clojure чтобы получить очень хорошую производительность.

Я прочитал пост на эту тему: http://www.bestinclass.dk/index.clj/2010/03/functional-fluid-dynamics-in-clojure.html

Хороший процесс состоит в том, чтобы начать с понятного и работающего кода и впоследствии настроить его на производительность.

Часто производительность в Clojure вращается вокруг избавления от рефлексии и использования примитивов. Это объясняется здесь: http://clojure.org/java_interop

1 голос
/ 08 сентября 2010

Если вам действительно нужна оптимальная производительность, вам, вероятно, понадобится выполнять вычисления в собственном коде (что, как я понимаю, и делает NumPy).Мы использовали JAI в предыдущем проекте, и он работал хорошо, но мы не использовали его для чего-то более сложного.Кажется, он поддерживает ядра и свертки , поэтому он может работать в ваших целях.Однако я не верю, что он такой же гибкий, как NumPy.

1 голос
/ 02 сентября 2010

Вы можете использовать библиотеки обработки изображений Java от Clojure. Вот с чего начать.

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

Я не знаю, скомпилируется ли это (какая-то помощь, я помогаю), я просто перевел это из своего кода Scala в моей голове.

http://clojure.org/java_interop

...