Sorry, guys. I made a stupid mistake in this part.
I take landmarks of MRI on a coordinate with origin (0, 0, 0). Then I apply the transform to MRI data but forget that the offset of MRI data is not (0, 0, 0). That why I can't get the right result.
Back to my question: How to crop image data by using VTK? The answer is very simple: Set output origin and extend parameters by using following code:
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
If the transform is correct, you will get the right result.
Here's my code
// 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();