控制已存在的ImageJ

时间:2015-10-08 18:39:57

标签: java wolfram-mathematica imagej jlink

首先,我不是很精通Java。事实上,我正在使用JLink / Mathematica来做我想做的事。

在我们的实验室中,我们正在使用Mathematica控制的相机拍摄我们的实验照片。我们想将图像显示程序转换为ImageJ。另一个程序是记忆猪,它很慢。

从我的研究中,我可以通过编写插件,脚本或宏来实现这一点。我的印象是,无论我写什么,都会被安装到ImageJ中,并由默认的GUI控制。

我的问题是,我可以编写一个外部程序来控制已经运行的ImageJ实例吗?理想情况下,事件的顺序是。

  1. 相机通过已有的脚本捕获图像。
  2. 图像捕获脚本要求ImageJ显示捕获的图像以及默认GUI,以便我可以访问默认工具集。
  3. 我可以通过默认的GUI执行一些配置文件绘图和直方图。
  4. 将图像移交给ImageJ的脚本已关闭,但ImageJ上的图像仍然保留。
  5. 我已成功导入ImageJ的ij类并使用它。这是我尝试在ImageJ中创建图片。它位于Mathematica的JLink中,但它可以完全转换为Java。

    Needs["JLink`"];
    InstallJava[];
    AddToClassPath["C:\\Program Files\\ImageJ\\ij.jar"];
    ijClass = LoadJavaClass["ij.IJ"];
    imagePlusClass = LoadJavaClass["ij.ImagePlus"];
    JavaNew[imagePlusClass, "My New Image", 
      JavaNew["ij.process.ByteProcessor", 400, 400]]@show[]
    ij`IJ`log["test"];
    ij`IJ`getLog[]
    

    然而,创建的图像是在某种Java窗口中。已经运行的imageJ根本不与它交互。此外,我似乎可以使用getLog []来捕获已经运行的ImageJ的日志。

    同样,问题是,我可以使用未安装在ImageJ中的外部脚本作为插件,脚本或宏来在已经运行的ImageJ上显示图像吗?或者,我可以使用外部脚本在已经运行的ImageJ实例上调用预安装的宏吗?

1 个答案:

答案 0 :(得分:0)

您要做的是inter-process communication。 ImageJ有一种将信息传递给正在运行的实例的机制。转到编辑▶选项▶其他...并选中“运行单个实例监听器”框。但是,此功能仅限于命令行参数。因此,您可以通过尝试使用所需的参数启动第二个ImageJ(然后将其传递给正在运行的实例)来告诉正在运行的实例,例如,从磁盘打开图像。但你不能直接通过电线输入像素 - 你必须将它们写入临时文件。

您最简单的选择是通过ImageJ完成所有事情。但是,混合使用Mathematica并不是当前场景中的最简单跳跃。

因此,下一个最简单的事情是从Mathematica启动ImageJ,并始终与ImageJ的同一个实例进行通信以完成所有操作。也许你可以这样做?

如果必须与外部启动的ImageJ实例进行通信,则需要使用上面提到的CLI参数传递方案,或者实现某种类型的own interprocess communication scheme