nii文件中的方向理解

这个方向问题还是绕了我一段时间,这次理了一下,记录理解,原文见Orientation and Voxel-Order Terminology: RAS, LAS, LPI, RPI, XYZ and All That

1. 方向定义

nii文件中的方向理解_第1张图片

也就是说:superior-inferior -> 头到脚
anterior-posterior -> 正脸到后脑勺
right-left -> 右半边到左半边

这些都是以病人为中心来说的。
还有一个常用的方向是medial-lateral -> 从人的中轴线向左右两边

2. 坐标轴方向和顺序
S/I, R/L, P/A这三对先从每一对选一个,再排序,那有2^3*3*2*1=48种坐标组合,不过比较常用的是下面两种:RAS、LAS

nii文件中的方向理解_第2张图片

3.  X、Y、Z坐标轴
不同的X、Y、Z对应的人体的方位可能不一样
nii文件中的方向理解_第3张图片

4. 文件的存储顺序
这个是我最为困惑的。比如一个.nii文件,里面是一个三位矩阵。比如size是128*256*512的矩阵,那我怎么第一维对应的是哪个轴?
这位作者终于解答了我的疑惑。如下表所示
假如一个.nii文件的Direction是RPI,那存储的顺序就是 R-L within P-A within I-S什么意思?也就是矩阵第1维对应的是R-L(从右到左的方向,取img[i, :, :]得矢状面的图像),第2维对应的是P-A的方向(从后背到正面,取img[:, i, :]得冠状面),第3维对应的是I-S的方向(脚到头,取img[:, :, i]得水平面)
nii文件中的方向理解_第4张图片

顺便提一嘴,这里的Dimension和Orientation是一致的,也就是I-P有481层(481层水平面的图),下面这个图是用ITKSnap打开.nii文件时候截图得的nii文件中的方向理解_第5张图片

我们用代码来验证一下:
nii文件中的方向理解_第6张图片  可以看到,simpleITK和nibabel得到的shape是不一样的,nibabel得到的shape和RPI的顺序一致,但是simpleITK得到的是I在第1维。

接下来我们看看是不是能取得对应的面

nii文件中的方向理解_第7张图片

可以看到,各个面都是对得上的
但是!!
我们显示的和软件ITK-Snap显示的对不上(下图),可以看到,显示出来X轴和Y轴的顺序对不上,需要先顺时针旋转90°,再X、Y轴换顺序(reverse).

nii文件中的方向理解_第8张图片

 原因是:
(1)X、Y次序对不上的原因(需要transpose的原因):plt.imshow()的时候,x坐标是纵向的坐标,y坐标是横向的坐标。这样好像和我们平时想的不太一样,但是这样想好像就一样了,当我们一个pixel的坐标是(i,j),那指的是i行j列,i就是对应的x轴的坐标,但是是第几行,是纵向的。j同理。但是在ITK-Snap里面,x是横向坐标,y是轴向坐标。

 (2)X、Y顺序对不上的原因(需要[::-1]的原因):在plt.imshow()的时候,(0,0)坐标在左上角,但是ITK-Snap的(0,0)在右下角。
所以,加上transpose和reverse操作后,plt.imshow()显示出来的就和ITK-Snap的一样了(如下图)。
总结起来就是,其实ITKSNAP打开的矩阵和nii_img.dataobj是同一个矩阵,只是他们定义的坐标系不一样和导致显示的不一样而已。

nii文件中的方向理解_第9张图片

 nii文件中的方向理解_第10张图片

这里特别需要注意一下:SimpleITK读出来的顺序和nibabel读出来的顺序是不一样的。这是因为SimpleITK是以世界坐标系为参考的,而nibabel是以解剖坐标系为参考的(推测的)。所以RPI对应的Direction向量是(1,0,0,0,-1,0,0,0,1)。注意,ITKSNAP里面显示的RPI是from-to里面的from,而SimpleITK指向的是to,所以RPI相当于LAS,再对到Direction上就对了。

医学影像简介(Medical Imaging Guide)

nii文件中的方向理解_第11张图片

当存储顺序是RPI的时候,那SimpleITK读取出来的顺序是IPR,可以看到下面的显示和SimpleITK的也对上了。

nii文件中的方向理解_第12张图片

其他:
1. simpleITK在使用sitk.GetArrayFromImage()之前和之后的数据存储顺序竟然又不一样!!!

前是RPI(和ITKSnap的一致),后是IPR
关于这个问题,更详细的讨论可以参考:
Why to invert the order of the indices between numpy and SimpleITK? - Engineering - ITK

另:

simpleITK里面一些基本概念Fundamental Concepts — SimpleITK 2.0rc2 documentation

你可能感兴趣的:(医学图像处理,计算机视觉,python,人工智能)