我正在查看ImageJ中的一组图像(一堆.tif图像,约130个帧),我对数据集有一个问题。这是一系列的显微镜图像,每一帧都是一个平面,大约在上面/下3-4微米。当我深入到数据集中时,光散射会使背景变得更亮,所以样本的主要特征更加模糊。
然而,ImageJ的亮度和对比度特性使用了代表整个图像堆栈的直方图。当我在堆栈的深处点击“自动”和“重置”图像时,产生的对比是完美的:所有的功能都会很好地发光。然而,在堆栈开始时,大多数特性已经饱和。
我试着从堆栈中的各个点手工提取几幅图像,并分别对每个点执行“自动>重置”亮度和对比度,然后再将它们转换为堆栈,并且看起来非常可靠。如何以编程方式(例如,使用插件)对整个堆栈执行此操作?相关的API调用是什么?
发布于 2011-01-03 21:59:25
开始编写这样一个脚本的一个好方法是使用ImageJ的宏记录器--您可以从Plugins > Macros > Record ...
开始。对于这个例子,我假设您已经将Record:
选项框切换到了JavaScript
,但是如果您更熟悉ImageJ宏语言或编写ImageJ插件,那么其他选项可能是更好的选择。如果然后打开图像并使用Image > Stacks > Set Slice ...
并选择(例如)片20,您应该会看到:
imp.setSlice(20);
..。出现在录音机里。现在,如果您运行Image > Adjust > Brightness/Contrast...
并选择Auto
,您应该会在记录器中看到,这相当于运行保持0.35%饱和像素的Enhance Contrast
。正如您已经注意到的,这样做的问题是,这将调整整个堆栈的最小值和最大值,而不仅仅是该部分。但是,您可以通过运行Enhance Contrast
来运行具有不同选项的Process > Enhance Contrast
。ImageJ文档维基上关于该选项的部分解释说,如果您想要更改像素值,而不是设置堆栈的最小值和最大值,则需要选择“正常化”选项。如果我选择这样做,宏记录器记录:
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选项确实会导致像素值被更改,这意味着在本例中您正在丢失信息,所以我不会将结果堆栈用于定量结果。
我希望这有什么用。
发布于 2011-09-30 19:35:41
您还可以考虑使用CellProfiler来处理图像。即使CP不能完全完成您想要做的事情,您也可以从CP运行ImageJ命令、插件和宏。
最简单的是,您可以创建一个只有LoadImages和RunImageJ的CP管道。
发布于 2017-05-03 21:26:01
对于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");
}
https://stackoverflow.com/questions/4473768
复制相似问题