6

我正在查看 ImageJ 中的一组图像数据集(一堆 .tif 图像,大约 130 帧),我的数据集有问题。这是一系列显微镜图像,每一帧都是一个比前一个高/低约 3-4 微米的平面。随着我深入研究数据集,光散射会产生更亮的背景,因此样本的主要特征是较暗的。

然而,ImageJ 的亮度和对比度功能使用表示整个图像堆栈的直方图。当我在堆栈深处的图像上单击“自动”和“重置”时,生成的对比度非常完美:所有功能都非常亮。然而,回到堆栈的开始,大多数功能已经饱和。

我尝试从堆栈中的各个点手动提取一些图像,并分别对每个图像执行亮度和对比度中的自动->重置,然后将它们重新转换为堆栈,它看起来非常可靠。我如何以编程方式(例如使用插件)为整个堆栈执行此操作?相关的 API 调用是什么?

4

3 回答 3

4

开始编写此类脚本的一个好方法是使用 ImageJ 的宏记录器 - 您可以使用Plugins > Macros > Record .... 对于此示例,我假设您已将Record:选项框切换为JavaScript,但如果您更熟悉 ImageJ 宏语言或用 Java 编写插件,则其他选项之一可能是更好的选择。如果您随后打开图像并使用Image > Stacks > Set Slice ...并选择(例如)第 20 片,您应该会看到:

imp.setSlice(20);

...出现在录音机中。现在,如果您运行Image > Adjust > Brightness/Contrast...并选择Auto,您应该在记录器中看到这相当于运行Enhance Contrast保持 0.35% 的饱和像素。正如您所指出的,问题在于这会调整整个堆栈的最小值和最大值,而不仅仅是那个切片。但是,您可以通过运行Enhance Contrast使用不同的选项来运行Process > Enhance Contrast. ImageJ 文档 wiki上有关该选项的部分解释说,如果您想更改像素值而不是设置堆栈的最小值和最大值,则需要选择“标准化”选项。如果我选择这样做,宏记录器会记录:

imp.setSlice(20);
IJ.run(imp, "Enhance Contrast", "saturated=0.35 normalize");

...你应该看到只有第 20 片被改变了。然后,您可以将其包装在一个循环中,该循环在每个切片上运行相同的增强功能:

var imp = IJ.getImage();
var n = imp.getStackSize();

for( var i = 0; i < n; ++i) {
    imp.setSlice(i+1);
    IJ.run(imp, "Enhance Contrast", "saturated=4 normalize");
}

(如果您使用的是 Fiji,那么脚本编辑器(例如 via File > New > Script)是一种尝试此类脚本的简单方法。)

当然,使用 normalize 选项确实会导致像素值被更改,这意味着在这种情况下您会丢失信息,因此我不会将结果堆栈用于定量结果。

我希望这有点用。

于 2011-01-03T21:59:25.223 回答
1

您也可以考虑使用CellProfiler来处理图像。即使 CP 无法直接执行您想要执行的操作,您实际上也可以从 CP 运行 ImageJ 命令、插件和宏。

在最简单的情况下,您可以创建一个只有 LoadImages 和 RunImageJ 的 CP 管道。

于 2011-09-30T19:35:41.390 回答
0

接受的答案是 OP 问题的最佳答案,但如果您想根据特定数据的切片更改亮度/对比度,则有一个小变种。

在我的情况下,我想要一个阈值效果,但阈值在堆栈的每个切片中都在变化。我去了几个不同的切片并手动找到了阈值。然后,我找到了阈值 (Tv) 作为切片 (s) 的函数的近似函数,如下所示:

Tv=4000/s-17

因此,然后我的脚本变为:

importClass(Packages.ij.IJ);

var imp = IJ.getImage();
var n = imp.getStackSize();
var miny,maxy;

for( var i = 1; i < n+1; ++i) {
    imp.setSlice(i);
    miny=parseInt(4000/i-17);
    maxy=miny+5;
    IJ.setMinAndMax(imp, miny, maxy);
    IJ.run(imp, "Apply LUT", "slice");
}
于 2017-05-03T21:26:01.217 回答