马赛克图像融合
作者:Volker Hilsenstein, Marvin Albert 和 Genevieve Buckley
执行摘要
这篇博文展示了一个案例研究,其中研究人员使用 Dask 进行马赛克图像融合。马赛克图像融合是指将多个在已知位置拍摄的较小图像组合并拼接成一个具有非常大视野的单一图像。完整的代码示例可在 GitHub 的 DaskFusion
仓库中找到:https://github.com/VolkerH/DaskFusion
问题
显微镜中的图像马赛克拼接
在光学显微镜中,用 20 倍物镜捕获的单个视野的对角线通常约为几百微米(确切尺寸取决于光学系统的其他部分,包括相机芯片的尺寸)。典型的样品载玻片尺寸为 25 毫米 x 75 毫米。因此,在对整个载玻片进行成像时,必须采集数百张图像,通常在各个图块之间有一些重叠。随着放大倍数的增加,所需图像的数量也相应增加。
为了获得概览,必须将大量单个图像图块融合到一个大型马赛克图像中。在这里,我们假设定位和对齐单个图像图块所需的信息是已知的。在本例中,这些信息以显微镜记录的元数据形式提供,即显微镜载物台位置和像素比例。或者,这些信息也可以直接从图像数据中导出,例如通过配准步骤来匹配图块重叠区域中的对应图像特征。
解决方案
容纳最终马赛克图像的数组通常尺寸太大,无法完全放入 RAM 中,因此我们将使用 Dask 数组和 map_blocks
函数来实现核外处理。 map_blocks
函数将单独处理输出数组的较小块(也称为块),从而无需将整个输出数组保存在内存中。如果资源充足,dask 还会将块的处理分布到多个工作节点上,因此我们还可以免费获得并行处理,这有助于加快融合过程。
通常,每当我们想连接 Dask 数组时,都会使用 Stack、Concatenate 和 Block。然而,这些工具不适用于马赛克图像融合,因为
- 图像图块将会重叠,
- 图块可能不会精确地位于网格上,并且由于载物台和相机的对齐不完美,通常还会出现轻微的旋转。在最普遍的情况下,例如在全景照片马赛克中,单个图像图块可能任意旋转或倾斜。
这个马赛克原型实现的起点是一些读取所有图块的载物台元数据并计算每个图块的仿射变换的代码,该变换会将图块放置到输出数组中的正确位置。
下图显示了使用 napari 图像查看器将马赛克图像图块放置到正确位置的初步工作。这里展示了一个包含 63 个图像图块的小示例。
这里是放置单个图块的动画。
为了利用 Dask 进行处理,我们创建了一个 fuse
函数,该函数生成最终马赛克的一小块,并由 map_blocks
为输出数组的每个块调用。在每次调用 fuse
函数时,map_blocks
都会传递一个字典(block_info
)。根据 Dask 文档
你的块函数通过接受特殊的
block_info
或block_id
关键字参数来获取它在数组中的位置信息。
马赛克工作流程中 fuse
函数的基本流程如下。对于输出数组的每个块
- 确定哪些源图像图块与该块相交。
- 调整图像图块的仿射变换,以考虑块在数组中的偏移量。
- 加载所有相交的图像图块,并应用各自调整后的仿射变换,将其映射到该块中。
- 使用简单的最大值投影融合图块。
- 返回融合后的块。
使用最大值投影融合重叠图块区域可能会导致伪影,例如重影和可见的图块缝隙,因此在生产环境中通常会使用更复杂的方法。
结果
对于包含许多图像图块(~500-1000 个图块)的数据集,使用这种基于 Dask 的方法可以将马赛克生成速度从几个小时加快到几十分钟(与之前在同一工作站上使用 ImageJ 插件的工作流程相比)。由于 Dask 能够处理核外数据和使用 zarr 存储分块数组,因此也可以在内存有限的硬件上运行融合过程。
最后,我们得到最终的马赛克融合结果。
代码
与此马赛克图像融合项目相关的代码可在 DaskFusion
GitHub 仓库中找到:https://github.com/VolkerH/DaskFusion
这个 notebook 中提供了一个独立的示例,它下载了缩小尺寸的示例数据来演示整个过程。
接下来是什么?
目前,DaskFusion 代码是针对单通道 2D 图像和使用简单最大值投影融合重叠区域图块的概念验证,它不是生产代码。但是,如果将图块块交集计算扩展到更高维数组,则相同的原理可用于融合多通道图像体,例如来自光片显微镜的数据。利用 dask,此类更大规模的数据集将受益更多,因为可以使用 dask jobqueue 将处理分布到 HPC 集群的多个节点上。
另请参阅
Marvin 关于多视角图像融合的闪电演讲:YouTube 上可在此处观看 15 分钟的视频
Marvin 在视频中提到的 GitHub 仓库 MVRegFus 可在此处找到:https://github.com/m-albert/MVRegFus
Trevor Manz 的 napari-lazy-openslide 可视化插件:“一个使用 openslide 和 dask 延迟加载多尺度全载玻片 tiff 图像的实验性插件。”
有关图像拼接替代方法的更多信息
- ASHLAR:通过同时协调层/邻接配准进行对齐
- 显微镜图像拼接工具 (MIST)
- Yohsuke T. Fukai 的 m2stitch python 包:“提供规则网格上分块显微镜图像的稳健拼接”(基于 MIST 算法)
致谢
这项计算工作由 Volker Hilsenstein 与 Marvin Albert 合作完成。 Volker Hilsenstein 是 EMBL Theodore Alexandrov 实验室的科学软件开发者,专注于空间代谢组学和生物图像分析。
样本图像由 EMBL 海德堡 Alexandrov 实验室的 Mohammed Shahraz 准备和成像。
Genevieve Buckley 和 Volker Hilsenstein 撰写了这篇博文。
博客评论由 Disqus 提供支持