一定要注意ITK 中Image的数据类型,很多时候进行ITK计算用的 Float类型
public void ITKImageToVTKImage(SitkImage itkIamge, ref vtkImageData vtkImage)
{
IntPtr ptr = itkIamge.GetBufferAsUInt8();
VectorUInt32 size = itkIamge.GetSize();
int len = (int)size[0] * (int)size[1] * (int)size[2];
VectorDouble spacing = itkIamge.GetSpacing();
uint w = itkIamge.GetWidth();
uint h = itkIamge.GetHeight();
uint d = itkIamge.GetDepth();
vtkImageImport imageImport = new vtkImageImport();
// imageImport.CopyImportVoidPointer(ptr, len);
imageImport.SetImportVoidPointer(ptr, 0);
imageImport.SetDataScalarTypeToUnsignedChar();
imageImport.SetDataExtent(0, (int)size[0] - 1, 0, (int)size[1] - 1, 0, (int)size[2] - 1);
imageImport.SetWholeExtent(0, (int)size[0] - 1, 0, (int)size[1] - 1, 0, (int)size[2] - 1);
imageImport.SetDataSpacing(spacing[0], spacing[1], spacing[2]);
imageImport.Update();
// vtkImageFlip 一次只能转一个轴
vtkImageFlip imageFlipY = new vtkImageFlip();
imageFlipY.SetInputData(imageImport.GetOutput());
// ITK 和 VTK 坐标 y z 是相反的,x-0, y-1, z-2
imageFlipY.SetFilteredAxes(1);
imageFlipY.Update();
vtkImageFlip imageFlipZ = new vtkImageFlip();
imageFlipZ.SetInputData(imageFlipY.GetOutput());
// ITK 和 VTK 坐标 y z 是相反的,x-0, y-1, z-2
imageFlipZ.SetFilteredAxes(2);
imageFlipZ.Update();
vtkImage.DeepCopy(imageFlipZ.GetOutput());
}