2010-09-02 3 views
7

Как часть моделирования python, я беру 2d-массив и беру градиент этого массива. Это делается в scipy/numpy путем свертывания массива 2d с фильтром с соответствующими весами.Каков наилучший способ обработки изображения в clojure?

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

ответ

5

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

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

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

Хороший процесс должен начинаться с кода, который ясно и работает и Твик в течение Perfomance впоследствии.

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

1

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

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

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

http://clojure.org/java_interop

+0

Спасибо, но меня больше интересует понимание различий в использовании библиотек Java против написания чистого Clojure. – 2daaa

1

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

Смежные вопросы