dcom 和 mhd文件中的坐标系转换(11.10)
在做一些CT图像处理的时候,经常会用到dcom和mhd类型的文件。他们是CT图像的存储形式,在对这两种类型的文件进行一些3D cube截取等操作的时候经常会遇到的问题是坐标系的转化。
以LUNA数据集为例(kaggle比赛中一个关于肺结节识别的项目),经常需要根据数据集中所提供的肺结节的坐标信息来定位到CT图像中该结节的真实位置。LUNA数据集中所提供的结节位置如下图所示:
图1
图中可以看到结节的位置的坐标,该坐标为世界坐标。当我们把CT 图像通过simpleitk包读取并转换成数组格式后,实际上图像已经从世界坐标系转换成了图像坐标系。相应的,如果我们想准确的在数组格式的CT图像中准确的找到结节的坐标位置和大小,则需要将上图的结节世界坐标系也转换成图像坐标系的值,然后再在数组中的相应位置进行截取。
要完成坐标系的转换,需要用到CT图像中的两个参数,origin(CT图像在世界坐标系中的原点,即CT图像左上角顶点的坐标)和spacing(CT图像中在x, y, z轴上两个像素间的单位距离, 单位为mm)。 origin 和 spacing的获取方式代码为:
origin = numpy.array(itk_img.GetOrigin())
spacing = numpy.array(itk_img.GetSpacing())
有了上面的两个值,便可以进行世界坐标系到图像坐标系的转换了,具体方法为:
像素坐标 = (世界坐标 - origin)/ spacing
与此同时,图1中所对应的直径也应该做相应的变换,具体方法为
像素直径= diameter / spacing
这里的spacing要结合具体的情况取不同的值,因为有可能x,y, z轴的像素点距离是不同的,所以我们在截取不同的方向上的肺结节的时候,所对应的spacing应该按照其相对应的数值进行操作。
注:有一个需要注意的地方是,我们所获取到的origin 和 spacing的值,通常情况下所对应的坐标系为 x, y, z. 但是在通过simpleitk所生成的CT 数组中,它所对应的坐标系为 z, y, x. 这需要我们在做结节截取的时候注意不要弄错了方向。