从Mathematica,我希望将图像传递给ImageJ插件,并将结果从ImageJ发送到Mathematica。
JLink是一个有用的工具,但我既不熟悉它也不熟悉ImageJ(很难在SO上利用现有的相关问题)。你知道怎么做吗?
(我已经在我的Mac上安装了ImageJ。)
答案 0 :(得分:5)
这应该只是作为预告片向您展示,这并不像看起来那么难。没有办法,你必须熟悉Java,ImageJ-API,是的,JLink。
以下是您的入门指南:您需要可以从the ImageJ Website下载的ImageJ java存档ij.jar
。这个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-side现在已准备好摇滚,但我们需要几行来从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]]
通过最后一步,我们完成循环并获得最终结果。
最终说明:
ij.jar
中已有插件。这不包括所有可用的东西。但请记住:ImageJ-GUI只调用ij.jar
中的方法来使用辅助插件,因此您可以对代码执行相同的操作。