nii文件中的方向理解 您所在的位置:网站首页 rpi是什么意思啊医学 nii文件中的方向理解

nii文件中的方向理解

#nii文件中的方向理解| 来源: 网络整理| 查看: 265

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

1. 方向定义

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

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

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

3.  X、Y、Z坐标轴 不同的X、Y、Z对应的人体的方位可能不一样

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]得水平面)

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

我们用代码来验证一下:  可以看到,simpleITK和nibabel得到的shape是不一样的,nibabel得到的shape和RPI的顺序一致,但是simpleITK得到的是I在第1维。

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

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

 原因是: (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是同一个矩阵,只是他们定义的坐标系不一样和导致显示的不一样而已。

 

这里特别需要注意一下: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)

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

其他: 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

补充: 感觉simpleITK读写数据更好些。它sitk.GetArrayFromImage()后得到的矩阵存储顺序是ZYX, ITK-Snap可视化的顺序是XYZ,最后就是在可视化的时候注意一下plt.imshow()的原点始终在左上角,但是RAI位姿的话,ITK-Snap的冠状面和矢状面可视化是原点在左下角



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有