2015-04-10 26 views
6

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.

+0

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

+0

@lib Sì l'immagine viene letto correttamente, so che perché ero in grado di visualizzarlo correcty – blackbishop

+0

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

risposta

2

penso che le immagini hanno solo un livello di grigio. Ad esempio, se si segmentano le immagini utilizzando lo strumento itk-snap, quando si salva il risultato della segmentazione, itk-snap salvarlo con un livello di scala di grigi. Quindi, se si tenta di calcolare le caratteristiche di texture per le immagini segmentato con itk-snap avrai sempre gli stessi risultati anche se si modificano le immagini o le dimensioni della finestra, perché hai solo un livello di grigio nella matrice di co-occorrenza. Prova ad eseguire il tuo programma usando immagini non segmentate, avrai certamente risultati diversi.

EDIT:

Per calcolare le caratteristiche di struttura per le immagini segmentate, provare un altro metodo di segmentazione che salva i livelli originali scala di grigi dell'immagine non segmentato.

+0

Ecco fatto! Ho usato immagini non segmentate e mi dà risultati diversi. Grazie per la risposta. Ma come posso fare con le immagini segmentate? – blackbishop

+0

Ho modificato la mia risposta, per favore guardatela –

0

Qualcosa di strano nel codice è size.Fill(50), mentre nell'esempio mostrano che dovrebbe contenere la dimensione dell'immagine:

size.Fill(3); //window size=3x3x3 
+0

No, 'size.Fill (3)' non rappresenta le dimensioni dell'immagine, ma contiene la dimensione della regione di interesse 'roi'. La dimensione 'window' è necessaria per calcolare la matrice di co-occorrenza del livello di grigio e non ha nulla a che fare con le dimensioni dell'immagine. – blackbishop

+0

sì, scusa lo vedo ora .. Ma sei in grado di ottenere risultati diversi per diverse regioni di interesse? (visualizzandoli o calcolando l'intensità massima?) E l'intervallo dell'istogramma 0-255, è buono per le tue immagini? – lib