You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python显示单个TIFF文件内不同目录的图像像素数据

如何显示单个TIFF文件内不同目录存储的图像(像素数据)

ndpi、svs、bif这类数字病理图像均基于TIFF格式封装,内部以类金字塔结构存储多个Image File Directories(IFD,图像文件目录),每个IFD对应一个分辨率层、标签图或缩略图,通过tiffinfo/tiffdump命令可以查看所有IFD的偏移、尺寸、压缩格式等元信息。要通过Python读取并可视化每个IFD对应的图像,推荐以下两种经过验证的方案,避开普通图像库对病理TIFF兼容差的坑。

方案1:tifffile + matplotlib 通用方案(兼容绝大多数TIFF变种)

tifffile是Python生态对多IFD TIFF支持最完善的基础库,可自动处理瓦片存储、J2K、LZW等病理图常见压缩格式,无需手动编写IFD跳转逻辑。
首先安装依赖:
pip install tifffile matplotlib numpy

读取可视化代码示例:

import tifffile
import matplotlib.pyplot as plt

# 替换为目标文件路径
tiff_path = "your_file.svs"

with tifffile.TiffFile(tiff_path) as tif:
    # 遍历所有IFD目录
    for page_idx, page in enumerate(tif.pages):
        # 读取当前目录像素数据,超大图可改用内存映射避免爆内存:img_arr = page.asarray(out='memmap')
        img_arr = page.asarray()
        # 打印当前IFD基础元信息
        print(f"===== 第{page_idx}个IFD =====")
        print(f"尺寸: {page.shape}  通道数: {page.samplesperpixel}")
        print(f"压缩方式: {page.compression}")
        # 渲染显示
        plt.figure(figsize=(8,8))
        if len(img_arr.shape) == 2 or img_arr.shape[-1] == 1:
            plt.imshow(img_arr.squeeze(), cmap="gray")
        else:
            plt.imshow(img_arr)
        plt.title(f"IFD index: {page_idx}, size: {page.shape}")
        plt.axis("off")
        plt.show()

如果遇到边长数万以上的最高分辨率层,不需要读全图,可以用page.reduce(resize=(1024,1024))直接读取缩放到1024尺寸的预览,内存占用极低。

方案2:openslide-python 数字病理格式专用方案

如果主要处理svs、ndpi、bif这类专业病理格式,openslide是行业通用的标准库,会自动识别金字塔层级、标签图、宏预览图,不需要手动区分IFD类型。
安装前先部署底层依赖:Linux执行apt install openslide-tools、Mac执行brew install openslide、Windows下载预编译的二进制包配置环境变量即可,再安装Python包:
pip install openslide-python matplotlib

读取可视化代码示例:

import openslide
import matplotlib.pyplot as plt

slide_path = "your_file.ndpi"
slide = openslide.OpenSlide(slide_path)

# 打印所有金字塔层级的尺寸
print("金字塔各层尺寸:", slide.level_dimensions)
# 遍历可视化所有金字塔分辨率层
for level_idx in range(slide.level_count):
    level_img = slide.read_region(
        location=(0,0),
        level=level_idx,
        size=slide.level_dimensions[level_idx]
    )
    plt.figure(figsize=(8,8))
    plt.imshow(level_img)
    plt.title(f"金字塔层级 {level_idx}, 尺寸: {slide.level_dimensions[level_idx]}")
    plt.axis("off")
    plt.show()

# 额外读取可视化标签、宏预览等附属图像
for img_name in slide.associated_images:
    assoc_img = slide.associated_images[img_name]
    plt.figure(figsize=(6,6))
    plt.imshow(assoc_img)
    plt.title(f"附属图像: {img_name}, 尺寸: {assoc_img.size}")
    plt.axis("off")
    plt.show()

注意事项

  • 不推荐直接用Pillow读取这类多IFD病理TIFF:Pillow对瓦片存储、J2K压缩的特殊TIFF变种支持不完善,容易出现IFD识别不全、解码报错、像素读取错误的问题。
  • 读取最高分辨率的全尺寸层(通常边长数万到数十万像素)时,不要直接加载全量像素到内存:可以用内存映射模式读取,或者先加载缩小后的预览图,需要看细节时再读取指定坐标的局部瓦片即可,避免内存溢出。

内容的提问来源于stack exchange,提问作者gota

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:12:22