这应该只是作为向您展示的预告片,这并不像看起来那么难。没有办法,您必须熟悉 Java、ImageJ-API,当然还有 JLink。
您可以从这里开始:您需要 ImageJ java 存档ij.jar,您可以从the ImageJ Website 下载它。这个 jar 包含 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-archives,一种方法是调用 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]]
通过最后一步,我们完成了循环并获得最终结果。
最后说明:
- 您或许应该(这意味着“做”)使用 JLink 用于编译代码的相同 java 版本。
-
ij.jar 中已有插件。这将不包括所有可用的东西。但请记住:ImageJ-GUI 只是调用来自 ij.jar 的方法来使用辅助插件,因此您可以对您的代码执行相同的操作。
- 某些插件使用本机 (JNI) 代码,当您在 Mathematica 中使用它时,可能会导致意外错误