来自itk的vtk的mangle图像

时间:2015-06-12 19:10:55

标签: vtk itk

我正在阅读SimpleITK的图像,但是我在vtk中得到了这些结果吗? 我不确定这里出了什么问题。

请参阅图片here

#### 
CODE 
def sitk2vtk(img): 

    size     = list(img.GetSize()) 
    origin   = list(img.GetOrigin()) 
    spacing  = list(img.GetSpacing()) 
    sitktype = img.GetPixelID() 
    vtktype  = pixelmap[sitktype] 
    ncomp    = img.GetNumberOfComponentsPerPixel() 

    # there doesn't seem to be a way to specify the image orientation in VTK 

    # convert the SimpleITK image to a numpy array 
    i2 = sitk.GetArrayFromImage(img) 
    #import pylab 
    #i2 = reshape(i2, size) 

    i2_string = i2.tostring() 

    # send the numpy array to VTK with a vtkImageImport object 
    dataImporter = vtk.vtkImageImport() 

    dataImporter.CopyImportVoidPointer( i2_string, len(i2_string) ) 

    dataImporter.SetDataScalarType(vtktype) 

    dataImporter.SetNumberOfScalarComponents(ncomp) 

    # VTK expects 3-dimensional parameters 
    if len(size) == 2: 
        size.append(1) 

    if len(origin) == 2: 
        origin.append(0.0) 

    if len(spacing) == 2: 
        spacing.append(spacing[0]) 

    # Set the new VTK image's parameters 
    # 
    dataImporter.SetDataExtent (0, size[0]-1, 0, size[1]-1, 0, size[2]-1) 
    dataImporter.SetWholeExtent(0, size[0]-1, 0, size[1]-1, 0, size[2]-1) 

    dataImporter.SetDataOrigin(origin) 
    dataImporter.SetDataSpacing(spacing) 

    dataImporter.Update() 

    vtk_image = dataImporter.GetOutput() 
    return vtk_image 
### 
END CODE

1 个答案:

答案 0 :(得分:1)

你忽略了两件事:

  1. 执行GetArrayFromImage:
  2. 时会更改订单

    索引和尺寸的顺序在转换过程中需要特别注意。来自http://insightsoftwareconsortium.github.io/SimpleITK-Notebooks/01_Image_Basics.html的SimpleITK笔记本:

      

    ITK的Image类没有括号运算符。它有一个GetPixel,它将一个ITK Index对象作为参数,这是一个按(x,y,z)排序的数组。这是SimpleITK的Image类也用于GetPixel方法的约定。   在numpy中,数组以相反的顺序(z,y,x)索引。

    1. ITK和VTK图像表示之间的坐标发生了变化。从历史上看,在计算机图形学中,存在以这样的方式对准相机的趋势,即正Y轴指向下方。这会导致ITK和VTK图像之间的坐标发生变化。