在Mathematica中,我希望将图像传递给ImageJ插件,并将结果从ImageJ发送到Mathematica。
JLink是有帮助的工具,但我既不熟悉它,也不熟悉ImageJ (这使得我很难在SO上利用现有的相关问题)。你知道怎么做吗?
(我已经在我的苹果电脑上安装了ImageJ。)
发布于 2012-02-03 14:59:11
这应该只是为了向你展示,这并不像它看起来那么难。没有办法,你必须熟悉Java,ImageJ,是的,还有JLink。
下面是如何开始的:您需要可以从the ImageJ Website下载的ImageJ java归档ij.jar。这个jar包含ImageJ自己使用的所有类和函数。
您要做的是创建一个映像,而不是通过ImageJ-GUI打开它,而是使用Java方法。为此,您必须熟悉ImageJ-API,以了解如何从数字数组创建图像,因为这就是我们想要将Mathematica- image转换为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]]有了这最后一步,我们完成了这个循环,并得到了最终的结果。
结束语:
ij.jar中已经有了插件。这不会包括所有可用的内容。但是请记住:ImageJ只是调用ij.jar中的方法来使用辅助插件,所以您可以对您的代码执行相同的操作。https://stackoverflow.com/questions/9107889
复制相似问题