我知道编辑这个网站吗?
the Fiji distribution of ImageJ本页介绍与 the Fiji distribution of ImageJ 相关的内容。点击徽标查看详情。

脚本工具箱

此页面旨在提供小代码片段作为编写脚本的起点。

See also:

💡

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);
}