Это должно служить только тизер, чтобы показать вам, что это не так сложно, как кажется. Нет никакого способа, чтобы вы были знакомы с 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
Предположительно вы должны прочитать ImageJ API для начинающих. Не могли бы вы привести пример проблемы, для которой нужно использовать ImageJ? Здесь есть несколько участников Mathematica, которые являются экспертами в области обработки изображений и могут предлагать собственные методы Mathematica. Вы также можете рассмотреть публикацию здесь: http://mathematica.stackexchange.com/questions –
Можете ли вы привести пример (простой!) Пример Java-кода, который демонстрирует, как использовать ImageJ? Это первый шаг. Затем мы можем перевести этот код в JLink. – Szabolcs
@MikeHoneychurch Хорошая идея, я перейду, если ничего не придет сюда. Меня интересуют плагины ImageJ, которые не находятся в Mathematica. –