ImageJ亮度&对比一堆图像

时间:2010-12-17 18:43:52

标签: java image-processing imagej

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

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

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

3 个答案:

答案 0 :(得分: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 ContrastImageJ 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");
}

(如果你正在使用斐济,那么脚本编辑器(例如通过File > New > Script)是试验这些脚本的简单方法。)

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

我希望有一些用处。

答案 1 :(得分:1)

您也可以考虑使用CellProfiler来处理图片。即使CP无法完全按照您要直接执行的操作,您也可以从CP运行ImageJ命令,插件和宏。

最简单的方法是,你可以创建一个只有LoadImages和RunImageJ的CP管道。

答案 2 :(得分:0)

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