slicer软件中RAS转换为像素坐标方法

数据是医学图像中的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 ]

虽然不是完全相同,但是大概能用吧。

你可能感兴趣的:(slicer软件中RAS转换为像素坐标方法)