2013-04-24 17 views
0

這是一個關於vtk程序的問題。如何在註冊後裁剪圖像數據?

我在3D MRI和3D美國圖像之間進行了嚴格的註冊。美國數據的規模比MRI要大得多。首先,我在兩幅圖像的同一個器官上繪製一些地標。然後,我使用「vtkLandmarkTransform」來獲得這些界標點之間的變換。最後我通過使用「vtkImageReslice」將變換應用於MRI數據。所以我得到一個巨大的MRI數據。

如何裁剪大量數據以使新的MRI數據具有與美國圖像相同的尺寸並顯示與美國圖像相同的器官位置?

赫斯是我的代碼

vtkSmartPointer<vtkPoints> sourcePoints = vtkSmartPointer<vtkPoints>::New();//Input source points 
for (int t = 0; t < 6; t++) 
{ 
    float sourcePoint[3] = {inital_points_mri[t][0], inital_points_mri[t][1], inital_points_mri[t][2]}; 
    sourcePoints->InsertNextPoint(sourcePoint); 
} 

vtkSmartPointer<vtkPoints> targetPoints = vtkSmartPointer<vtkPoints>::New();//Input target points 
for (int t = 0; t < 6; t++) 
{ 
    float targetPoint[3] = {inital_points_us[t][0], inital_points_us[t][1], inital_points_us[t][2]}; 
    targetPoints->InsertNextPoint(targetPoint); 
} 

vtkSmartPointer<vtkLandmarkTransform> landmarkTransform = vtkSmartPointer<vtkLandmarkTransform>::New();//get landmark transform 
landmarkTransform->SetSourceLandmarks(sourcePoints); 
landmarkTransform->SetTargetLandmarks(targetPoints); 
landmarkTransform->SetModeToSimilarity(); 
landmarkTransform->Update(); 

vtkSmartPointer<vtkImageReslice> transform2 = vtkSmartPointer<vtkImageReslice>::New(); // Apply transform 
transform2->SetInput(MRIimagedata); // Input MRI image 
transform2->AutoCropOutputOn(); // I'm not sure I need it or not? 
// transform2->SetOutputExtent(0,499,0,489,0,358); // set the extent as US data, but can't get the same organ position 
landmarkTransform->Inverse(); 
transform2->SetResliceTransform(landmarkTransform); 
transform2->Update(); 
vtkImageData* transformImage = transform2->GetOutput(); 

感謝您的關注。

+0

我也問VTK用戶郵件列表中的問題。但沒有收到重播。所以請不要建議我這樣做:) – Yao 2013-04-24 13:18:43

+0

「我如何裁剪大量數據以使新的MRI數據具有與美國圖像相同的尺寸」 如果兩個圖像數據的大小相同,您如何裁剪?你的意思是你想調整它的大小? – 2013-04-24 21:47:42

+0

@TanyunLing不,他們沒有相同的尺寸。我在圖像器官的地標之間進行轉換。所以變換將保持器官具有相同的大小,但不是圖像。 – Yao 2013-04-25 11:37:17

回答

0

對不起,夥計們。我在這部分犯了一個愚蠢的錯誤。

我在原點座標(0,0,0)上拍攝MRI的地標。然後我將變換應用於MRI數據,但忘記了MRI數據的偏移不是(0,0,0)。這就是爲什麼我不能得到正確的結果。

回到我的問題:如何使用VTK裁剪圖像數據? 答案很簡單:設定輸出來源和使用下面的代碼擴展參數:

vtkSmartPointer<vtkImageReslice> transform2 = vtkSmartPointer<vtkImageReslice>::New(); 
transform2->SetInput(MRIimagedata); 
// transform2->AutoCropOutputOn(); //It's not necessary 
landmarkTransform1->Inverse(); 
transform2->SetResliceTransform(landmarkTransform1); 
transform2->SetOutputOrigin(0,0,0); //set the origin of new image data. It's where we start our crop 
transform2->SetOutputExtent(0,499,0,489,0,358); //set the range to crop from big data 

如果轉換是正確的,你會得到正確的結果。

這裏是我的代碼

// read MRI image data 
vtkSmartPointer<vtkMetaImageReader> reader1 = 
    vtkSmartPointer<vtkMetaImageReader>::New(); 
reader1->SetFileName("MRI.mhd"); 
reader1->Update(); 
vtkImageData* MRIimagedata = reader1->GetOutput(); 
double* origin_MRI = MRIimagedata->GetOrigin(); 

// generate landmark transforms 
vtkSmartPointer<vtkPoints> sourcePoints1 = vtkSmartPointer<vtkPoints>::New();//Input landmarks on MRI data, should add the offset of MRI data 
for (int t = 0; t < 6; t++) 
{ 
    float sourcePoint1[3] = {inital_points_mri[t][0]+origin_MRI[0], inital_points_mri[t][1]+origin_MRI[1], inital_points_mri[t][2]+origin_MRI[2]}; 
    sourcePoints1->InsertNextPoint(sourcePoint1); 
} 

vtkSmartPointer<vtkPoints> targetPoints1 = vtkSmartPointer<vtkPoints>::New();//input landmarks on US data, the offset of US is (0,0,0) 
for (int t = 0; t < 6; t++) 
{ 
    float targetPoint1[3] = {inital_points_us[t][0], inital_points_us[t][1], inital_points_us[t][2]}; 
    targetPoints1->InsertNextPoint(targetPoint1); 
} 

vtkSmartPointer<vtkLandmarkTransform> landmarkTransform1 = vtkSmartPointer<vtkLandmarkTransform>::New(); 
landmarkTransform1->SetSourceLandmarks(sourcePoints1); 
landmarkTransform1->SetTargetLandmarks(targetPoints1); 
landmarkTransform1->SetModeToSimilarity(); 
landmarkTransform1->Update(); 

vtkSmartPointer<vtkImageReslice> transform2 = vtkSmartPointer<vtkImageReslice>::New(); 
transform2->SetInput(MRIimagedata); 
// transform2->AutoCropOutputOn(); 
landmarkTransform1->Inverse(); 
transform2->SetResliceTransform(landmarkTransform1); 
transform2->SetOutputOrigin(0,0,0); 
transform2->SetOutputExtent(0,499,0,489,0,358); 
transform2->Update(); 
vtkImageData* transformImage = transform2->GetOutput();