Это должно служить лишь тизером, чтобы показать вам, что это не так сложно, как кажется.Нет никакого пути, чтобы вы были знакомы с 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