全网独家梳理:数字病理图像的常用存储格式以及格式转换的方法|24-08-17

news2024/11/17 9:51:32

小罗碎碎念

这一期推文,跟你们分享一些比较底层,并且顶刊中不会涉及但是又至关重要的内容。

我们在做任何一个病理AI的项目前,有两样东西是一定会拿到手的——切片&对应的临床基线表。(如果做多组学/多模态的项目,还会拿到测序数据和影像数据,但是如果单病理的你都处理不好,扩大队列你更懵)

前两天有篇推文讲了,我们对于临床基线表的很多信息都没有挖掘出来。

image-20240816220154172

所以我也准备了一期推文,试图梳理拿到基线表以后的一个标准流程,目前还在筹划中。

image-20240816220308045


今天这期的推文想讲的是另一个东西——切片的导出&处理

病理切片的存储格式很多种,不同公司扫描仪导出的片子格式也不同,江丰的是kfb,蔡司的是czi。

我们处理片子的时候,用的是openslide包,而恰好这两种格式都不能直接用它打开,因此我们需要借助程序来转换格式。

在正式介绍如何转换格式之前,我会先介绍病理图像常用的常用存储格式以及超高分辨率数字图像的金字塔结构,最后再介绍如何转换WSI的格式。


一、病理图像的常用存储格式

1-1:TIFF格式

病理图像,特别是全切片病理图像(Whole Slide Images, WSI),可以采用多种存储格式。这里着重介绍一下TIFF格式。

标签图像文件格式(TIFF,Tagged Image File Format)是一种广泛使用的位图图像格式,以其灵活性和对高分辨率图像的支持而受到青睐。

在病理学领域,TIFF格式尤其重要,因为病理图像通常包含大量的细节,尺寸巨大,如CMU-1.tiff示例图像,其分辨率高达46000x32914像素,这对计算机内存和处理能力提出了很高的要求。

image-20240816183739294

为了有效处理这些大型图像,图像平铺(tiling)和缩放金字塔(pyramid)技术被广泛应用。平铺技术涉及将大图像分割成小块(tile),每块通常为256x256像素。这样,只有当前需要显示或处理的图像块会被加载到内存中,而不是整个图像,这大大减少了内存的使用并提高了处理效率。

此外,这些tile可以使用不同的编码技术进行压缩,以进一步减少存储需求和提高加载速度。在TIFF格式中,LZW(Lempel-Ziv-Welch)和JPEG是常用的压缩编码。


缩放金字塔技术则是在图像的原始分辨率基础上创建多个分辨率逐渐降低的副本,形成一个金字塔结构。这些副本可以按照2的幂次(例如,1/2,1/4,1/8,1/16原图尺寸)进行下采样。在图像处理或分析时,可以根据需要选择适当的分辨率级别,从而在不同的尺度上进行操作,这在进行图像特征提取或模式识别时非常有用。

尽管TIFF格式本身不强制要求图像必须是平铺或金字塔结构,但在病理图像分析中,某些库如OpenSlide要求TIFF图像必须是平铺的,以便能够正确读取和处理。如果一个TIFF图像没有按照这些要求进行配置,OpenSlide可能会报告格式不支持的错误。因此,为了确保与这些工具的兼容性,病理图像的TIFF格式通常需要进行特定的预处理,以满足平铺和金字塔结构的要求。

总之,TIFF格式及其相关的平铺和缩放金字塔技术为病理图像的存储、传输和分析提供了有效的解决方案,使得在有限的计算资源下处理大规模图像成为可能。


1-2:其余常见的病理图像存储格式及其特点

  1. SVS格式:SVS(Supported Vector Graphics format)是一种Tiled TIFF图像,用于存储高分辨率的病理图像。SVS格式支持金字塔结构,可以存储不同放大倍数下的图像信息,便于病理学家进行详细观察。SVS文件通常包含主图像和附加页面,如标签、概览图像以及缩放的副本。
  2. DICOM格式:DICOM(Digital Imaging and Communications in Medicine)是医学图像和相关信息的国际标准。虽然DICOM最初主要用于放射医疗图像,但它也支持存储病理图像。DICOM文件包含丰富的元数据,如患者信息和扫描参数,适合在不同设备和系统之间传输和共享。
  3. NIFTI格式:NIFTI(Neuroimaging Informatics Technology Initiative)格式最初用于存储神经影像数据,但也适用于存储3D医学图像。NIFTI文件包含图像数据和头部信息,后者描述了图像的元数据,如像素大小和图像方向。
  4. Analyze格式:Analyze格式包含两个文件:一个头文件(.hdr)包含图像的元数据,一个数据文件(.img)包含图像数据。这种格式常用于医学图像处理软件。
  5. PAR/REC格式:这是飞利浦MRI扫描设备使用的数据格式,PAR文件包含扫描参数,REC文件包含原始图像数据。
  6. NRRD格式:NRRD(Nearly Raw Raster Data)是一种用于存储多维数组数据的格式,特别适用于医学图像。它支持任意维度的数据,并可以包含与数据相关的元数据。

这些格式中,SVS和TIFF是病理图像中最常用的两种格式,它们能够有效地存储和处理高分辨率的病理图像数据。DICOM格式因其标准化和互操作性,在医学影像领域得到广泛应用,包括病理图像的存储和传输。


二、图像金字塔

病理图为金字塔结构,level_count属性是获取svs有多少层。在svs中存储了每一层采样的tiles。一般情况下Level0为原图,也就是highest resolution,然后每一级进行下采样,level_count -1为lowest resolution。


图像金字塔是一种在图像处理和计算机视觉中常用的数据结构,它为同一张图像的不同层级提供了不同分辨率的视图。

img

这种结构之所以重要,是因为它允许算法在多个尺度上分析图像,这在很多应用中都非常有用,比如图像识别、目标检测、图像融合等。

2-1:图像金字塔的构建

构建图像金字塔的过程通常涉及以下几个步骤:

  1. 原始图像获取:首先,需要有一个高分辨率的原始图像作为起点。

  2. 降采样:通过降采样技术,如最邻近插值、双线性插值或更高级的方法,将原始图像缩小到较小的尺寸。这个过程会逐渐减少图像的分辨率,同时增加图像的层级。

  3. 重复过程:重复降采样过程,直到图像缩小到所需的最小尺寸或达到预设的层级数。

  4. 存储结构:所有这些不同分辨率的图像按照从大到小的顺序排列,形成一个金字塔结构。


2-2:图像金字塔的类型

  1. 高斯金字塔:每一层的图像都是通过高斯低通滤波后降采样得到的,这样可以减少混叠效应,保留图像的重要特征。

  2. 拉普拉斯金字塔:在高斯金字塔的基础上,通过计算相邻层之间的差异来创建额外的细节层,这有助于图像重建和分析。

  3. K-L金字塔:基于Karhunen-Loève变换,这种金字塔在图像压缩领域有应用。


2-3:图像金字塔的应用

  1. 多尺度分析:在图像中搜索特定特征或对象时,可以在不同分辨率的图像上进行,以适应不同大小的目标。

  2. 图像融合:在图像拼接或图像融合任务中,使用金字塔方法可以更好地处理不同图像间的接缝。

  3. 图像压缩:在某些图像压缩算法中,图像金字塔可以有效地表示图像在不同分辨率下的信息。

  4. 计算机视觉算法:在诸如SIFT(尺度不变特征变换)等算法中,图像金字塔是关键组成部分,用于检测和描述图像中的关键点。

  5. 实时视频处理:在视频流处理中,图像金字塔可以用于快速目标跟踪,因为它允许在不同时间尺度上分析运动。


2-4:结论

图像金字塔提供了一种灵活的方式来处理和分析图像数据,它通过在多个尺度上表示图像,增强了算法对图像内容的理解和处理能力。随着计算资源的增加和算法的优化,图像金字塔在现代图像处理和计算机视觉任务中的应用越来越广泛。


三、格式转换

一般来讲,如果我们用的扫描仪是江丰的,那么图像格式是kfb,如果用的扫描仪是蔡司的,则格式为czi,这里先介绍如何将kfb的格式转换为svs,后面的推文会介绍如何将czi转换为TIFF。


3-1:配套软件

注意,后面介绍的代码要在Windows中运行,并且需要搭配配套的软件使用。

软件获取地址:https://github.com/Lxltxpku/Share

image-20240816214042785


3-2:配套代码

import os  # 引入os模块,用于操作文件和目录
import sys  # 引入sys模块,用于访问与Python解释器相关的变量和函数
import subprocess  # 引入subprocess模块,用于执行命令行命令
from time import time  # 引入time函数,用于测量时间
from glob import glob  # 引入glob模块,用于文件名模式匹配

def main():
    # 设置源文件夹名称、目标文件夹名称和转换级别
    src_folder_name = 'Raw'  # KFB文件所在文件夹
    des_folder_name = 'Raw-svs'  # 保存SVS文件的文件夹
    level = 9  # 设置转换级别
    
    # 设置转换程序的路径
    exe_path = r'E:\...\...\...\KFbioConverter.exe'  # 下载的转换程序所在文件夹
    if not os.path.exists(exe_path):
        raise FileNotFoundError('Could not find convert library.')  # 如果转换程序不存在,抛出异常


    # 检查级别是否在2到9之间
    if int(level) < 2 or int(level) > 9:
        raise AttributeError('NOTE: 2 < [level] <= 9')  # 如果级别不在范围内,抛出异常

    # 设置当前工作目录
    pwd = r'E:\...'
    full_path = os.path.join(pwd, src_folder_name)  # 拼接源文件夹的完整路径
    dest_path = os.path.join(pwd, des_folder_name)  # 拼接目标文件夹的完整路径
    if not os.path.exists(full_path):
        raise FileNotFoundError(f'could not get into dir {src_folder_name}')  # 如果源文件夹不存在,抛出异常
    if not os.path.exists(dest_path):
        os.makedirs(dest_path)  # 如果目标文件夹不存在,创建它

    # 获取源文件夹中的所有kfb文件
    kfb_list = os.popen(f'dir {full_path}').read().split('\n')
    kfb_list = [elem.split(' ')[-1] for elem in kfb_list if elem.endswith('kfb')]

    # 打印找到的kfb文件数量,并开始转换
    print(f'Found {len(kfb_list)} slides, transfering to svs format ...')
    for elem in kfb_list:
        st = time()  # 记录开始时间
        kfb_elem_path = os.path.join(full_path, elem)  # 获取单个kfb文件的完整路径
        svs_dest_path = os.path.join(dest_path, elem.replace('.kfb', '.svs'))  # 构建目标svs文件的路径
        command = f'{exe_path} {kfb_elem_path} {svs_dest_path} {level}'  # 构建转换命令
        print(f'Processing {elem} ...')  # 打印正在处理的文件名
        p = subprocess.Popen(command)  # 执行转换命令
        p.wait()  # 等待命令执行完成
        print(f'\nFinished {elem}, time: {time() - st}s ...')  # 打印完成信息和所用时间

# 程序入口点
if __name__ == "__main__":
    main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2046540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宠物空气净化器推荐购买吗?真的能除毛去味吗?

自从做了猫咖店老板&#xff0c;我这生活真的是美滋滋&#xff0c;每天都可以摸到不同品种的可爱的小猫咪&#xff0c;在赚钱养家的同时还能肆意和猫咪贴贴&#xff0c;连朋友都说想和我干一样的工作了。每天接待的顾客也不少&#xff0c;店里面的空气质量也还不错&#xff0c;…

模块一(任务2):SDH系统原理解读

一、PDH与SDH标准速率介绍 OTN网络技术是基于SDH系统和WDM系统设计的&#xff0c;所以学习OTN系统原理必须要掌握SDH和WDM量大系统原理 1、PDH与SDH概念及特点 二、SDH的帧结构 目前通信常见的数据结构有两种&#xff1a; 报文&#xff1a;基于以太网通信的数据结构 帧&am…

真诚巨作:全文一万字教你快速熟悉项目|文心快码帮你快速熟悉~

写在前面 : 上了好多年的学&#xff0c;终于毕业进入职场啦&#xff5e;在公司也有一段时间了&#xff0c;慢慢地也变成了纯正的社畜了。近来开始熟悉部门的项目代码&#xff0c;说实话公司的代码真跟以前接触的不一样&#xff0c;内部各种自建框架&#xff0c;让人看得眼花缭乱…

ARCGIS PRO 要素标注背景色透明度的设置

使用ArcGIS Pro 设置标注背景色的透明度 一、点击标注属性 二、点击符号、注释 三、下拉框选择背景 四、背景符号 五、点击颜色 六、编辑颜色 七、应用

Java语言程序设计基础篇_编程练习题**16.26(模拟:升旗并播放国歌)

目录 题目&#xff1a;**16.26&#xff08;模拟&#xff1a;升旗并播放国歌&#xff09; 习题思路&#xff1a; 代码示例 结果展示 音频来源 题目&#xff1a;**16.26&#xff08;模拟&#xff1a;升旗并播放国歌&#xff09; 创建一个显示升国旗的程序&#xff0c;如图15-14…

还在使用百度翻译?这4款翻译工具也能帮你打破语言壁垒!

是谁像我一样&#xff0c;一提到翻译工具第一想到的就是百度翻译。它可以是用了好久的翻译工具&#xff0c;可是随着学习的深入&#xff0c; 我还是发觉了一些其他的实用翻译工具。比如下面这四款&#xff1a; 1、365翻译工具 直达链接&#xff1a;https://fanyi.pdf365.cn/ …

NLP之transformer:transformer-explainer的简介、安装和使用方法、案例应用之详细攻略

NLP之transformer&#xff1a;transformer-explainer的简介、安装和使用方法、案例应用之详细攻略 目录 相关论文 《Transformer Explainer: Interactive Learning of Text-Generative Models》翻译与解读 transformer-explainer的简介 transformer-explainer的安装和使用方…

尚硅谷MYSQL(12-13章)

第十二章数据类型 比如说tinyint&#xff08;4&#xff09;这个四表示的是那个取值范围的位数 他只是一个显示 比如说int后面应该是int&#xff08;11&#xff09;这是有符号的 无符号int是int&#xff08;10&#xff09; 如果写成int&#xff08;3&#xff09;但是存的数据是…

论文写作新神器!10款可以写论文的人工智能软件

在当今快速发展的数字时代&#xff0c;人工智能&#xff08;AI&#xff09;技术已经渗透到各个领域&#xff0c;包括学术研究和论文写作。为了帮助学者和学生提高写作效率和质量&#xff0c;市场上涌现了许多优秀的AI写作工具。本文将详细介绍10款可以写论文的人工智能软件&…

STM32F103C8T6单片机原理图设计(PCB板)

先了解了以下stm32f103c8t6的引脚使用&#xff1a; 对比过一些原理图&#xff0c;我发现除了特定协议的引脚功能&#xff0c;只要功能正确&#xff0c;可以自己选择连接对应的引脚。可以根据使用的LED/BEEP/DHT11/BH1750/ESP8266等模块的功能对应相应的引脚&#xff1a; WIFI(…

[开源] 安卓系统发送modbus协议到硬件设备下位机

最近是在研究安卓板子上的modbus通信&#xff0c;于是写了这个maven依赖。 项目中主要用到的功能是读写寄存器&#xff0c;所以依赖中重点测试了读写多个寄存器的协议。 另外你可以自定义协议pdu交给程序进行封装及发送。 如果使用中发现了什么问题&#xff0c;可以到仓库添…

DHU OJ 循环结构 整除的尾数

思路及代码 //input T int >0 //input a,b int 0< <10000 10< <100 #include<iostream> #include<iomanip> using namespace std; int main(){int T;cin >> T;while (--T > 0){int a, b;cin >> a >> b; //solution // (a*100…

Tomcat初篇

目录 Tomcat主要特点Tomcat的核心组件Tomcat使用安装Tomcat配置Tomcat启动和停止Tomcat Tomcat工作原理目录结构配置文件性能优化策略 Tomcat Apache Tomcat是一个开源的Servlet容器和Web服务器&#xff0c;广泛用于运行基于Java的Web应用程序。它实现了Java Servlet和JavaSer…

【Web开发手礼】探索Web开发的秘密(十八)-Vue2(4)部门管理页面、路由、打包部署

主要介绍了部门管理页面、路由、打包部署&#xff01;&#xff01;&#xff01; 文章目录 前言 部门管理页面 Vue路由 打包部署 打包 部署 总结 前言 主要介绍了部门管理页面、路由、打包部署&#xff01;&#xff01;&#xff01; 部门管理页面 <template><div>&…

module ‘pkgutil‘ has no attribute ‘ImpImporter‘. Did you mean_ ‘zipimporter‘_

错误详情&#xff1a; Traceback (most recent call last):File "<frozen runpy>", line 198, in _run_module_as_mainFile "<frozen runpy>", line 88, in _run_codeFile "C:\ProgramData\anaconda3\envs\py312\Scripts\mim.exe\__main…

数值计算引擎:搭建远程容器开发环境

Build VS Code Remote Docker Development Environment 大型CAE软件开发技术栈通常依赖多个第三方库&#xff0c;因此从零开始配置开发、编译、运行等环境通常较为繁琐。但随着公司的发展壮大&#xff0c;却经常需要为新加入的成员配备相应的开发环境&#xff1b;另外&#xf…

深入理解 go unsafe

往期精选文章推荐&#xff1a; 深入理解 go mapgo 常用关键字深入理解 Go 数组、切片、字符串深入理解channel深入理解 go context深入 go interface 底层原理深入理解 go reflect深入理解 go unsafe 为什么有go unsafe Go 是支持指针的语言&#xff0c;但是为了保持简洁、安…

HW高耗电提醒竞品调研

摘要 高耗电提醒通知的规则,天生存在打扰用户的特点,故在触发高耗电检测阈值还要根据是否非可感知场景,进一步修正高耗电提醒的准确率。同时消息通知的交互设计中也进行少打扰静默设计 一、功耗高耗电通知监控规则 1.1 高耗电上报规则和文案 支持的耗电类型 上报高耗电通…

CTF-mysql

整数型 输入1发现有回显 发现and11有回显12没有 判断字段数 1 order by 2 确定回显点 -1 union select 1,2 查看数据库名称 -1 union selecr 1,database() 查看数据库名 -1 union slelct group_concat(schema_name)from information_schema.schemata 查看表名 -1 union s…

MySQL进阶难度知识点分析

以下为本人在阅读《MySQL是怎样运行的&#xff1a;从根儿上理解MySQL》这本书时对一些难度和重点的笔记&#xff0c;主要用于个人学习使用&#xff0c;内容可能存在出入&#xff0c;望理性食用~ 1. sql执行流程 一条sql的执行流程大致可分为客户端获取与数据库服务器的连接&am…