ImageJ毕竟不是编程语言,其目标用户也大概率不会编程,所以提供了宏录制的功能。只需点击Plugins->Macros->Record,即可弹出Recoder窗口,如下图所示
接下来,无论在ImageJ中做什么操作,均会记录在Recorder窗口中。在窗口工具栏,Record后可选择录制语言,默认是Macro,即ImageJ的宏语言,特点是比较简洁。下面回顾一下图像处理时的基础操作:转灰度并查看直方图。其顺序为如下
这样,在Recorder窗口中就会出现如下代码
selectImage("lena.jpg");
run("8-bit");
run("Histogram");
由于我们希望处理的是当前活动的图像,而非仅仅针对lena图,所以将第一行删掉。然后点击Create按钮,就会出现代码调试窗口,当前编辑文件默认名字是Macro.jim。
此时,关闭lena图和直方图,然后重新打开lena图,再点击代码调试窗口中的run按钮,则会复现刚刚的工作,效果如下
除了Macro脚本之外,ImageJ还提供了四种编程语言,对于有下面几种编程经验的程序员来说,显然更加友好。
Java
首先,ImageJ是java开发的,所以支持java是理所当然的,录制转灰度、画直方图这两部操作,转到代码编辑窗口后,生成的代码如下
import ij.*;
import ij.process.*;
import ij.gui.*;
import java.awt.*;
import ij.plugin.*;
public class My_Plugin implements PlugIn {
public void run(String arg) {
ImagePlus imp = IJ.getImage();
IJ.run(imp, "8-bit", "");
IJ.run(imp, "Histogram", "");
}
}
BeanShell
BeanShell,是一种符合Java语法规范的脚本语言,即其语法几乎与Java一致,但不用遵循面向对象编程的规范,所以写起来十分灵活,示例如下
import ij.*;
imp = IJ.getImage();
IJ.run(imp, "8-bit", "");
IJ.run(imp, "Histogram", "");
Python
Python是在科学计算和图像处理领域应用最广的语言,而且凭借其胶水特性,几乎是哪都有它。但在ImageJ中录制宏的时候,还是有一点小坑,首先生成的代码后面会被加上分号,尽管ImageJ貌似支持这种语法,但显然不符合Python的语法规范;其二则是不会自动导入ij模块,需要手动添加一下。
from ij import IJ
imp = IJ.getImage()
IJ.run(imp, "8-bit", "")
IJ.run(imp, "Histogram", "")
JavaScript
最后,ImageJ还支持JavaScript的代码录制,以争取广大的前端程序员。但和Python类似,出现了不导入模块的问题,最终可运行代码示例如下。
importClass(Packages.ij.IJ);
imp = IJ.getImage();
IJ.run(imp, "8-bit", "");
IJ.run(imp, "Histogram", "");
可以发现,这四种脚本语言,尽管语法并不完全一致,但所涉及到的转灰度、调用直方图等操作用到的函数是完全一致的。在后续的教程里,如无例外,将只演示其中一种编程语言。