SimpleITK 获取CT spacing 底层原理

4 篇文章 0 订阅

SimpleITK 获取CT spacing 底层原理

一、层厚、层间距概念

层厚: CT扫描机扫描出来的断层的层的厚度, 通常用Slice thickness表示, 比如 5mm

层间隔:一般用 Slice intervalSlice increment来表示,比如 5mm。在 CT 中,层间隔表示相邻两层中心之间的距离

在这里插入图片描述

如上图所示, 在CT中, 相邻两层CT中心之间的距离代表层间距, 当层厚==层间距时,无重叠, 代表CT断层之间是连续的, 那么同理, 当层厚!=层间距时, 代表断层之间是有距离或者重叠的

二、pydicom中的层厚以及spacing

spacing:

在这里插入图片描述

一张二维的医学图像,图像尺寸为[6x7],每个像素之间的物理空间距离(spacing),x轴、y轴分别是(20,30)。扩展到三维医学图像,就出现【体素】,就是三维的“像素”。相比像素有三个轴(x、y、z),同样每个轴都有spacing。 意思相同大小尺寸的医学图片,spacing也是不同。

如下是pydicom以及SimpleITK获取spacing:

import pydicom as dicom
import numpy as np
from pathlib import Path

PathDicom = 'dcm序列所在文件夹路径'

data_dir = Path(PathDicom)
dicom_files = list(data_dir.glob('*.dcm')) # 获取目录下所有 .dcm 文件

dicom_files.sort(key=lambda x: int(x.stem.rsplit('.', 1)[1])) #将 .dcm文件 按序号排列 注意: sorted() 方法会按字符排列, 此处需要按末尾数字排列
slices = [dicom.read_file(dicom_file, force=True) for dicom_file in dicom_files]

# 采用以下方法返回的SliceThickness是错误的
print(slices[0].SliceThickness)

# 正确的层厚获取方法
thickness = np.abs(slices[0].SliceLocation - slices[1].SliceLocation) # 获取 dcm 文件的层厚

# 获取整个 CT 序列的 spacing, 等同于 SimpleITK 的 GetSpacing() 方法
spacing_z_list = []
for i in range(1, len(slices)):
    spacing_z_list.append(slices[i].SliceLocation - slices[i - 1].SliceLocation)


spacing_z = abs(sum(spacing_z_list) / len(spacing_z_list)) # 获取Z轴的spacing
print(f"spacing_z : {spacing_z}")

如上代码所示, 因为dicom文件层次之间可能会存在重叠或者间隔, 故z轴的spacing应该取所有相邻序列层厚的均值, 即abs(sum(spacing_z_list) / len(spacing_z_list))

注意:在临床CT数据中, 有时候会遇到一些数据在ITK-SNAP软件中显示如下, 有多个component:

在这里插入图片描述

这种情况下, 使用SimpleITK获取的Z轴spacing就是利用我上述代码的逻辑计算的, 并且单独的component之间数据的层厚是相同的, 只是因为两个component连接处的层厚大大超出单独component内的层厚, 故不注意的话会造成一些问题。这个component信息可以通过pydicom包中AcquisitionNumber获取

singleDicomFile # 单独的一个dcm文件
print(singleDicomFile.AcquisitionNumber) # 查看某个dcm文件所属component

在这里插入图片描述

参考链接:

【CTMR技术】CT与MR中的层厚&层间隔一样吗?

DICOM数据字段说明

关于DICOM文件的SliceThickness参数错误问题

【碎碎念】医学图像处理工具SimpleITK与DataSet

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
`SimpleITK.ReadImage()` 是 SimpleITK 库中的一个函数,用于读取图像数据。它可以从磁盘上的文件或内存中的数据读取图像,并返回一个 SimpleITK 图像对象。 下面是 `.ReadImage()` 函数的基本语法: ```python image = sitk.ReadImage(file_name, imageIO=None) ``` 参数说明: - `file_name`:要读取的图像文件的路径或 URL。可以是常见的图像格式,如 DICOM、NIfTI、JPEG 等。 - `imageIO`(可选):指定要使用的 ImageIO 对象来读取图像。如果未指定,则使用默认的 ImageIO。 `.ReadImage()` 函数返回一个 SimpleITK 图像对象,你可以使用它来访问图像数据和元数据,以及进行各种图像处理操作。 下面是一个示例,展示如何使用 `.ReadImage()` 函数读取图像文件: ```python import SimpleITK as sitk # 读取图像文件 image_path = "example.dcm" image = sitk.ReadImage(image_path) # 访问图像属性 size = image.GetSize() spacing = image.GetSpacing() origin = image.GetOrigin() # 显示图像信息 print("Image size:", size) print("Image spacing:", spacing) print("Image origin:", origin) ``` 在上面的示例中,我们首先导入了 SimpleITK 库,并使用 `.ReadImage()` 函数读取名为 "example.dcm" 的 DICOM 格式图像。然后,我们使用一些 SimpleITK 的函数来访问图像的属性,例如大小(size)、间距(spacing)和原点(origin)。最后,我们打印出这些图像信息。 需要注意的是,`.ReadImage()` 函数还可以读取内存中的图像数据。你可以将图像数据加载到内存中,并将其传递给 `.ReadImage()` 函数的 `file_name` 参数。 希望这个详细介绍能够帮助到你!如果还有其他问题,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值