在 Mathematica 中,我希望将图像传递给 ImageJ 插件,并将结果从 ImageJ 发送到 Mathematica。
JLink 是有用的工具,但我既不熟悉它也不熟悉 ImageJ(很难利用现有的 SO 相关问题)。你知道怎么做吗?
(我已经在我的 Mac 上安装了 ImageJ。)
在 Mathematica 中,我希望将图像传递给 ImageJ 插件,并将结果从 ImageJ 发送到 Mathematica。
JLink 是有用的工具,但我既不熟悉它也不熟悉 ImageJ(很难利用现有的 SO 相关问题)。你知道怎么做吗?
(我已经在我的 Mac 上安装了 ImageJ。)
这应该只是作为向你展示的预告片,这并不像看起来那么难。没有办法,您必须熟悉 Java、ImageJ-API,是的,JLink。
因此,您可以从这里开始:您需要可以从ImageJ 网站ij.jar
下载的 ImageJ java 存档。这个 jar 包含 ImageJ 自己使用的所有类和函数。
您要做的是创建图像,而不是通过 ImageJ-GUI 打开它,而是使用 Java 方法。为此,您必须熟悉 ImageJ-API 以了解如何从例如数字数组创建图像,因为这就是我们希望将 Mathematica 图像传输到 Java 的方式。浏览此文档将我带到ImageProcessor 类。如您所见,它们提供了两种方法:setPixels
andgetPixels
都接受简单的数组。让我们使用它并编写一个非常基本的过滤器:
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]]
通过这最后一步,我们完成了循环并获得最终结果。
最后注意事项:
ij.jar
. This will not include all available stuff. But remember: The ImageJ-GUI just calls methods from ij.jar
to use auxiliary plugins, so you can do the same with your code.