从Mathematica调用ImageJ

Mat*_*sio 8 java wolfram-mathematica image-processing jlink imagej

从Mathematica,我希望将图像传递给ImageJ插件,并将结果从ImageJ发送到Mathematica.

JLink是一个有用的工具,但我既不熟悉也不熟悉ImageJ(很难在SO上利用现有的相关问题).你知道怎么做吗?

(我已经在我的Mac上安装了ImageJ.)

hal*_*tan 5

这应该只是作为预告片向您展示,这并不像看起来那么难.没有办法,你必须熟悉Java,ImageJ-API,是的,JLink.

这里是你如何开始:你需要ImageJ java存档ij.jar,你可以从ImageJ网站下载.这个jar包含ImageJ自己使用的所有类和函数.

你想要做的是创建一个图像,而不是通过ImageJ-GUI打开它,而是使用Java方法.对于这一点,你必须得到熟悉的ImageJ-API知道如何可以从例如创建图像的数字阵列,因为这就是我们想要的数学化图像传输到Java.浏览这个文档让我进入了ImageProcessor类.正如你可以看到他们提供两个方法:setPixelsgetPixels两者接受简单的数组.让我们使用它并编写一个非常基本的过滤器:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

此函数获取图像数据和图像尺寸,进行卷积并返回滤波后的图像数据.要编译它,记住它ij.process.FloatProcessor在里面ij.jar.您必须在类路径中包含此存档.之后,您必须确保JLink同时找到,ij.jar和您的SimpleTest.class.我通常也把我的课打包在一个罐子里.为此,我打电话给它simple.jar.

虽然java-side现在已准备好摇滚,但我们需要几行来从Mathematica-image中提取图像数据和尺寸

img = ColorConvert[ExampleData[{"TestImage", "Lena"}], "Grayscale"];
{nx, ny} = ImageDimensions[img];
data = ImageData[img] // Flatten;
Run Code Online (Sandbox Code Playgroud)

我们现在做的是将平面整数数组发送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]]
Run Code Online (Sandbox Code Playgroud)

通过最后一步,我们完成循环并获得最终结果.

最后的说明:

  • 您应该(也就是"这样做")使用相同的Java版本JLink用于编译代码.
  • 已有插件了ij.jar.这不包括所有可用的东西.但请记住:ImageJ-GUI只是调用方法ij.jar来使用辅助插件,因此您可以对代码执行相同的操作.
  • 当您在Mathematica中使用此插件时,某些插件使用本机(JNI)代码可能会导致意外错误