Вызов ImageJ от Mathematica - PullRequest
       36

Вызов ImageJ от Mathematica

8 голосов
/ 02 февраля 2012

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

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

(Я уже установил ImageJ на моем Mac.)

1 Ответ

5 голосов
/ 03 февраля 2012

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

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

То, что вы хотите сделать, это создать изображение не открывая его через ImageJ-GUI, а используя Java-методы.Для этого вам необходимо ознакомиться с ImageJ-API, чтобы узнать, как можно создать изображение, например, из массива чисел, потому что именно так мы хотим перенести Mathematica-изображения в Java.Пролистав эту документацию, я познакомился с классами ImageProcessor .Как вы можете видеть, они предоставляют два метода: 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-image

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
...