此页面旨在提供小代码片段作为编写脚本的起点。
See also:
- Scripting overview for a list of available scripting languages.
- Scripting comparisons to compare and contrast the languages.
- Broadly Applicable Routines, a curated collection of snippets.
- Albert Cardona’s comprehensive Fiji Jython tutorial (please note that it is a better idea to contribute tutorials to the ImageJ Wiki directly).
To copy the snippets, mouse over the code and click the Copy button that appears.
使用 ImageJ 打开图像
宏
path = "/path/to/file";
open(path);
JavaScript
importClass(Packages.ij.IJ);
var path = "/path/to/file";
var imp = IJ.openImage(path);
imp.show();
#### Python
from ij import IJ
path = "/path/to/file"
imp = IJ.openImage(path)
imp.show()
红宝石
include_class 'ij.IJ'
path = "/path/to/file"
imp = ij.IJ.openImage(path)
imp.show
Clojure
(import 'ij.IJ)
(let [path "/path/to/file"
imp (IJ/openImage path)]
(.show imp))
豆壳
import ij.IJ;
path = "/path/to/file";
imp = IJ.openImage(path);
imp.show();
使用生物格式打开图像
宏
path = "/path/to/file";
run("Bio-Formats Importer", "open=" + path + " autoscale color_mode=Default view=Hyperstack stack_order=XYCZT");
JavaScript
importClass(Packages.loci.plugins.BF);
var path = "/path/to/file";
var imps = BF.openImagePlus(path);
imps[0].show();
或者,有更多选项:
importClass(Packages.loci.plugins.BF);
importClass(Packages['loci.plugins.in.ImporterOptions']); // 'in' is a reserved word, hence the different syntax
importClass(Packages.loci.common.Region);
var path = "/path/to/file";
var options = new ImporterOptions();
options.setId(path);
options.setAutoscale(true);
options.setCrop(true);
options.setCropRegion(0, new Region(x, y, w. h));
options.setColorMode(ImporterOptions.COLOR_MODE_COMPOSITE);
var imps = BF.openImagePlus(options);
imps[0].show();
####Python
另请参见this python example script
-
红宝石
-
Clojure
-
豆壳
打开、处理和保存文件夹中的一系列文件
宏
input = getDirectory("Input directory");
output = getDirectory("Output directory");
Dialog.create("File type");
Dialog.addString("File suffix: ", ".tif", 5);
Dialog.show();
suffix = Dialog.getString();
processFolder(input);
function processFolder(input) {
list = getFileList(input);
for (i = 0; i < list.length; i++) {
if(File.isDirectory(list[i]))
processFolder("" + input + list[i]);
if(endsWith(list[i], suffix))
processFile(input, output, list[i]);
}
}
function processFile(input, output, file) {
// do the processing here by replacing
// the following two lines by your own code
print("Processing: " + input + file);
open(input + file);
print("Saving to: " + output);
saveAs("/formats/tiff", output+file);
close();
}
另请参阅教程 How to apply a common operation to a complete directory。
#### Python
import os
from ij import IJ, ImagePlus
from ij.gui import GenericDialog
def run():
srcDir = IJ.getDirectory("Input_directory")
if not srcDir:
return
dstDir = IJ.getDirectory("Output_directory")
if not dstDir:
return
gd = GenericDialog("Process Folder")
gd.addStringField("File_extension", ".tif")
gd.addStringField("File_name_contains", "")
gd.addCheckbox("Keep directory structure when saving", True)
gd.showDialog()
if gd.wasCanceled():
return
ext = gd.getNextString()
containString = gd.getNextString()
keepDirectories = gd.getNextBoolean()
for root, directories, filenames in os.walk(srcDir):
for filename in filenames:
# Check for file extension
if not filename.endswith(ext):
continue
# Check for file name pattern
if containString not in filename:
continue
process(srcDir, dstDir, root, filename, keepDirectories)
def process(srcDir, dstDir, currentDir, fileName, keepDirectories):
print "Processing:"
# Opening the image
print "Open image file", fileName
imp = IJ.openImage(os.path.join(currentDir, fileName))
# Put your processing commands here!
# Saving the image
saveDir = currentDir.replace(srcDir, dstDir) if keepDirectories else dstDir
if not os.path.exists(saveDir):
os.makedirs(saveDir)
print "Saving to", saveDir
IJ.saveAs(imp, "Tiff", os.path.join(saveDir, fileName));
imp.close()
run()
-
JavaScript
-
红宝石
-
Clojure
-
豆壳
等待给定的时间,或者直到用户按下“确定”
宏
wait(100);
或者
waitForUser();
JavaScript
Thread.sleep(100);
或者
new WaitForUserDialog("Action required", "Please press OK when done.").show();
-
蟒蛇
-
红宝石
-
Clojure
-
豆壳
从 ROI 管理器中选择多个 ROI 并将它们组合起来
宏
roiManager("select", newArray(0,2,4));
roiManager("AND");
JavaScript
importClass(Packages.ij.plugin.frame.RoiManager);
rm = RoiManager.getInstance();
rm.setSelectedIndexes([0,2,4]);
rm.runCommand("AND");
#### Python
from ij.plugin.frame import RoiManager
rm = RoiManager.getInstance()
rm.setSelectedIndexes([0, 2, 4])
rm.runCommand("AND")
豆壳
import ij.plugin.frame.RoiManager;
rm = RoiManager.getInstance();
rm.setSelectedIndexes(new int[] { 0, 2, 4});
rm.runCommand("AND");
-
红宝石
-
Clojure
解锁图像
有时,当您尝试以某种方式处理图像时,会出现问题,您看到的只是“blabla.jpg 已锁定”。然后你所能做的就是强制解锁图像,如下所示:
豆壳
IJ.getImage().unlock();
脚本编写SIFT
当尝试找到大图像的匹配部分时,尺度不变特征变换提出了一种相对强大的方法来降低复杂性。斐济有该算法的实现,您可以像这样使用:
豆壳
import java.util.ArrayList;
import mpicbg.ij.SIFT;
import mpicbg.imagefeatures.Feature;
import mpicbg.imagefeatures.FloatArray2DSIFT;
param = new FloatArray2DSIFT.Param();
sift = new SIFT(new FloatArray2DSIFT(param));
features = new ArrayList();
// ''ip'' refers to an ImageProcessor
sift.extractFeatures(ip, features);
// print coordinates
for (Feature feature : features)
print("x: " + feature.location[0] + ", y: " + feature.location[1]);
欲了解更多信息,请浏览Javadoc of the Feature class。
使用 JFreeChart 绘制图表
JFreeChart是一个用于创建各种图表的Java库。您可以将图表创建为交互式 JFrame,将其显示为 ImagePlus,或将其写入 SVG 格式。
JavaScript
/* JavaScript to test JFreeChart functionality */
importPackage(Packages.org.jfree.chart);
importPackage(Packages.org.jfree.chart.plot);
importPackage(Packages.org.jfree.chart.axis);
importPackage(Packages.org.jfree.chart.encoders);
importPackage(Packages.org.jfree.chart.renderer.category);
importPackage(Packages.java.awt);
importPackage(Packages.java.awt.geom);
importPackage(Packages.java.io);
importPackage(Packages.org.jfree.ui);
importPackage(Packages.org.jfree.data.category);
importPackage(Packages.org.jfree.data.statistics);
importPackage(Packages.org.apache.batik.dom);
importPackage(Packages.org.apache.batik.svggen);
var dataset = new DefaultStatisticalCategoryDataset();
// dataset.add(Mean, StdDev, "Series", "Condition")
dataset.add(15.0, 2.4, "Row 1", "Column 1");
dataset.add(15.0, 4.4, "Row 1", "Column 2");
dataset.add(13.0, 2.1, "Row 1", "Column 3");
dataset.add(7.0, 1.3, "Row 1", "Column 4");
dataset.add(2.0, 2.4, "Row 2", "Column 1");
dataset.add(18.0, 4.4, "Row 2", "Column 2");
dataset.add(28.0, 2.1, "Row 2", "Column 3");
dataset.add(17.0, 1.3, "Row 2", "Column 4");
var chart = ChartFactory.createLineChart(
null, // chart title
"Treatment", // domain axis label
"Measurement", // range axis label
dataset, // data
PlotOrientation.VERTICAL, // orientation
false, // include legend
true, // tooltips
false // urls
);
// set the background color for the chart...
chart.setBackgroundPaint(Color.white);
var plot = chart.getPlot();
plot.setBackgroundPaint(Color.white);
plot.setRangeGridlinesVisible(false);
plot.setAxisOffset(RectangleInsets.ZERO_INSETS);
// customise the range axis...
var rangeAxis = plot.getRangeAxis();
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
rangeAxis.setAutoRangeIncludesZero(true);
rangeAxis.setRange(0, 40);
// customise the renderer...
var renderer = new StatisticalBarRenderer();
renderer.setErrorIndicatorPaint(Color.black);
renderer.setSeriesOutlinePaint(0,Color.black);
renderer.setSeriesOutlinePaint(1,Color.black);
renderer.setSeriesPaint(0,Color.black);
renderer.setSeriesPaint(1,Color.white);
renderer.setItemMargin(0.0);
plot.setRenderer(0,renderer);
renderer.setDrawBarOutline(true);
bi = chart.createBufferedImage(600, 400);
imp = new ImagePlus("Chart Test", bi);
imp.show();
// Create SVG image
// Get a DOMImplementation and create an XML document
var domImpl = GenericDOMImplementation.getDOMImplementation();
var document = domImpl.createDocument(null, "svg", null);
// Create an instance of the SVG Generator
var svgGenerator = new SVGGraphics2D(document);
// draw the chart in the SVG generator
var bounds = new Rectangle(600, 400);
chart.draw(svgGenerator, bounds);
var dir = IJ.getDirectory("Where should the svg file be saved?");
// Write svg file
var svgFile = new File(dir + "test.svg");
var outputStream = new FileOutputStream(svgFile);
var out = new OutputStreamWriter(outputStream, "UTF-8");
svgGenerator.stream(out, true /* use css */);
outputStream.flush();
outputStream.close();
使用 JavaCV 写出电影文件
JavaCV 是 OpenCV 和 FFMPEG 的 Java 包装器。您必须将库解压到 Fiji 安装的 lib/<platform>/ 文件夹中(例如 Fiji.app/lib/linux64/),以便让 JavaCV 找到本机库(例如,将 ffmpeg-macosx-x86_64.jar 的 .dylib 文件直接解压到 Fiji.app/lib/macosx/ 中)在启动 Fiji 之前。
豆壳
/*
* A simple example how to write out a movie from a possibly virtual
* image stack using JavaCV.
*
* Licensed under CC-BY-SA 4.0
* by Johannes Schindelin on September 16th, 2014
*/
path = "/tmp/change-this-name.flv";
frameRate = 25.0;
videoBitrate = 400 * 1000;
// if you have not installed JavaCV into your jars/ directory:
import java.io.File;
binDir = new File(System.getProperty("user.home")
+ "/downloads/javacv-bin/");
if (binDir.isDirectory()) {
jars = binDir.list();
for (String jar : jars) {
if (jar.endsWith(".jar")) {
addClassPath(new File(binDir, jar).getPath());
}
}
}
// use JavaCV to write out the currently active 3D image
import ij.IJ;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacpp.opencv_core.IplImage;
void saveImageAsMovie(image, path, frameRate, videoBitrate) {
if (image == null) {
IJ.error("No active image!");
return;
}
width = image.getWidth();
height = image.getHeight();
stack = image.getStack();
recorder = FFmpegFrameRecorder.createDefault(path,
(int) width, (int) height);
recorder.setFormat("flv");
recorder.setFrameRate(frameRate);
recorder.setVideoBitrate(videoBitrate);
recorder.start();
for (slice = 1; slice <= stack.getSize(); slice++) {
ip = stack.getProcessor(slice);
recorder.record(IplImage.createFrom(ip.getBufferedImage()));
}
recorder.stop();
recorder.release();
}
try {
saveImageAsMovie(IJ.getImage(), path, frameRate, videoBitrate);
} catch (Throwable t) {
IJ.handleException(t);
}