ImageJ进阶教程可帮助您提升成像数据分析能力,并完成编程入门。

引言

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

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

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

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

认识宏和编辑器

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

如何实现自动化

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

如何自定义统计指标

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

综合应用

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

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

图像预处理

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

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

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

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

小结

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

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

最后分享下进阶教程中用到的示例数据:
通过百度网盘分享的文件:imagej进阶教程用例数据
链接:https://pan.baidu.com/s/1NoYgrozt4sziRDE2POITUA
提取码:

该部分仅登录用户可见

最后修改:2024 年 09 月 22 日
请大力赞赏以支持本站持续运行!