ImageJ进阶教程

2024-08-12-55-1782907635809.webp ImageJ进阶教程可帮助您提升成像数据分析能力,并完成编程入门。

引言

在搞完基础教程之后,对于要不要继续出一个进阶教程,我是有点犹豫的。因为我希望教程能够帮助更多的人,但是「进阶」往往意味着聚焦到具体的领域,造成其适用性变差。最后可能会变得与网上很多碎片化的教程一样:如果你不做这个细分专业方向,这个教程可能对你毫无帮助。

我想,除了往细分专业方向进阶(主要包括面向具体应用的更复杂的功能和插件的学习),还有一个进阶的方向是掌握一定的编程能力,能够自由地利用脚本,把之前大量手工操作的步骤合并成 「one click run」。我觉得这个是比介绍更具体的各种插件和功能更有价值的事情。

但不得不说,专门教人 ImageJ 编程是不太合适的。ImageJ 的 Macro 并不算是完整编程语言,它只是运行于 ImageJ 内部的一种指令。不过它的优点是包含了面向过程编程的基本思想和最常见的语法,所以借此让用户初步了解编程,是非常合适的。

即便如此,Macro的内容还是非常丰富,我也只能说掌握了一点皮毛。所以这里只能作为一个引路人,结合自己的经历,主要以对点状信号的各种分析,将 ImageJ Macro 编程相关的内容捏碎放入各个完整的实际案例中。

认识宏和编辑器

ImageJ Macro其实非常简单,因为其命令可以通过 Recorder 记录下来,另外很多 builtin-functions,macro examples 可以在官网查到。而且现在借助 AI,写代码也变得更加轻松。所以大家不要一听到编程就犯难,现在真的门槛很低。最重要的是,一旦你掌握了编程核心思想,掌握了 for,if,function这些最基础的东西,你就会发现很多编程语言之间就是方言的关系,再去学学习其他编程语言都会变得轻松。

ImageJ宏脚本:一键出图

本文介绍如何使用ImageJ宏脚本提高图像数据处理的效率。 在 ImageJ 基础教程中,我们要么就是手动点点点,要么就是借助各种固化的功能或者插件来完成图像分析工作。但总有那么些时候我们有一些很独特但很简单的小需求,找不到合适的工具来满足,这个时候就需要写一些简单的 ImageJ Macros了。...

AI辅助ImageJ编程实践

本文以制作colorbar为例展示AI辅助的ImageJ编程实践 当我们使用一些除了红绿蓝黄之外不太常见的伪彩来展示图片时,通常需要附加一个 colorbar。这个 colorbar 也叫做颜色查找表 look up table, LUT ,在 ImageJ 可以很方便地点击 Image Color...

如何实现自动化

很多时候我们无法一步到位把一套手工流程完全转化为自动流程,所以这里可以先尝试对其中部分步骤进行自动化,这样也能提高不少效率。这里面最重要的就是能够把大问题拆解成能够「for循环」处理的子问题。

细胞膜荧光强度半自动统计

现需要分析大量不同条件和时间点的成像数据,其中一个数据基本如下图所示。需要分析每张图中细胞膜上平均信号强度。 由于同一个条件下同一时间点有大量数据,因此不需要做到单细胞,数据量也足够,所以不需要细胞分割,信号强度的单位是 per image。 根据中心极限定理,很容易预估这个信号平均值服从正态分布。...

半自动统计区域内颗粒数量

如果要统计图像中不同区域内的颗粒数量,该怎么做? 在前面我们已经介绍了如何找点(Find Maxima),可以快速获得点的坐标和数量。但那种是对整张图像进行的操作。有些时候,我们希望统计的是感兴趣区域内的颗粒数量。比如统计细胞内的颗粒信号数量。这个时候怎么做呢? 其实 Find Maxima 是支持...

如何自定义统计指标

有些时候我们想统计的指标,ImageJ并没有直接提供,需要我们基于一些基础的信息进行换算。比如这里提供的例子,是要获取图像像素的颜色信息,那么我们可以写成「自定义function」,这样就可以方便地在程序中多次调用和移植。与一段程序类似,清晰地定义函数地输入和输出是非常重要的。

单颗粒坐标与颜色提取

还是上次那张拥有大量颗粒的图像,不同是这次不对颗粒计数,而是统计单颗粒另外两个重要的属性,也就是坐标和数值。 第一版的代码比较简单,这里还是说明一下: requires 是因为不同 ImageJ 版本中,内置函数或者 run 的command 可能不一致,我这段代码仅在这个版本中测试过。 然后中间的...

指定任意颜色作为伪彩

在掌握了RGB与HSB颜色空间转换后,我们可以指定任意颜色作为伪彩。 我们知道一个成像数据可能有多个通道,但是一个通道如果使用最简单的单色伪彩来表示,通常就是选择 RGB 中一个或者两个通道来进行线性映射: R:红色伪彩 G:绿色伪彩 B:蓝色伪彩 RG:黄色伪彩 RB:粉色伪彩(Magenta)...

综合应用

通过前面的例子,基本上已经把 ImageJ Macro Language 中基本的「for循环」、「if条件判断」、「自定义function」语法,还有常用的一些 bultin functions,常用的一些 command都覆盖了。这里就以一个提取单分子荧光强度变化曲线为例,给大家可以看看怎么组合macro,完成一个复杂一点的工作的自动化。

单分子荧光强度变化曲线提取

这里以提取一个视频中单分子荧光信号变化曲线为例,展示以前述ImageJ进阶教程的内容为基础的综合应用。 通常我们想提取一个单分子的荧光变化曲线,手动的做法是选中一个单分子区域后,使用 Image Stacks Plot Z axis Profile 功能,然后就会出来一条曲线,然后保存数据,保存RO...

而掌握了进阶的 ImageJ Macro 编程之后,ImageJ 也能够与其他各种更先进的工具结合,也就是将原本需要手动的一些限速步骤使用第三方工具解决,然后把外部工具的 output 重新作为程序的 input 继续处理。这就是对多种工具的组合应用。在这个方面,我提供了一个通过cellpose代替手工绘制获得细胞轮廓,然后进一步统计细胞膜上的荧光信号强度的例子。

基于cellpose分割结果统计细胞膜荧光强度

本文介绍如何在 cellpose 分割结果的基础上进一步利用 ImageJ 进行后续图像的统计分析。 2024 09 18 89 cellpose能够很好地分割大部分常见的细胞图像,并且保存为ImageJ支持的ROI文件,这使得后续使用 ImageJ 进行自定义的定量分析成为可能。在此例中,还是以细...

图像预处理

前面所有我都只是讲了怎么利用 ImageJ Macro 来对部分操作进行自动化以提升数据分析能力。其实对于图像分析而言,有一个很重要的前置步骤叫做预处理。预处理其实也可以简单分为两类,一类是不改变原始数据数值的,比如选区和阈值分割之类的以聚焦感兴趣的信号。另外一种就是会轻微改变原始数据数值的,比如降噪拟合提升图像质量啥的。

对于图像选区以分析感兴趣的信号,这个部分的基本原则就是得克服人为引入的统计偏见。但不得不说,即便现在出现了很多基于AI的算法,对于感兴趣目标的识别分割,仍然还是专家肉眼更加准确。所以在数据量不大的情况下,掌握一定的图像选区技巧也很重要。在ImageJ基础教程中我仅介绍了菜单栏有的几种典型 Selection例如矩形或者freehand。实际上还可以对这些选区进行编辑,以满足更复杂一点的选区需求。例子如下:

ROI膨胀与环状细胞膜信号测量

本文介绍如何将ROI线条膨胀为环状以满足细胞膜信号测量的需求。 在测量细胞膜信号的时候,我们可以手绘一个细胞轮廓,尽可能经过每个信号点。细胞膜的信号是有一定宽度的,如果能够根据这个闭合轮廓线条进行扩张,以完整包含细胞膜信号,则至少可以节省一半的工作量。 如上图所示,先使用 freehand 工具大致...

ImageJ中编辑选区

这里介绍下 ImageJ中可以对 Selection 进行编辑的操作。 2024 09 18 87 之前尝试自己写 macro 来实现了一个 ROI 的膨胀功能。事实这个功能就是 Edit Selection Make Band ,输入的参数就是 band width。然后就会由内往外得到一个新的环...

获取感兴趣的选区从来都是一个费时费力的事情,因为要让计算机很轻松地理解人类的兴趣是比较困难的。好在现在已经有很多AI模型可供使用,而且几乎所有AI模型进行图像分割都能够导出一张 mask 图像。所以这里也介绍了如何使用一段简单的 macro 将 mask 图像转换为 roi,方便使用 ImageJ 基于AI前处理进行后续的分析。

将AI图像分割mask转换为roi

本文介绍如何使用ImageJ将最常见的AI分割所得到的mask图像转换为ROI,方便后续分析。 图像分割最常见的结果输出形式是 mask。mask 也是一张图像,不过分割后的不同区域,使用不同的数值来表示。比如原图中分割出的第一个细胞区域,在 mask 中这个区域的像素就被全部填充为 1(这就是按...

对于预处理提升图像质量,我认为对于绝大部分同学而言,最重要的还是得靠过硬的实验技术产出高质量数据,而不是预处理。但有些时候再怎么做,能产出的数据质量就到这了,咋办?这个时候,就需要不断参考前人已发表文献进行慎重的预处理,例如滤波平滑等等符合规范的预处理操作,以减少噪声对后续数据分析的影响。这里作为进阶教程,还是可以稍微讲一下,所以我就举了一个以傅里叶为基础的去背景的例子。感兴趣的同学可以自行深入了解强大的傅里叶变换的知识。

傅里叶图像滤波

本文介绍基于傅里叶变换的图像滤波处理 之前展示过一张大肠杆菌的图像,其实是存在一些背景的。这些背景可能是在菌菌在焦面之外运动造成的,会形成一些比较虚散的斑点,不过数量不多。有些情况下,这种少量的背景可能会给「object detection」造成影响,通过基于像素直方分布的 Threshold 难以...

小结

进阶教程终于搞完了。会不会还有高阶教程呢?可以肯定地说,不会。都说了我的定位是「ImageJ引路人」,引路千里,终有一别。而且现在随着AI兴起,使用 python 进行成像数据分析具有更强大更便捷的优势,所以日常工作中,作为以图像分析混口饭吃的我,使用 python编程的时候更多。

不过这不是说我已经完全不用 ImageJ了。事实上,我还是会经常使用 ImageJ 预分析一些数据,还有使用各种丰富的ImageJ插件。因为绝大部分时候没有必要重复造轮子,相比造轮子,学习插件用法的成本要低得多。

最后分享下进阶教程中用到的示例数据:

通过百度网盘分享的文件:imagej进阶教程用例数据

链接:https://pan.baidu.com/s/1NoYgrozt4sziRDE2POITUA

提取码:viua