2012-02-02 4 views
5

Из Mathematica, я хочу передать изображение в плагин ImageJ и получить результат, отправленный с ImageJ в Mathematica.Вызов изображенияJ из Mathematica

JLink - это инструмент, который поможет, но я не знаком ни с ним, ни с ImageJ (что затрудняет использование существующих связанных вопросов на SO). Знаете ли вы, как это сделать?

(я установил ImageJ на мой макинтош уже.)

+0

Предположительно вы должны прочитать ImageJ API для начинающих. Не могли бы вы привести пример проблемы, для которой нужно использовать ImageJ? Здесь есть несколько участников Mathematica, которые являются экспертами в области обработки изображений и могут предлагать собственные методы Mathematica. Вы также можете рассмотреть публикацию здесь: http://mathematica.stackexchange.com/questions –

+0

Можете ли вы привести пример (простой!) Пример Java-кода, который демонстрирует, как использовать ImageJ? Это первый шаг. Затем мы можем перевести этот код в JLink. – Szabolcs

+0

@MikeHoneychurch Хорошая идея, я перейду, если ничего не придет сюда. Меня интересуют плагины ImageJ, которые не находятся в Mathematica. –

ответ

5

Это должно служить только тизер, чтобы показать вам, что это не так сложно, как кажется. Нет никакого способа, чтобы вы были знакомы с Java, ImageJ-API и да, JLink.

Итак, вот как вы начнете: вам нужен архив java ImageJ ij.jar, который вы можете скачать с the ImageJ Website. Эта банка содержит все классы и функции ImageJ, которые используются сами по себе.

Что вы хотите сделать, так это создать изображение, не открыв его через ImageJ-GUI, а используя Java-методы. Для этого вам нужно познакомиться с ImageJ-API, чтобы узнать, как вы можете создать изображение, например. массив чисел, потому что мы хотим передать Mathematica-изображения на Java. Снимая эту документацию, я привел меня в ImageProcessor classes. Как вы можете видеть, они предоставляют два метода: setPixels и getPixels, и оба принимают простые массивы. Давайте использовать это и написать очень простой фильтр:

import ij.process.FloatProcessor; 

public class SimpleTest { 

    public static float[] func(float []bm, int nx, int ny) { 
     FloatProcessor p = new FloatProcessor(nx,ny); 
     p.setPixels(bm); 
     float[] kernel = new float[{0.111f,0.111f,0.111f,0.111f, 
            0.111f,0.111f,0.111f,0.111f,0.111f}; 
     p.convolve(kernel, 3, 3); 
     return (float[]) p.getPixels(); 
    } 
} 

Этой функция получает данные изображения и изображения-размеры, не свертка и возвращает отфильтрованные данные изображения. Чтобы скомпилировать это, помните, что ij.process.FloatProcessor находится внутри ij.jar. Вы должны включить этот архив в свой путь к классам. Позже вы должны убедиться, что JLink находит оба: ij.jar и ваш SimpleTest.class. Обычно я собираю классы в банке. Для этого я назвал его simple.jar.

В то время как Java-сторона готова к року, нам нужны несколько строк для извлечения данных изображения и размеров от Mathematica образа

img = ColorConvert[ExampleData[{"TestImage", "Lena"}], "Grayscale"]; 
{nx, ny} = ImageDimensions[img]; 
data = ImageData[img] // Flatten; 

Что мы делаем сейчас посылаем плоские целочисленный массив data к нашей Java-функции, взяв результат и построим вывод-образ. Для того, чтобы Mathematica найти ваши JAR-архивы, один способ вызвать AppendToClassPath:

Needs["JLink`"] 
AddToClassPath["/pathTo/ij.jar","pathTo/simple.jar"]; 

simpleTest = LoadJavaClass["SimpleTest", StaticsVisible -> True]; 
output = SimpleTest`func[data, nx, ny]; 
Image[Partition[output, nx]] 

С этим последним шагом мы завершаем цикл и получить окончательный результат.

Конечные ноты:

  • Вы должны, может быть (и это означает, что «сделать это») используют один и тот же Java-версия JLink использует для компиляции кода.
  • В плагине ij.jar уже есть плагины. Это не будет включать все доступные вещи. Но помните: ImageJ-GUI просто вызывает методы от ij.jar для использования дополнительных плагинов, поэтому вы можете сделать то же самое с вашим кодом.
  • Некоторые плагины используют нативный (JNI) код, который может привести к неожиданным ошибкам, когда вы используете это внутри Mathematica
+0

Спасибо за доказательство концепции. На самом деле мне нужно будет сесть и прочитать больше документов, а затем, возможно, задать более конкретные вопросы. –

+0

Я никогда ничего не делал с ImageJ, и, чтобы посмотреть на вещи, заняло всего несколько минут. Поэтому есть хорошие шансы, что ваша кривая обучения будет очень крутой. Возьмите хорошую Java-IDE! Это на полпути. Вы могли бы, конечно, взять вместо этого C++ и использовать ITK. Тогда вы могли бы спросить своих коллег, как быстро настроить вещи ;-) – halirutan

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

  • Нет связанных вопросов^_^