如何使用 VTK 在 X、Y 和 Z 中旋转 dicom?
How can rotate dicom in the X, Y and Z with VTK?
需要能够在内存中旋转一个dicom块,然后将.mhd写入这个结果。
我知道在VTK中可以配合相机来实现这些效果,vtkimageSlice可以统一裁切。
但是不能旋转的是dicom自己的块在xyz轴上
我看到了这个postFlip a DICOM Image over the x = y Line,
制作vtkTransform的表格,但在新版本的vtk(6.3)中无法使其工作。
我可以这样做
string path;
vtkDICOMImageReader *reader = vtkDICOMImageReader::New();
reader->SetDirectoryName(path.c_str());
reader->Update();
double bounds[6];
reader->GetOutput()->GetBounds(bounds);
vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();
double center[3];
center[0] = (bounds[1] + bounds[0]) / 2.0;
center[1] = (bounds[3] + bounds[2]) / 2.0;
center[2] = (bounds[5] + bounds[4]) / 2.0;
transform->Translate(center[0], center[1], center[2]);
transform->RotateX(90);
transform->Translate(-center[0], -center[1], -center[2]);
vtkSmartPointer<vtkImageReslice> reslice = vtkSmartPointer<vtkImageReslice>::New();
reslice->SetInputConnection(reader->GetOutputPort());
reslice->SetResliceTransform(transform);
reslice->SetInterpolationModeToCubic();
reslice->SetOutputSpacing(reader->GetOutput()->GetSpacing()[0], reader->GetOutput()->GetSpacing()[1], reader->GetOutput()->GetSpacing()[2]);
reslice->SetOutputOrigin(reader->GetOutput()->GetOrigin()[0], reader->GetOutput()->GetOrigin()[1], reader->GetOutput()->GetOrigin()[2]);
reslice->SetOutputExtent(reader->GetOutput()->GetExtent());
//Saida alterada!
reslice->GetOutput();
然后我们保存在.mhd
需要能够在内存中旋转一个dicom块,然后将.mhd写入这个结果。
我知道在VTK中可以配合相机来实现这些效果,vtkimageSlice可以统一裁切。
但是不能旋转的是dicom自己的块在xyz轴上
我看到了这个postFlip a DICOM Image over the x = y Line, 制作vtkTransform的表格,但在新版本的vtk(6.3)中无法使其工作。
我可以这样做
string path;
vtkDICOMImageReader *reader = vtkDICOMImageReader::New();
reader->SetDirectoryName(path.c_str());
reader->Update();
double bounds[6];
reader->GetOutput()->GetBounds(bounds);
vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();
double center[3];
center[0] = (bounds[1] + bounds[0]) / 2.0;
center[1] = (bounds[3] + bounds[2]) / 2.0;
center[2] = (bounds[5] + bounds[4]) / 2.0;
transform->Translate(center[0], center[1], center[2]);
transform->RotateX(90);
transform->Translate(-center[0], -center[1], -center[2]);
vtkSmartPointer<vtkImageReslice> reslice = vtkSmartPointer<vtkImageReslice>::New();
reslice->SetInputConnection(reader->GetOutputPort());
reslice->SetResliceTransform(transform);
reslice->SetInterpolationModeToCubic();
reslice->SetOutputSpacing(reader->GetOutput()->GetSpacing()[0], reader->GetOutput()->GetSpacing()[1], reader->GetOutput()->GetSpacing()[2]);
reslice->SetOutputOrigin(reader->GetOutput()->GetOrigin()[0], reader->GetOutput()->GetOrigin()[1], reader->GetOutput()->GetOrigin()[2]);
reslice->SetOutputExtent(reader->GetOutput()->GetExtent());
//Saida alterada!
reslice->GetOutput();
然后我们保存在.mhd