使用vtkNIFTIImageReader读取体数据为vtkImageData时只会携带spacing信息,方向和原点信息不会写入,需要获取QFormMatrix进行解析。
1、方向及原点读取
vtkSmartPointer<vtkNIFTIImageReader> niiReader = vtkSmartPointer<vtkNIFTIImageReader>::New();niiReader->SetFileName(path.c_str());niiReader->Update();vtkMatrix4x4* transform_matrix = niiReader->GetQFormMatrix();
获取4*4矩阵后使用GetElement(int i, int j)获取索引值,前三列为三个轴的方向,最后一列为偏移量也就是数据原点位置。
vtk里面采用的RAS右手坐标系,dicom坐标系以及主流看图ITK-Snap等软件采用的LPS坐标系,所以原点等信息需要换算一下。
图一:dicom坐标系
2、方向及原点写入
例:LPS坐标系信息写入
vtkSmartPointer<vtkMatrix4x4> matrix = vtkSmartPointer<vtkMatrix4x4>::New(); // 坐标系设为LPSconst double matrix_elemnt[16] = {-1, 0, 0, origin[0] * -1,0, -1, 0, origin[1] * -1,0, 0, 1, origin[2] * 1,0, 0, 0, 1};matrix->DeepCopy(matrix_elemnt);vtkSmartPointer<vtkNIFTIImageWriter> niiWriter = vtkSmartPointer<vtkNIFTIImageWriter>::New();niiWriter->SetFileName(file_name.c_str());niiWriter->SetInputData(data);niiWriter->SetQFormMatrix(matrix);niiWriter->Write();