数据是医学图像中的MRI图像。要求完成图像中RAS坐标到tensor矩阵坐标的转化。
RAS坐标:原始坐标,单位为mm。
像素坐标:nii文件作为矩阵数据的坐标,单位为像素。
转换所需的数据:
使用Volume Information中的“Image Spacing”,“Image Origin”,“IJK to RAS Direction Matrix”三部分信息。
以467859号的fixT1W1.nii为例。
三部分信息如下图所示:
slicer中volume information的截图
将Volume Information中的“Image Spacing”,“Image Origin”,“IJK to RAS Direction Matrix”三部分信息分别赋值为python中的space,origin,matrix三个全局变量。
转化公式如下:
注:如果是nii格式数据,可以使用python读取这三个数据:
import SimpleITK
file = ....
img = SimpleITK.ReadImage(file)
origin = img.GetOrigin()
direction = np.array(img.GetDirection())
space = np.array(img.GetSpacing())
注意,用SimpleITK读取的数据和3D Slicer看到的数据可能有部分正负号的区别,即他们的RAS坐标有些坐标轴正负相反。最好自己确认一下。
例子:
在slicer软件中任意取一个RAS坐标点,如下图所示
软件截图
截图时鼠标在图中左上方红色五角星位置,右下方绿线表示此时鼠标位置的RAS坐标为(29.6,37.6,6.1)。对应的矩阵中的坐标为(86,218,119)。
python代码:
# 坐标转换:RAS(单位:mm)平移,旋转,缩放,得到像素坐标。
import numpy as np
origin = np.array([53.0123, 79.2142, 66.5104]).T
space = 0.293
# IJK to RAS Direction Matrix
matrix = np.array([
[-0.9990, 0.0026, 0.0436],
[-0.0436, -0.0920, -0.9948],
[0.0014, -0.9958, 0.0920]
])
def ras_to_coordinate(ras, origin, matrix, space):
"""RAS到像素坐标coordinate的转化
"""
ras = ras - origin
ras = np.matmul(np.linalg.inv(matrix), ras)
coordinate = ras / space
return coordinate
def coordinate_to_ras(coordinate, origin, matrix, space):
"""像素坐标coordinate到RAS的转化
"""
ras = coordinate * space
ras = np.matmul(matrix, ras)
ras = ras + origin
return ras
if __name__ == "__main__":
# ras = np.array([29.6, 37.6, 6.1]).T
# coordinate = [86, 218, 119]
print("RAS to coordinate:")
ras = np.array(
[29.6, 37.6, 6.1]
)
print("input RAS : ", ras)
coordinate = ras_to_coordinate(
ras, origin=origin, matrix=matrix, space=space)
print("output coordinate : ", coordinate)
print("coordinate to RAS:")
coordinate = np.array(
[86., 218., 119.]
)
print("input coordinate : ", coordinate)
ras = coordinate_to_ras(
coordinate, origin=origin, matrix=matrix, space=space)
print("output RAS : ", ras)
输出为:
RAS to coordinate:
input RAS : [29.6 37.6 6.1]
output coordinate : [ 85.73972512 218.14819897 118.83805793]
coordinate to RAS:
input coordinate : [ 86. 218. 119.]
output RAS : [29.5257716 37.5534676 6.147712 ]
虽然不是完全相同,但是大概能用吧。