TEMA D’ANNO IN �SISTEMI DIAGNOSTICI TERAPEUTICI ASSISTENZIALI
Segmentazione semiautomatica di sotto-regioni tumorali nel
Neuroimaging strutturale
Docenti:
Prof. Ing. Vitoantonio BEVILACQUA, Ph.D.
Ing. Antonio BRUNETTI, Ph.D.
Studentesse:
Chiara Bungaro
Alessandra Algieri
Dipartimento di Ingegneria Elettrica e dell’Informazione
�CORSO DI LAUREA MAGISTRALE IN INGEGNERIA DEI SISTEMI MEDICALI
Politecnico di Bari
Anno Accademico 2020/2021
Introduction
Glioblastoma Multiforme
Brain Tumors
Sub-Regions of Brain Tumors
Neuroimaging
Neuroimaging
Magnetic Resonance Imaging (MRI)
Magnetic Resonance Imaging (MRI)
Aim of The Project
Aim of The Project
Tools
BraTS Dataset
T1-Weighted MRI
T1 039 patient CORONAL SLICE
T1 039 patient SAGITTAL SLICE
T1 039 patient AXIAL SLICE
T1-Weighted MRI with gadolinium contrast (T1Gd)
T1Gd 039 patient CORONAL SLICE
T1Gd 039 patient SAGITTAL SLICE
T1Gd 039 patient AXIAL SLICE
T2-Weighted MRI
T2 039 patient CORONAL SLICE
T2 039 patient SAGITTAL SLICE
T2 039 patient AXIAL SLICE
T2 Fluid Attenuated Inversion Recovery (T2-FLAIR)
T2-FLAIR patient CORONAL SLICE
T2-FLAIR 039 patient SAGITTAL SLICE
T2-FLAIR 039 patient AXIAL SLICE
BraTS Annotations and Structures
NIfTI
3D Visualization with VTK
using PixelType = signed short;
const int Dimension3D = 3;
using ImageType = itk::Image<PixelType, Dimension3D>;
using ReaderType = itk::ImageFileReader<ImageType>;
using ImageIOType = itk::NiftiImageIO;
ImageIOType::Pointer niftiImageIO = ImageIOType::New();
ReaderType::Pointer niftiReader = ReaderType::New();
niftiReader->SetFileName("BraTS20_Training_002_t1_resized.nii");
niftiReader->SetImageIO(niftiImageIO);
niftiReader->Update();
itk::ViewImage<ImageType>::View(niftiReader->GetOutput());
Conversion to 2D slices
using WriterType = itk::ImageFileWriter<SliceImageType>;
using FilterType = itk::ExtractImageFilter<ImageType, SliceImageType>;
using RescaleFilterType = itk::RescaleIntensityImageFilter< SliceImageType, SliceImageType >;
ImageType::RegionType Region = orienter->GetLargestPossibleRegion();
ImageType::SizeType size = Region.GetSize();
itk::Size<3U> regionSize = size;
// CREAZIONE SLICE 2D ASSIALI
for (int i = 0; i < 232; i++) {
std::string sAX = std::to_string(i + 1);
string outputFilenameAX = "./sliceFolderAxialFLAIR/" + sAX + "_BraTS20_slice_axial.nii";
std::string seriesPathAX = "./sliceFolderAxialFLAIR/";
WriterType::Pointer niftiWriterAX = WriterType::New();
itksys::SystemTools::MakeDirectory(seriesPathAX);
SetCurrentDirectory(seriesPathAX);
ImageIOType::Pointer niftiImageIOAX = ImageIOType::New();
niftiWriterAX->SetFileName(outputFilenameAX);
niftiWriterAX->SetImageIO(niftiImageIOAX);
FilterType::Pointer FilterAX = FilterType::New();
FilterAX->InPlaceOn();
FilterAX->SetDirectionCollapseToSubmatrix();
orienter->UpdateOutputInformation();
ImageType::RegionType inputRegionAX = oAX->GetLargestPossibleRegion();
ImageType::SizeType sizeAX = inputRegionAX.GetSize();
sizeAX[2] = 0;
ImageType::IndexType startAX = inputRegionAX.GetIndex();
const unsigned int sliceNumberAX = i;
startAX[2] = sliceNumberAX;
ImageType::RegionType desiredRegionAX;
desiredRegionAX.SetSize(sizeAX);
desiredRegionAX.SetIndex(startAX);
FilterAX->SetExtractionRegion(desiredRegionAX);
FilterAX->SetInput(oAX);
RescaleFilterType::Pointer rescalefilterAX = RescaleFilterType::New();
rescalefilterAX->SetInput(FilterAX->GetOutput());
niftiWriterAX->SetInput(rescalefilterAX->GetOutput());
niftiWriterAX->Update();
}
Conversion to 2D slices
T1 002 patient AXIAL SLICES
T1 002 patient SAGITTAL SLICES
T1 002 patient CORONAL SLICES
Proposed Workflow
MRI T2-FLAIR scans
Contrast Enhancement
Region Growing
Dilation and Filling
Mesh Generation
Volume Rendering
Feature Extraction
Segmentation Evaluation
Adaptive Histogram Equalization
Connected Threshold / Neighborhood Connected
Sørensen similarity index / Jaccard index
Area / Volume / Compactness
Contrast Enhancement
Contrast Enhancement
Adaptive Histogram Equalization
Adaptive Histogram Equalization
002 FLAIR
002 FLAIR Histogram
002 FLAIR Equalized
002 FLAIR Equalized Histogram
Region Growing
Connected Threshold
// CONNECTED THRESHOLD IMAGE FILTER
using RegionGrowingFilterType = itk::ConnectedThresholdImageFilter<ImageType, ImageType>;
RegionGrowingFilterType::Pointer rgfilterTC = RegionGrowingFilterType::New();
rgfilterTC->SetInput(sliceReaderTC->GetOutput());
rgfilterTC->SetLower(0);
rgfilterTC->SetUpper(460);
rgfilterTC->SetReplaceValue(1);
seedTC[0] = 117;
seedTC[1] = 155;
seedTC[2] = 83;
rgfilterTC->SetSeed(seedTC);
rgfilterTC->Update();
tc = rgfilterTC->GetOutput();
Connected Threshold
Neighborhood Connected
// NEIGHBORDHOOD CONNECTED IMAGE FILTER
using RegionGrowingFilterType2 = itk::NeighborhoodConnectedImageFilter<ImageType, ImageType>;
RegionGrowingFilterType2::Pointer rgfilterED = RegionGrowingFilterType2::New();
rgfilterED->SetInput(sliceReaderED->GetOutput());
rgfilterED->SetLower(450);
rgfilterED->SetUpper(1001);
rgfilterED->SetReplaceValue(2);
seedED[0] = 133;
seedED[1] = 196;
seedED[2] = 91;
rgfilterED->SetSeed(seedED);
ImageType::SizeType indexRadiusED;
indexRadiusED[0] = 2; // radius along x
indexRadiusED[1] = 2; // radius along y
indexRadiusED[2] = 2; // radius along z
rgfilterED->SetRadius(indexRadiusED);
rgfilterED->Update();
ed = rgfilterED->GetOutput();
Dilation and Filling
Segmentation Results
002 tumor core
002 edema
Segmentation Results
002 equalized
002 edema
002 tumor core
023 equalized
023 edema
023 tumor core
039 equalized
039 edema
039 tumor core
042 equalized
042 edema
042 tumor core
Segmentation Results
048 equalized
048 edema
048 tumor core
053 equalized
053 edema
053 tumor core
061 equalized
061 edema
061 tumor core
115 equalized
115 edema
115 tumor core
Segmentation Results
117 equalized
117 edema
117 tumor core
121 equalized
121 edema
121 tumor core
192 equalized
192 edema
192 tumor core
219 equalized
219 edema
219 tumor core
Segmentation Results
285 equalized
285 edema
285 tumor core
366 equalized
366 edema
366 tumor core
Contour Extraction
002 tumor core contour
002 edema contour
//ESTRAZIONE CONTORNI
using BinaryContourFilterType = itk::BinaryContourImageFilter<ImageType, ImageType>;
BinaryContourFilterType::Pointer bcfilterTC = BinaryContourFilterType::New();
bcfilterTC->SetInput(orienterTC->GetOutput());
bcfilterTC->SetFullyConnected(true);
bcfilterTC->SetForegroundValue(1);
bcfilterTC->SetBackgroundValue(0);
bcfilterTC->Update();
contourTC = bcfilterTC->GetOutput();
itk::ViewImage<ImageType>::View(contourTC);
Mesh Generation
Mesh Generation
//MESH TUMOR CORE
using MeshTrait = itk::DefaultDynamicMeshTraits<PixelType>;
typedef itk::Mesh<PixelType, 3, MeshTrait> MeshType;
using MeshSourceType = itk::BinaryMask3DMeshSource<ImageType, MeshType>;
MeshSourceType::Pointer meshSource = MeshSourceType::New();
meshSource->SetInput(tc);
meshSource->SetObjectValue(1);
meshSource->Update();
typedef itk::SimplexMesh<PixelType, 3, MeshTrait> SimplexMeshType;
using CalculatorType = itk::SimplexMeshVolumeCalculator<SimplexMeshType>;
typedef itk::TriangleMeshToSimplexMeshFilter<MeshType, SimplexMeshType> TriangleToSimplexFilter;
TriangleToSimplexFilter::Pointer Transform = TriangleToSimplexFilter::New();
Transform->SetInput(meshSource->GetOutput());
Transform->Update();
CalculatorType::Pointer Calculator = CalculatorType::New();
Calculator->SetSimplexMesh(Transform->GetOutput());
Calculator->Compute();
std::cout << "Volume TUMORE CORE = " << Calculator->GetVolume() <<" mm^3"<< std::endl;
std::cout << "Area TUMOR CORE = " << Calculator->GetArea() << " mm^2" << std::endl;
Compactness 3D
002 whole tumor
Compactness 3D: Results
Volume Rendering
Volume Rendering: Results
002 volume rendering
002 ground truth
Volume Rendering: Results
002
023
039
042
048
053
061
115
117
121
Volume Rendering: Results
192
219
285
366
Segmentation Evaluation
calcolate, ripettivamente, mediante il SimilarityIndexImageFilter e il LabelOverlapMeasuresImageFilter di ITK.
Segmentation Evaluation
// SIMILARITY INDEX TUMOR CORE
using SimilarityIndexImageFilterType = itk::SimilarityIndexImageFilter<ImageType, ImageType>;
SimilarityIndexImageFilterType::Pointer similarity_filter = SimilarityIndexImageFilterType::New();
similarity_filter->SetInput1(tc_seg);
similarity_filter->SetInput2(readerTC3->GetOutput());
similarity_filter->Update();
cout << "SIMILARITY INDEX TUMOR CORE: " << similarity_filter->GetSimilarityIndex() << endl;
// JACCARD TUMOR CORE
using LabelOverlapMeasuresImageFilterType = itk::LabelOverlapMeasuresImageFilter<ImageType>;
typename LabelOverlapMeasuresImageFilterType::Pointer LabelOverlapfilter = LabelOverlapMeasuresImageFilterType::New();
LabelOverlapfilter->SetSourceImage(readerTC3->GetOutput());
LabelOverlapfilter->SetTargetImage(tc_seg);
LabelOverlapfilter->Update();
cout << "JACCARD TUMOR CORE: " << LabelOverlapfilter->GetJaccardCoefficient() << endl;
Segmentation Evaluation: Results
Conclusions and Clinical Applications
Conclusions and Clinical Applications
Grazie per l’attenzione