Визуализация с использованием VTK и Python, приводящая к полурегулярному шаблону - PullRequest
1 голос
/ 27 февраля 2012

Привет и заранее спасибо за ваше время.

В настоящее время я создаю пакет программного обеспечения, который позволит пользователю визуализировать импортированные данные.В настоящее время я использую данные в формате .txt с размерами 120 столбцов на 24320 строк.Который я импортирую и конвертирую в 3D сетку с размерами 120x128x190.Затем я сравниваю эти данные с пороговым значением и назначаю значение 1 для любых ячеек, значение которых превышает пороговое значение.Это все нормально, и я даже вручную проверил данные, сохранив их и перепроверив их с txt-файлом, и это было правильно, однако я не могу заставить визуализацию работать правильно, и вместо вывода формы сердца она дает очень регулярную сетку, такую ​​какшаблон (см. http://img855.imageshack.us/img855/4944/vtk.png). Я действительно рву свои волосы, пытаясь заставить это работать, поэтому любая помощь будет очень цениться. Код, который я сейчас использую:

import vtk
from vtk.util import vtkImageImportFromArray
from numpy import *

#intensity threshold 900000

# import the data
# read files
intensityI=[]

print("Reading files...")

in_file = open("intensity.txt", "rt")
for line in in_file.readlines():
    intensityI.append([])
    for i in line.split():
        intensityI[-1].append(float(i))
in_file.close()

print("...done")

#set parameters specific to data
nx = 119
ny = 127
nz = 189
sizex=nx+1
sizey=ny+1
sizez=nz+1
threshold = 900000

#convert to array
I = zeros((sizez, sizex, sizey))
It = zeros((sizez, sizex, sizey), dtype=uint8)

print("converting to 3D array...")
z=0
while z<sizez:
    x=0
    while x<sizex:
        y=0
        while y<sizey:
            I[z][x][y] = int(intensityI[(z*128)+y][x])
            #print(I[z][x][y])
            #print(int(intensityI[(z*128)+y][x]))
            if I[z][x][y] > threshold:
                It[z][x][y] = 1
            y += 1
        x += 1
    z += 1

print("...done")

print("converting to string...")

# I now contains raw intensity information
# It contains thesholded intensity

dataImporter = vtk.vtkImageImport()
data_string = It.tostring()
dataImporter.CopyImportVoidPointer(data_string, len(data_string))
dataImporter.SetDataScalarTypeToUnsignedChar()
dataImporter.SetNumberOfScalarComponents(1)
dataImporter.SetDataExtent(0, nz, 0, ny, 0, nx)
dataImporter.SetWholeExtent(0, nz, 0, ny, 0, nx)

print("...done")
print("drawing...")

alphaChannelFunc = vtk.vtkPiecewiseFunction()
alphaChannelFunc.AddPoint(1, 0.05)
alphaChannelFunc.AddPoint(0, 0.0)

colorFunc = vtk.vtkColorTransferFunction()
colorFunc.AddRGBPoint(1, 1.0, 0.0, 0.0)
#colorFunc.AddRGBPoint(0, 0.0, 1.0, 0.0)

volumeProperty = vtk.vtkVolumeProperty()
volumeProperty.SetColor(colorFunc)
volumeProperty.SetScalarOpacity(alphaChannelFunc)

compositeFunction = vtk.vtkVolumeRayCastCompositeFunction()
volumeMapper = vtk.vtkVolumeRayCastMapper()
volumeMapper.SetVolumeRayCastFunction(compositeFunction)
volumeMapper.SetInputConnection(dataImporter.GetOutputPort())

volume = vtk.vtkVolume()
volume.SetMapper(volumeMapper)
volume.SetProperty(volumeProperty)

renderer = vtk.vtkRenderer()
renderWin = vtk.vtkRenderWindow()
renderWin.AddRenderer(renderer)
renderInteractor = vtk.vtkRenderWindowInteractor()
renderInteractor.SetRenderWindow(renderWin)

renderer.AddVolume(volume)
renderer.SetBackground(0,0,0)
renderWin.SetSize(400, 400)

def exitCheck(obj, event):
    if obj.GetEventPending() != 0:
        obj.SetAbortRender(1)

renderWin.AddObserver("AbortCheckEvent", exitCheck)

renderInteractor.Initialize()
renderWin.Render()
renderInteractor.Start()     
print("...done")

Я предполагаю, что проблема связана с моим использованием numy массивов, поэтому я попытался использовать vtkStructuredPoints, но если я пытаюсь записать 1 в массив vtkStrucutredPoints, я получаю следующую ошибку: TypeError: объект 'vtkobject' не может быть подписан в строкеIt[z][x][y] = 1, поэтому я не уверен, что означает это сообщение об ошибке.

Код, который я использую для создания массива vtkStructuredPoints, равен

It = vtkStructuredPoints() 
It.SetDimensions(sizez, sizex, sizey) 
It.SetOrigin(0.0, 0.0, 0.0) 
It.SetSpacing(1.0, 1.0, 1.0) 

Большое спасибо за любую помощь или указатели, которые выможет быть в состоянии предложить.

Джон

...