首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ImageJ亮度&一堆图像的对比度

ImageJ亮度&一堆图像的对比度
EN

Stack Overflow用户
提问于 2010-12-17 18:43:51
回答 3查看 20.4K关注 0票数 6

我正在查看ImageJ中的一组图像(一堆.tif图像,约130个帧),我对数据集有一个问题。这是一系列的显微镜图像,每一帧都是一个平面,大约在上面/下3-4微米。当我深入到数据集中时,光散射会使背景变得更亮,所以样本的主要特征更加模糊。

然而,ImageJ的亮度和对比度特性使用了代表整个图像堆栈的直方图。当我在堆栈的深处点击“自动”和“重置”图像时,产生的对比是完美的:所有的功能都会很好地发光。然而,在堆栈开始时,大多数特性已经饱和。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-03 21:59:25

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

代码语言:javascript
运行
复制
imp.setSlice(20);

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

代码语言:javascript
运行
复制
imp.setSlice(20);
IJ.run(imp, "Enhance Contrast", "saturated=0.35 normalize");

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

代码语言:javascript
运行
复制
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选项确实会导致像素值被更改,这意味着在本例中您正在丢失信息,所以我不会将结果堆栈用于定量结果。

我希望这有什么用。

票数 4
EN

Stack Overflow用户

发布于 2011-09-30 19:35:41

您还可以考虑使用CellProfiler来处理图像。即使CP不能完全完成您想要做的事情,您也可以从CP运行ImageJ命令、插件和宏。

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

票数 1
EN

Stack Overflow用户

发布于 2017-05-03 21:26:01

对于OP的问题,公认的答案是最好的,但是一个小的变化是,如果您想要改变亮度/对比度作为特定数据切片的函数。

在我的例子中,我希望有一个阈值效应,但是在堆栈的每个片段中,阈值都在变化。我去了几个不同的切片,并手动找到了阈值。然后,我找到了阈值(Tv)作为切片函数的近似函数,如下所示:

代码语言:javascript
运行
复制
Tv=4000/s-17

因此,我的脚本变成:

代码语言:javascript
运行
复制
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");
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4473768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档