控制已存在的 ImageJ 实例

Controlling already existing instance of ImageJ

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

在我们的实验室中,我们正在使用由 Mathematica 控制的相机拍摄我们的实验照片。我们想将我们的图像显示程序转换为 ImageJ。另一个程序是一个内存大户,而且速度很慢。

根据我的研究,我可以通过编写插件、脚本或宏来实现这一点。我也觉得我写的任何东西都会安装到 ImageJ 中并由默认 GUI 控制。

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

  1. 相机通过现​​有脚本捕捉图像。
  2. 图像捕获脚本要求 ImageJ 显示捕获的图像以及默认 GUI,以便我可以访问默认工具集。
  3. 我可以通过默认 GUI 绘制一些剖面图和直方图。
  4. 将图像移交给 ImageJ 的脚本已关闭,但 ImageJ 上的图像仍然存在。

我已经成功导入了 ImageJ 的 ij class 并使用了它。这是我在 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 windows。 already-运行 imageJ 根本不与它交互。此外,我似乎可以使用 getLog[].

捕获已经 运行 ImageJ 的日志

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

您正在尝试做的事情叫做 inter-process communication。 ImageJ 有一种将信息传递给 运行 实例的机制。转到编辑 ▶ 选项 ▶ 杂项... 并选中 "Run single instance listener" 框。但是,此功能仅限于命令行参数。因此,您可以告诉 运行 实例,例如,通过尝试启动具有所需参数(然后将传递给 运行 实例)的第二个 ImageJ,从磁盘打开图像。但是你不能直接通过电线给它提供像素——你必须将它们写入临时文件。

您最简单的选择是通过 ImageJ 完成所有操作。但这并不是从您当前使用 Mathematica 的场景中跳转的最简单

因此,下一个最简单的事情就是从 Mathematica 启动 ImageJ,并始终与同一 ImageJ 实例通信以执行所有操作。也许你能做到?

如果您必须 与外部启动的 ImageJ 实例通信,您将需要使用我上面提到的 CLI 参数传递方案,或者实施您的 own interprocess communication scheme某种。