ImageJ亮度和对比度在图像堆栈上的应用

6
我正在使用ImageJ查看一组图像数据集(.tif格式的130帧图像堆栈),并且我遇到了问题。这是一系列显微镜图像,每个帧都是前一个帧上下3-4微米的平面。随着我深入数据集,光散射会导致背景更亮,因此样本的主要特征变得更暗。
然而,ImageJ的亮度和对比度功能使用表示整个图像堆栈的直方图。当我在堆栈中深入单击“自动”和“重置”时,得到的对比度非常完美:所有特征都非常鲜明。但是,回到堆栈的开头后,大多数特征已经过饱和。
我尝试手动从堆栈的各个点提取几个图像,并在每个图像上执行亮度和对比度中的自动->重置操作,然后重新将它们转换为堆栈,结果非常可靠。如何以编程方式(例如,使用插件)对整个图像堆栈执行此操作?哪些API调用是相关的?
3个回答

4
开始编写此类脚本的好方法是使用ImageJ的宏记录器 - 您可以通过插件 > 宏 > 记录...启动。对于此示例,假设您已将记录:选项框切换为JavaScript,但如果您更熟悉ImageJ宏语言或使用Java编写插件,则其他选项可能更合适。然后打开您的图像并使用图像 > 堆栈 > 设置层...并选择(例如)第20层,您应该会看到:
imp.setSlice(20);

......会出现在录制器中。现在如果你运行 图像 > 调整 > 亮度/对比度... 并选择 自动,你应该能在录制器中看到这相当于运行 增强对比度 并保持0.35%饱和像素。正如你所指出的问题,这样调整的是整个堆栈的最小和最大值,而不仅仅是那一层。但是,你可以通过运行 处理 > 增强对比度 来使用不同的选项来运行 增强对比度。在ImageJ documentation 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,那么脚本编辑器(例如通过文件>新建>脚本)是尝试这些脚本的简单方法。
当然,使用规范化选项确实会导致像素值被改变,这意味着在这种情况下您会失去信息,因此我不会将结果堆栈用于定量结果。
希望这对您有所帮助。

这差不多就是我得出的结果;需要进行一些调试,但最终找到了方法。非常感谢! :) - Magsol

1

你也可以考虑使用CellProfiler来处理这些图像。即使CP不能直接完成你想要的功能,你实际上可以从CP中运行ImageJ命令、插件和宏。

最简单的方法是创建一个只包含LoadImages和RunImageJ的CP流程。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接