Sto cercando di calcolare texture features
per una risonanza magnetica cerebrale 3D segmentata utilizzando la libreria ITK con C++. Così ho seguito questo example. L'esempio prende uno 3D image
ed estrae 3 funzioni diverse per tutte le 13 possibili direzioni spaziali. Nel mio programma, voglio solo per una data immagine 3D di ottenere:ITK - Calcola le caratteristiche della trama per la RM cerebrale segmentata 3D
- Energia
- Correlazione
- inerzia
- Haralick Correlazione
- Differenza Inverse Moment
- Cluster Prominence
- Cluster ombra
Ecco quello che ho finora:
//definitions of used types
typedef itk::Image<float, 3> InternalImageType;
typedef itk::Image<unsigned char, 3> VisualizingImageType;
typedef itk::Neighborhood<float, 3> NeighborhoodType;
typedef itk::Statistics::ScalarImageToCooccurrenceMatrixFilter<InternalImageType>
Image2CoOccuranceType;
typedef Image2CoOccuranceType::HistogramType HistogramType;
typedef itk::Statistics::HistogramToTextureFeaturesFilter<HistogramType> Hist2FeaturesType;
typedef InternalImageType::OffsetType OffsetType;
typedef itk::AddImageFilter <InternalImageType> AddImageFilterType;
typedef itk::MultiplyImageFilter<InternalImageType> MultiplyImageFilterType;
void calcTextureFeatureImage (OffsetType offset, InternalImageType::Pointer inputImage)
{
// principal variables
//Gray Level Co-occurance Matrix Generator
Image2CoOccuranceType::Pointer glcmGenerator=Image2CoOccuranceType::New();
glcmGenerator->SetOffset(offset);
glcmGenerator->SetNumberOfBinsPerAxis(16); //reasonable number of bins
glcmGenerator->SetPixelValueMinMax(0, 255); //for input UCHAR pixel type
Hist2FeaturesType::Pointer featureCalc=Hist2FeaturesType::New();
//Region Of Interest
typedef itk::RegionOfInterestImageFilter<InternalImageType,InternalImageType> roiType;
roiType::Pointer roi=roiType::New();
roi->SetInput(inputImage);
InternalImageType::RegionType window;
InternalImageType::RegionType::SizeType size;
size.Fill(50);
window.SetSize(size);
window.SetIndex(0,0);
window.SetIndex(1,0);
window.SetIndex(2,0);
roi->SetRegionOfInterest(window);
roi->Update();
glcmGenerator->SetInput(roi->GetOutput());
glcmGenerator->Update();
featureCalc->SetInput(glcmGenerator->GetOutput());
featureCalc->Update();
std::cout<<"\n Entropy : ";
std::cout<<featureCalc->GetEntropy()<<"\n Energy";
std::cout<<featureCalc->GetEnergy()<<"\n Correlation";
std::cout<<featureCalc->GetCorrelation()<<"\n Inertia";
std::cout<<featureCalc->GetInertia()<<"\n HaralickCorrelation";
std::cout<<featureCalc->GetHaralickCorrelation()<<"\n InverseDifferenceMoment";
std::cout<<featureCalc->GetInverseDifferenceMoment()<<"\nClusterProminence";
std::cout<<featureCalc->GetClusterProminence()<<"\nClusterShade";
std::cout<<featureCalc->GetClusterShade();
}
Il programma funziona. Tuttavia ho questo problema: Dà la stessi risultati per diverse immagini 3D, anche quando cambio la window size
.
Se uno utilizzato ITK per fare questo? Se c'è qualche altro metodo per raggiungere questo obiettivo, qualcuno potrebbe indicarmi una soluzione per favore?
Ogni aiuto sarà molto apprezzata.
sei sicuro che l'immagine sia letta correttamente? ad esempio, se calcoli qualcosa di semplice come intervallo di intensità dell'ingresso, ottieni i risultati corretti? http://itk.org/Wiki/ITK/Examples/ImageProcessing/MinimumMaximumImageCalculator – lib
@lib Sì l'immagine viene letto correttamente, so che perché ero in grado di visualizzarlo correcty – blackbishop
ho eseguito il codice con la funzione di 'main' preso dalla pagina di esempio (l'unica modifica che ho apportato era all'oggetto 'size' per adattarsi alle dimensioni delle mie immagini particolari) e ho ottenuto risultati diversi per immagini diverse. Come stai leggendo le tue immagini nel tuo programma? Stai usando lo stesso oggetto 'ImageFileReader' per entrambe le immagini?In questo caso, potresti sovrascrivere uno di questi in memoria ed eseguire le operazioni due volte sulla stessa immagine. – eigenchris