当前位置: 首页 > article >正文

nii文件中的方向理解

这个方向问题还是绕了我一段时间,这次理了一下,记录理解,原文见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的冠状面和矢状面可视化是原点在左下角

http://www.lryc.cn/news/2417187.html

相关文章:

  • LLT与HLT测试简介
  • Linux内核:Pci设备驱动——设备枚举
  • 老挑毛u盘一键装系统计算机意外地,揭谜一键Ghost的“恶”事 大白菜、老毛桃、通用都不干净...
  • order by、sort by、distribute by sort by 、cluster by、group by order by、partition by order by 解析
  • 4转换vsn格式_文件格式转换麻烦?教你一招,PDF、Word、PPT随便转
  • 抓取sankakucomplex图片
  • DNS(Bind9) Anycast 数据中心部署 最终版
  • Linux淘金记(一):module_init——初始化就该这么写
  • IOS-Moya简单使用-Swift
  • Myo肌电臂环中文入门指南及基于matlab获取Myo臂环信号
  • C++11重写muduo网络库——预备知识
  • 行业分析
  • 为什么有时候启动Activity需要加FLAG_ACTIVITY_NEW_TASK
  • 制作一个简单HTML中华传统文化网页设计源码(HTML+CSS)
  • GRUB4DOS使用大全
  • 《Head first Java》练习
  • asdasdasdasdasdas
  • 位图(bmp)文件格式分析
  • CPU架构名词解释
  • 计算机网络之网络基础网络通信原理(非常重要的网络基础知识,内含思维导图和详细图解)
  • 药娘化女仆公读《乡村振兴战略下传统村落文化旅游设计》晏嘤茹苦辉少许
  • 大家厚爱
  • maven冲突解决-enforcer插件介绍
  • 数学规划模型之线性规划
  • 操作系统实验二·生产者消费者问题
  • CodeProject SenseAI服务器:AI最简单的方法
  • 点对点 端到端的区别
  • 【论文阅读】HGT:Heterogeneous Graph Transformer
  • 网络分析——路径分析
  • [计算机效率] 磁盘优化及清理