2013-01-25 39 views
0

我想讀取一系列2D dicom圖像。然後,我會將其顯示爲3D音量。爲此,我遵循了這一步驟:vtkgdcmimagereader用於體繪製

1- IPP分揀機 2- setfilenames 3- vtkimagechangeinformation

這些之後,我試圖使用vtkimageviewer2可視化它們。 我發送幾乎所有我寫的代碼。我很確定它加載和排序圖像。但它給像

錯誤分揀成功:0.5

排序成功:1.5

該方案已完成意外。

這裏是我的代碼:

vtkGDCMImageReader *dicomReader = 
vtkGDCMImageReader::New(); 

std::vector<std::string> filenames; 
const char *filename = "/home/telemed/Downloads/Dentascan"; 

gdcm::Directory d; 
d.Load(filename, false); 

filenames = d.GetFilenames(); 

gdcm::IPPSorter s; 

s.SetComputeZSpacing(true); 

s.SetZSpacingTolerance(1e-3); 

bool b = s.Sort(filenames); 

if(!b) 

{ 

    std::cerr << "Failed to sort:" << "s" << std::endl; 

    return 1; 

} 

std::cout << "Sorting succeeded:" << s.GetZSpacing() << std::endl; 

//s.Print(std::cout); 

const std::vector<std::string> & sorted = s.GetFilenames(); 


vtkStringArray *files =vtkStringArray::New(); 

std::vector<std::string>::const_iterator it = sorted.begin(); 

for(; it != sorted.end(); ++it) 

{ 

    const std::string &f = *it; 


    files->InsertNextValue(f.c_str()); 

} 

dicomReader->SetFileNames(files); 

//dicomReader->Update(); 

vtkImageChangeInformation *changer = 

vtkImageChangeInformation::New(); 

changer->SetInputConnection(dicomReader->GetOutputPort()); 

changer->SetOutputSpacing(VTK_DOUBLE_MAX,VTK_DOUBLE_MAX, 2.0); 

changer->Update(); 


vtkInteractorStyleImage *imageStyle =vtkInteractorStyleImage::New(); 

vtkRenderWindowInteractor *interactor =vtkRenderWindowInteractor::New(); 

/Calculate the center of the volume 

dicomReader->GetOutput()->UpdateInformation(); 
int extent[6]; 

double spacing[3]; 

double origin[3]; 

dicomReader->GetOutput()->GetWholeExtent(extent); 

dicomReader->GetOutput()->GetSpacing(spacing); 

dicomReader->GetOutput()->GetOrigin(origin); 

spacing[2] = 1.5; 

vtkImageData* image = vtkImageData ::New(); 

image->SetSpacing(spacing); 

std::cout << "Sorting succeeded:" << spacing[2] << std::endl; 

double center[3]; 

center[0] = origin[0] + spacing[0] * 0.5 * (extent[0] + extent[1]); 

center[1] = origin[1] + spacing[1] * 0.5 * (extent[2] + extent[3]); 

center[2] = origin[2] + spacing[2] * 0.5 * (extent[4] + extent[5]); 

// Matrices for axial, coronal, sagittal, oblique view orientations 

static double axialElements[16] = { 
    1, 0, 0, center[0], 

    0, 1, 0, center[1], 

    0, 0, 1, center[2], 

    0, 0, 0, 1 }; 

static double coronalElements[16] = { 

    1, 0, 0, center[0], 

    0, 0, 1, center[1], 

    0,-1, 0, center[2], 

    0, 0, 0, 1 }; 

static double sagittalElements[16] = { 

    0, 0,-1, center[0], 

    1, 0, 0, center[1], 

    0,-1, 0, center[2], 

    0, 0, 0, 1 }; 

// Set the slice orientation 

vtkMatrix4x4 *resliceAxes = vtkMatrix4x4::New(); 

resliceAxes->DeepCopy(coronalElements); 


vtkImageReslice *Reslice = vtkImageReslice::New(); 

Reslice->SetInputConnection(changer->GetOutputPort()); 

Reslice->SetOutputDimensionality(3); 

Reslice->SetResliceAxes(resliceAxes); 

Reslice->SetInterpolationModeToLinear(); 

vtkImageViewer2 *viewer = vtkImageViewer2::New(); 

viewer->SetupInteractor(interactor); 

viewer->SetSize(500,500); 

viewer->SetColorWindow(1024); 

viewer->SetColorLevel(800); 

viewer->SetInputConnection(Reslice->GetOutputPort()); 

// Create a greyscale lookup table 

vtkLookupTable *table = vtkLookupTable::New(); 

table->SetRange(0, 200); // image intensity range 

table->SetValueRange(0.0, 1.0); // from black to white 

table->SetSaturationRange(0.0, 0.0); // no color saturation 

table->SetRampToLinear(); 

table->Build(); 

// Map the image through the lookup table 

vtkImageMapToColors *color = vtkImageMapToColors::New(); 

color->SetLookupTable(table); 

color->SetInputConnection(Reslice->GetOutputPort()); 

// Display the image 

vtkImageActor *actor = vtkImageActor::New(); 

actor->SetInput(color->GetOutput()); 

vtkRenderer *renderer = vtkRenderer::New(); 

renderer->AddActor(actor); 

vtkRenderWindow *window = vtkRenderWindow::New(); 

window->AddRenderer(renderer); 

interactor->SetInteractorStyle(imageStyle); 

window->SetInteractor(interactor); 

window->Render(); 

interactor->Start(); 

感謝您的幫助。

回答

0

您可以嘗試簡化您的代碼並確定問題來自何處。使用分而治之的方法。註釋掉你的代碼的後半部分,重新​​編譯並運行它。

0

嘗試實施VTK_gdcmorthoplanes。