使用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里面存储NII默认为RAS坐标系,dicom坐标系以及主流看图ITK-Snap等软件采用的LPS坐标系,所以原点等信息需要换算一下。
图一:dicom坐标系
2、方向及原点写入
例:LPS坐标系信息写入
vtkSmartPointer<vtkMatrix4x4> matrix = vtkSmartPointer<vtkMatrix4x4>::New(); // 坐标系设为LPS
const 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();