КТ Сегментация сосудов головного мозга с использованием ИТК и ВТК - PullRequest
0 голосов
/ 05 ноября 2019

Я делаю свой собственный проект, в котором мне нужно сегментировать мозговые сосуды КТ-изображений. У меня есть 2 набора изображений DICOM.

1)CT dicom images of head with DSA (888 slices)
2)CT dicom images of head without DSA(same 888 slices),

Итак, я прочитал эти две серии по отдельности, используя vtkDICOMImageReader, вычитал эти два набора, используя vtkImageMathematics, и сохранил результат в переменной mat, а затем скопировалэто vtkImageReslice * reslice; Затем я импортировал reslice в ITK, используя VKImageToImageFilter *filter_toitkimage, и использовал этот код:

using HessianFilterType = itk::HessianRecursiveGaussianImageFilter<ImageType>;
HessianFilterType::Pointer hessianFilter = HessianFilterType::New();
hessianFilter->SetInput(filter_toitkimage->GetOutput());
hessianFilter->SetSigma(.6);

using VesselnessMeasureFilterType = itk::Hessian3DToVesselnessMeasureImageFilter<PixelType>;
VesselnessMeasureFilterType::Pointer vesselnessFilter = VesselnessMeasureFilterType::New();
vesselnessFilter->SetInput(hessianFilter->GetOutput());
vesselnessFilter->SetAlpha1(1);
vesselnessFilter->SetAlpha2(2); 

Затем я преобразовал его обратно в VTK, используя ImageToVTKImageFilter, и использовал это:

       vtkSmartPointer<vtkGPUVolumeRayCastMapper> volumeMapper = vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();
volumeMapper->CroppingOff();
volumeMapper->RemoveAllInputs();
volumeMapper->SetInputData(conv->GetOutput());   //conv is the converted output   
volumeMapper->SetBlendModeToMaximumIntensity();
volumeMapper->AutoAdjustSampleDistancesOff();
volumeMapper->SetSampleDistance(.1);

volumeMapper->Update();

//-----volume color
vtkSmartPointer<vtkColorTransferFunction> volumeColor = vtkSmartPointer<vtkColorTransferFunction>::New();
volumeColor->RemoveAllPoints();

////-----volume color

//---air
volumeColor->AddRGBPoint(0, 0.0, 0.0, 0.0);
volumeColor->AddRGBPoint(220, 1, 1, 1);
//---skin
volumeColor->AddRGBPoint(250, 0, 0, 0);
volumeColor->AddRGBPoint(300, 0, 0, 0);
//---muscle
volumeColor->AddRGBPoint(800, 1, 1, 1);
volumeColor->AddRGBPoint(1000, 1, 1, 1);
volumeColor->AddRGBPoint(1320, 1, 1, 1);
//---soft bone
volumeColor->AddRGBPoint(1350, 0, 0, 0);
volumeColor->AddRGBPoint(1500, 0, 0, 0);
//---hard bone
volumeColor->AddRGBPoint(1550, 0, 0, 0);
volumeColor->AddRGBPoint(2000, 0, 0, 0);
//---hardest bone
volumeColor->AddRGBPoint(2050, 0, 0, 0);
volumeColor->AddRGBPoint(4096, 0, 0, 0);

vtkSmartPointer<vtkPiecewiseFunction> volumeScalarOpacity =
    vtkSmartPointer<vtkPiecewiseFunction>::New();
volumeScalarOpacity->AddPoint(0, 0.00);
volumeScalarOpacity->AddPoint(500, 0.15);
volumeScalarOpacity->AddPoint(1000, 0.15);
volumeScalarOpacity->AddPoint(1150, 0.85);

vtkSmartPointer<vtkPiecewiseFunction> volumeGradientOpacity =
    vtkSmartPointer<vtkPiecewiseFunction>::New();
volumeGradientOpacity->AddPoint(0, 0.0);
volumeGradientOpacity->AddPoint(90, 0.5);
volumeGradientOpacity->AddPoint(100, 1.0);

vtkSmartPointer<vtkVolumeProperty> volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New();
volumeProperty->SetColor(volumeColor);
    volumeProperty->SetScalarOpacity(volumeScalarOpacity);
    volumeProperty->SetGradientOpacity(volumeGradientOpacity);
    volumeProperty->SetInterpolationTypeToLinear();
    volumeProperty->ShadeOn();
    volumeProperty->SetAmbient(0.5);
    volumeProperty->SetDiffuse(0.3);
    volumeProperty->SetSpecular(0.3);

    vtkSmartPointer<vtkVolume> volume =vtkSmartPointer<vtkVolume>::New();
    volume->SetMapper(volumeMapper);
    volume->SetProperty(volumeProperty);
    renderer->AddVolume(volume);

У меня сосуды в легких, но я не получил четкого изображения сосудов головного мозга. Кто-нибудь может дать предложения?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

DSA уже означает «Цифровая ангиография вычитания». Поэтому вы не должны выполнять разницу снова, это уже сделано программным обеспечением сканера. То, на что вы смотрите, - это, вероятно, некоторые промежуточные этапы различия, но я, если вы не хотите работать над новой реконструкцией КТ, я бы посоветовал использовать DSA напрямую и больше не делать различий. Обратите внимание, что в PACS это может называться модальностью «XA» для ангиографии (не следует искать модальность «CT»).

Каждая система отличается, это может быть сложно, но я такжепоначалу работали с ангиографическими данными мозга, и это поначалу сбивало меня с толку, поэтому я подумал, что стоит сказать следующее.

Для создания прототипа обнаружения ваших сосудов я бы посоветовал использовать 3D Slicer на первом этапе. Существует плагин библиотеки под названием VMTK, который реализует фильтр по сосудам, но вы также можете добавить другие плагины, особенно один, чтобы получить все фильтры ITK. Я думаю, что проще использовать это в качестве отправной точки, чтобы попробовать некоторые вещи перед реализацией.

Если вы действительно хотите рассчитать DSA самостоятельно, в этом случае вам нужно иметь 2 CT с контрастным агентом и без него(но не DSA), вы должны убедиться, что оба тома отлично зарегистрированы, прежде чем делать разницу. Если вы видите смещение, я бы посоветовал использовать простую среду elastix для регистрации ваших изображений.

Наконец, критическая точка фильтра сосуда - это частота, которую вы выбираете с помощью сигмы. Это в основном определило размер судна. В реализации VTMK вы можете иметь различную частоту, поэтому вы устанавливаете сигма запуска и останова. В Slicer у вас даже есть плагин для поиска правильной сигмы, если вы вводите некоторые проверочные точки вокруг сосудов. Поэтому, если вы можете видеть некоторые сосуды, но не некоторые другие, я бы посоветовал снизить эту сигму = 0,6 до чего-то более низкого (при условии, что сосуды показывают меньшие, чем сосуды легких)

Надеюсь, это поможет!

0 голосов
/ 05 ноября 2019

Ваша передаточная функция предполагает интенсивность КТ, но выходной сигнал фильтра сосудов совсем не похож на него. Это может быть нормализовано до диапазона 0,0-1,0, или диапазона 0-255, или чего-то еще. Вы должны изучить это.

...