我正在浏览ImageJ(.tif图像的堆栈,大约130帧)中的数据集集合,并且我对数据集有问题。这是一系列显微镜图像,每个框架都是上一个上方/下方约3-4微米的平面。当我深入数据集时,光散射使背景更加明亮,因此标本的主要特征是调光器。

但是,ImageJ的亮度和对比功能使用了代表的直方图 全部的 一堆图像。当我在堆栈深处的图像上单击“自动”和“重置”时,最终的对比度是完美的:所有功能都非常好。但是,然后,在堆栈的开始时,大多数功能已经饱和。

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

有帮助吗?

解决方案

开始编写这样的脚本的一种好方法是使用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");

...您应该看到只有Slice 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");
}

(如果您使用的是斐济,则脚本编辑器(例如 File > New > Script)是尝试此类脚本的简便方法。)

当然,使用归一化选项确实会导致更改像素值,这意味着在这种情况下,您正在丢失信息,因此我不会使用生成的堆栈进行定量结果。

我希望那是一种用途。

其他提示

您也可能会考虑使用 CellProfiler 处理图像。即使CP无法直接执行您要做的事情,您实际上也可以从CP运行ImageJ命令,插件和宏。

在最简单的情况下,您可以创建一个CP管道,该管道仅具有loadImages和RuniMageJ。

公认的答案是OP问题的最佳选择,但是一个小的变体是,您是否想将亮度/对比度作为特定数据切片的函数更改。

就我而言,我想产生阈值效果,但是在堆栈的每个切片中,阈值值正在变化。我去了几个不同的切片,并手动找到了阈值。然后,我找到了阈值值(TV)的近似函数,作为切片的函数,如下所示:

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");
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top