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

如何为SimpleITK图像各切片正确设置Patient Position(Origin)标签?

问题:VTK多切片体数据在SimpleITK中世界坐标转图像坐标错误

数据背景

我有一个尺寸为(256,256,14)的多切片体数据存储在.vtk文件中,文件头信息如下:

# vtk DataFile Version 3.0    
vtk output
BINARY
DATASET STRUCTURED_POINTS
DIMENSIONS 256 256 14
SPACING 1.25 1.25 8
ORIGIN 111.81 -205.959 104.612
POINT_DATA 917504
SCALARS scalars float
LOOKUP_TABLE default

其中ORIGIN对应切片0的DICOM标签(0020,0032)(Patient Position)。所有14个切片的DICOM标签(0020,0037)(Patient Orientation)取值相同,但每个切片的Patient Position值各不相同。

重现代码

我将该.vtk文件读取为SimpleITK图像,调用TransformPhysicalPointToIndex()将世界坐标转换为图像坐标:

import SimpleITK as sitk
import numpy as np

path = "multi_slice_volume.vtk"

reader = sitk.ImageFileReader()
reader.SetFileName(path)
multi_slice_vlm = reader.Execute()

world_coord = np.array([[72.424, -171.130, 125.821]])
image_coord = multi_slice_vlm.TransformPhysicalPointToIndex(world_coord)

已知该世界坐标对应的正确图像坐标应为(5,5,7)(属于切片7),但实际得到的结果是(13, 26, 4)。

问题原因

经排查,坐标转换错误的原因有两点:

  • a) SimpleITK默认使用了Patient Orientation值(1,0,0,0,1,0,0,0,1),与数据实际的Orientation不匹配
  • b) 转换时仅使用了切片0的Patient Position值,未对应各切片的实际位置

已解决的部分

我已经通过以下代码修正了问题a:

multi_slice_vlm.SetDirection((0.43, -0.58, 0.0, 0.85, 0.014, 0.0, -0.29, -0.81, 1.0))

未解决的问题

针对问题b,我尝试为每个切片单独设置对应的Patient Position作为Origin:

multi_slice_vlm[:, :, 0].SetOrigin([111.809579849243, -205.95926731824, 104.612316131591]) # slice 0
multi_slice_vlm[:, :, 1].SetOrigin( [106.316583633422, -201.75588673353, 108.632091522216]) # slice 1
    (...)
multi_slice_vlm[:, :, 13].SetOrigin( [100.823587417602, -197.55250614881, 112.651866912841]) # slice 13

但最终得到的图像坐标仍然不正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:54:26