Как обрезать изображения после регистрации?

Это вопрос о программе vtk.

Я делаю жесткую регистрацию между 3D-МРТ и 3D-изображением США. Размер данных в США намного больше, чем МРТ. Сначала я беру несколько ориентиров на одном и том же органе обоих изображений. Затем я использую «vtkLandmarkTransform», чтобы получить преобразование между этими точками ориентира. Наконец я применяю преобразование к данным МРТ, используя «vtkImageReslice». Так что я получаю огромные данные МРТ.

Как я могу обрезать огромные данные, чтобы новые данные МРТ имели тот же размер, что и изображение в США, и отображали ту же позицию органа, что и изображение в США?

Это мой код

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

Решение

Извините ребята. Я сделал глупую ошибку в этой части.

Я беру ориентиры МРТ по координате с началом координат (0, 0, 0). Затем я применяю преобразование к данным МРТ, но забываю, что смещение данных МРТ не равно (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();
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector