2015-06-12 6 views
0

Я читаю образ из SimpleITK, но получаю эти результаты в vtk любую помощь? Я не уверен, где все происходит неправильно.mangle images of vtk from itk

См. Изображение 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

Вы игнорируете две вещи:

  1. Существует изменение порядка при выполнении GetArrayFromImage:

Порядок индекса и размеров необходимо особое внимание в процессе преобразования. Цитата из ноутбуков SimpleITK на http://insightsoftwareconsortium.github.io/SimpleITK-Notebooks/01_Image_Basics.html:

Класс изображения ITK не имеет оператора скобки. Он имеет GetPixel, который принимает объект ITK Index в качестве аргумента, который является массивом, упорядоченным как (x, y, z). Это соглашение, которое класс ImageIT для SimpleITK использует также для метода GetPixel. Пока в numpy массив индексируется в противоположном порядке (z, y, x).

  1. Смена координат между изображениями ITK и VTK изображений. Исторически сложилось так, что в компьютерной графике существует тенденция к выравниванию камеры таким образом, что положительная ось Y направлена ​​вниз. Это приводит к изменению координат между изображениями ITK и VTK.
+0

Hi siavashk, спасибо за ответ. как я заметил в списке vtk-users ... Я нашел виновника! Я передавал список имен файлов, вычисленных за пределами ImageSeriesReader, в ImageSeriesReader. Я думал, что он будет сортировать имена файлов для меня, но это не так. Теперь я использую dcm_series_filenames = reader.GetGDCMSeriesFileNames (dcm_dir, seriesUID), а затем reader.SetFileNames (dcm_series_filenames), так как я уже получил serialUID и список файлов – user1301295