SlideIO:一个用于读取医学图像的新Python库

2025年1月5日 | 阅读6分钟

引言

医学图像——由显微镜、扫描仪和其他设备生成的图像与普通图片不同。它们的大小是关键区别之一。这些图片可能相当大。如今,千兆字节大小的演示并不少见。维度的数量是另一个区别。几种生物图像格式支持三维和四维(体积和时间序列)。除了标准维度外,一些格式还提供扫描仪特定的特性,例如相位索引、旋转(用于从不同角度收集的数据)和焦距。

多千兆像素的图像无法使用标准的压缩技术进行编码。在使用 JPEG 或 PNG 等图像编解码器时,必须将整个图像保存到计算机内存中才能在屏幕上显示,甚至只能读取其中一小部分。生物格式使用缩放金字塔和分块技术来克服这些挑战。它使用的内存和处理能力最少,可以以任何比例读取图像的任何区域。一组不同大小的图像副本称为缩放金字塔。

SlideIO: A New Python Library for Reading Medical Images

Slideio 库的目的是通过利用医学图像的内在结构来尽可能高效地解释它们。Slideio 并不是第一个提供此类功能的库。在我进行图像分析实践的过程中,我广泛使用了各种库。然而,到目前为止,我还没有遇到一个能满足我所有图像分析需求的库。我决定自己做一个,它应该汇集我在这个领域的所有知识。

该库中有一个驱动程序架构。每个驱动程序支持一种或多种图像格式。第一个 slideio 版本提供四种驱动程序

  • CZI:用于读取 Zeiss CZI 图像的驱动程序。
  • SVS:用于读取 Aperio SVS 图像的驱动程序。
  • AFI:用于读取 Aperion 荧光图像的驱动程序。
  • GDAL:用于读取 jpeg、png、tiff 等通用格式的驱动程序。它使用流行的 c++ 图像库 GDAL。

Slideio 库的对象结构很简单

SlideIO: A New Python Library for Reading Medical Images

图像驱动程序创建 slide 对象。单个图像文件(或文件夹,取决于图像类型)由 slide 对象表示。Slide 对象至少包含一个 Scene 对象,它是一个连续的栅格区域(二维图像、体积、时间序列等)。某些图像格式支持单个场景,例如单个组织扫描。使用某些格式可以在文件中存储多个组织区域。2D 场景的像素尺寸和分辨率均相同。如果场景是一个 3D 体积,那么其中的每个切片都具有相同的尺寸和分辨率。时间序列也一样。

下面的代码片段演示了如何使用“SVS”图像驱动程序打开一个 slide

图像元数据

Slideio 库提供了多层图像信息。“raw_metadata”字段显示从图像中提取的未经修改的文本。文本的内容因文件类型而异。对于 Aperio SVS slide,它是从“Image Information”tiff 文件中提取的文本字符串。在这种情况下,Zeiss CZI 文件是一个包含所有文件元数据的 XML 文档。以下代码片段可用于从 Aperio SVS 文件中提取元数据

这是代码示例产生的输出

栅格访问

栅格数据访问的主要对象是场景。它暴露以下详细信息

  • compression:数据压缩类型;
  • magnification:扫描仪放大倍数;
  • name:场景名称;
  • num_t_frames:时间序列中的时间帧数;
  • num_z_slices:体积中的切片数;
  • rect:场景矩形的坐标和尺寸;
  • resolution:场景的平面分辨率(元组);
  • t_resolution, z_resolution:场景在时间和 z 方向上的分辨率;
  • num_channels:场景中的通道数;
  • channel_data_type:图像通道的数据类型(字节、16 位等);
  • channel_name:图像通道的名称。

下面的代码片段检索场景名称、矩形和分辨率。

它会产生以下结果

图像高 19445 像素,宽 19919 像素。每个像素在 x 和 y 方向上均为 0.4962 mkm。图像中有三个通道。图像格式决定了生物图像中通道的含义。明场照片的颜色仅限于红色、绿色和蓝色。这些照片有三个 8 位通道。get_chanel_data_type 和 get_channel_name 函数提供对通道属性的访问。

输出

 
uint8
uint8
uint8   

read_block 方法获取连续区域的像素值。当该方法不带参数运行时,将返回原始大小的整个场景。通常,由于尺寸过大,无法以原始比例读取整个图像。在这种情况下,应用程序有三种选择:它可以获取图像的一部分,或者将其缩小到合理的大小。下面是一个代码示例。将整个图像提取出来,并将其放大到 500 像素宽。应注意,当图像高度为零时,表示需要自动计算以保持 x 和 y 轴的比例相同。


SlideIO: A New Python Library for Reading Medical Images

以下代码片段从图像中读取一个矩形区域,并将其宽度缩小到 500 像素。


SlideIO: A New Python Library for Reading Medical Images

可以读取单个通道或一组通道


SlideIO: A New Python Library for Reading Medical Images

通过附加的元组参数 slices 和 frames 可以读取体积和时间序列

代码

输出

 
(1000, 1000, 27)   

代码

安装

可以使用 pip 安装 slideio 库

目前仅支持 Windows 和 Linux 构建。

结论

Slideio 是一款 Python 工具,用于解释医学图像。它允许读取整个幻灯片和幻灯片的特定区域。可以有效地缩小大型幻灯片。为了加速缩放过程,该模块使用图像的内部缩放金字塔。Slideio 除了 2D 演示文稿外,还可以处理时间序列和 3D 数据集。

该库与包括 opencv 在内的几种知名图像分析包协同工作,并将栅格作为 numpy 数组提供。

目前,它可以读取通用格式、Zeiss CZI 文件以及 Aperio SVS 和 AFI 文件。以下格式的驱动程序将很快提供

  • PerkinElmer 图像
  • Leica SCN 图像
  • DICOM 数据集
  • Leica lif 图像
  • 等等...