生物图像处理的新进展,如目标分割,跟踪1机器学习框架使研究人员能够提取更多的信息,并对图像数据提出更多的问题。这些创新越来越多地用Python编程语言编写,利用其广泛的软件库(例如NumPy2和SciPy3.),以及对不同编程熟练程度的研究人员的易用性。随着Python软件库多年来不断发展以满足新的图像处理需求,ImageJ也是如此——一个基于java的开源软件包和平台,广泛用于科学图像分析。ImageJ允许研究人员执行各种图像处理和分析任务,如边缘检测、平铺图像拼接、物体和细胞谱系跟踪;骨骼化等形态学操作;以及各种数据预测。所有这些操作都可以组合在一起,以宏和脚本的形式构建复杂的工作流。此外,ImageJ的功能通过使用插件得到了扩展——这些新功能是用Java编写的,可以直接从ImageJ访问,能够将尖端技术引入ImageJ平台。ImageJ支持一个活跃的软件开发人员社区,他们生产和维护这三种扩展类型,近年来这些扩展类型包含了深度学习功能4

不幸的是,基于java和基于python的程序不能一起工作或无缝共享数据。如果无法在Python和ImageJ之间轻松交换数据,则必须在各自的环境中重新实现特性或构建目标包装器;这是不可扩展的。跨两种语言的社区需要一个桥梁,以实现无缝的功能集成,而无需重复工作。

为了满足这一需求,我们在这里提出了PyImageJ,这是一个基于python的包,构建在ImageJ2(参考。5),它提供了Python和基于ImageJ的软件之间的基本互操作性,包括原始ImageJ, ImageJ2和ImageJ的斐济发行版6.通过PyImageJ,我们的目标是支持想要将ImageJ及其插件库与基于python的例程结合起来的软件开发人员,以及想要在分析工作流中做同样事情的科学家。PyImageJ是跨平台的,可以在Linux、macOS和Windows操作系统上运行,可以从PyPI和conda-forge安装。PyImageJ通过将Java初始化为Python的子进程来实现ImageJ和Python之间的双向通信,这样任何基于Java的功能都可以从Python程序中使用,并且可以编写新的基于Python的例程来增强Java程序。另一种范例是将Python初始化为Java的子进程,在某些场景中也很有用,目前正在开发中。ImageJ2的体系结构由构建在两个关键层上的库组成:https://scijava.org/),提供基本的基础设施,不以图像为特定对象;和ImgLib2(参考。7),提供核心图像数据模型(图;1).因此,PyImageJ是建立在两个基本的Python包上的——scyjava (https://github.com/scijava/scyjava)和imglyb (https://github.com/imglib/imglyb)——它们分别作为基于java的SciJava和ImgLib2包的基于python的集成层。

图1:PyImageJ的软件架构。
图1

蓝色显示Python环境和示例Python应用程序。红色显示了ImageJ2软件堆栈和运行在特殊的python集成Java虚拟机(JVM)中的示例插件。在Python环境中,PyImageJ使用jype(来自scyjava层)来创建与Python集成的JVM,该JVM将运行ImageJ2软件堆栈。在Java环境中,这个封装的JVM包含了所有用户请求的Java库,包括ImageJ、ImageJ2和其他插件——例如,来自Fiji和/或其他ImageJ更新站点的插件。Python顶层PyImageJ提供了对ImageJ2网关和Python便利函数的访问。python端imglyb与java端ImgLib2接口。最后,Python scyjava层提供了基本组件,如JVM配置和类型转换。

第一层,scyjava,利用jgo项目(https://github.com/scijava/jgo)检索ImageJ2 Java库,以及jpy (https://jpype.readthedocs.io/en/latest/)来创建一个特殊的与python集成的Java环境,其中包含这些库。这种设计使scyjava能够透明地下载和缓存从远程在线存储库打包的Java库,将Java环境作为包含这些库的子进程启动,将Java类包装为具有所有相同函数的动态生成的Python类,并在Java和Python之间转换常见数据结构,如列表、集和字典或映射。值得注意的是,scyjava包对于任何基于java的库到Python程序的进程内集成都很有用,并且可以独立于PyImageJ使用。

Python和ImageJ之间的图像数据交换是通过imglyb层完成的,imglyb层通过共享内存提供了对NumPy数组和元数据丰富的xarray数据的零拷贝访问。使用共享内存存储图像数据不仅减少了内存使用和处理时间,而且使用户能够立即看到基于python的图像上ImageJ处理的结果。已转换为适当的Python类型(即NumPy或xarray)的ImageJ图像可以由基于Python的图像处理工具(如napari)访问8,一个快速和交互式多维图像查看器,或CellProfiler9,这是一个工作流工具,可重复地将分析扩展到大量数据。RunImageJScript CellProfiler插件已经显示了性能的提高,例如,它允许用户应用来自可训练的Weka Segmentation的模型10(一个ImageJ插件)作为他们特征分类工作流程中的一个步骤。PyImageJ为用户提供了对完整的ImageJ2应用程序编程接口(API)的交互式访问,包括ImageJ2的所有功能和插件,以及原始的ImageJ API,可通过ImageJ2的向后兼容遗留层访问。PyImageJ还支持没有图形用户界面(GUI)元素的无头模式,在没有计算机监视器的系统上支持工作流程(例如,远程服务器)——所有ImageJ2命令都可以在无头模式下使用,尽管原始ImageJ的功能受到其对GUI元素的潜在依赖的限制。

总而言之,PyImageJ通过从根本上集成两个软件生态系统,让用户可以访问Python和ImageJ的优点。PyImageJ支持Python和ImageJ之间健壮的数据互操作性,使用户能够创建包含Python和ImageJ元素的工作流。