Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Mathematica调用ImageJ_Java_Image Processing_Wolfram Mathematica_Imagej_Jlink - Fatal编程技术网

Java 从Mathematica调用ImageJ

Java 从Mathematica调用ImageJ,java,image-processing,wolfram-mathematica,imagej,jlink,Java,Image Processing,Wolfram Mathematica,Imagej,Jlink,从Mathematica,我希望将图像传递给ImageJ插件,并将结果从ImageJ发送给Mathematica JLink是一个有用的工具,但我既不熟悉它,也不熟悉ImageJ(因此很难利用现有的相关问题)。你知道怎么做吗 (我已经在我的mac电脑上安装了ImageJ。)这应该只是一个提示,告诉你这并不像看上去那么难。没有办法,您必须熟悉Java、ImageJ API以及JLink 下面是您的入门指南:您需要ImageJJava存档ij.jar,可以从中下载。这个jar包含ImageJ自己使用

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

JLink是一个有用的工具,但我既不熟悉它,也不熟悉ImageJ(因此很难利用现有的相关问题)。你知道怎么做吗


(我已经在我的mac电脑上安装了ImageJ。)

这应该只是一个提示,告诉你这并不像看上去那么难。没有办法,您必须熟悉Java、ImageJ API以及JLink

下面是您的入门指南:您需要ImageJJava存档
ij.jar
,可以从中下载。这个jar包含ImageJ自己使用的所有类和函数

您要做的是创建一个映像,而不是通过ImageJ GUI打开它,而是使用Java方法。为此,您必须熟悉ImageJ API,以了解如何从数字数组创建图像,因为这就是我们希望将Mathematica图像传输到Java的方式。 浏览一下这些文档,我就明白了。如您所见,它们提供了两种方法:
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;
我们现在要做的是将平面整数数组
数据
发送到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]]
通过这最后一步,我们完成了这个循环,并得到了最终结果

最后注释:

  • 您可能应该(这意味着“做到”)使用JLink用于编译代码的相同java版本
  • ij.jar中已经有插件了。这将不包括所有可用的东西。但是请记住:imagejgui只是从
    ij.jar
    调用方法来使用辅助插件,因此您可以对代码执行同样的操作
  • 一些插件使用本机(JNI)代码,当您在Mathematica中使用此代码时,可能会导致意外错误

您可能需要先阅读ImageJ API。您能举一个您需要使用ImageJ解决的问题的例子吗?这里有几个Mathematica参与者,他们是图像处理方面的专家,可能能够建议Mathematica的本地方法。您可能还想考虑在这里张贴:您能给出一些(简单的)示例java代码,演示如何使用Image J吗?这是第一步。然后我们就可以把代码翻译成JLink了。@MikeHoneychurch好主意,如果这里什么都没出现,我就过关了。我对Mathematica中没有的ImageJ插件感兴趣。@Szabolcs这是问题的一部分。。。似乎可以有不同类型的ImageJ插件。我仍然需要弄清楚如何以编程的方式调用它们。如果你对此进行了研究,也许你可以在这里给出一个答案:谢谢你的概念证明。事实上,我需要坐下来读更多的文档,然后可能会问更具体的问题。我也从来没有对ImageJ做过任何事情,只花了几分钟的时间来查找这些内容。因此,你的学习曲线很可能非常陡峭。使用一个好的JavaIDE!这是一半。当然,你可以选择C++,使用ITK。然后,你可以问你的同事如何快速设置;-)