ITK - Расчет текстурных особенностей для сегментированной 3D МРТ головного мозга

Я пытаюсь рассчитать texture features для сегментированной трехмерной МРТ головного мозга, используя библиотеку ITK с C++. Поэтому я следовал этому примеру. В примере используется 3D image и извлекается 3 различных объекта для всех 13 возможных пространственных направлений. В моей программе я просто хочу получить данное 3D-изображение:

  • Энергия
  • Корреляция
  • Инерция
  • Корреляция Харалика
  • Обратный разностный момент
  • Кластер известность
  • Кластерный оттенок

Вот что у меня есть до сих пор:

//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();
}

Программа работает. Однако у меня есть проблема: он дает одинаковые результаты для разных 3D-изображений, даже когда я меняю window size.

Кто-нибудь использовал ITK для этого? Если есть какой-либо другой способ добиться этого, может ли кто-нибудь указать мне решение, пожалуйста?

Любая помощь будет высоко оценена.


person blackbishop    schedule 10.04.2015    source источник
comment
вы уверены, что изображение читается правильно? например, если вы вычисляете что-то простое, например, диапазон интенсивности входного сигнала, получаете ли вы правильные результаты? itk.org/Wiki/ITK/Examples/ImageProcessing/   -  person lib    schedule 11.04.2015
comment
@lib Да, изображение правильно читается, я знаю это, потому что смог правильно отобразить его.   -  person blackbishop    schedule 11.04.2015
comment
Я запустил ваш код с функцией main, взятой со страницы примера (единственное изменение, которое я сделал, это объект size, чтобы он соответствовал размеру моих конкретных изображений) и получил разные результаты для разных изображений. Как вы читаете свои изображения в своей программе? Вы используете один и тот же объект ImageFileReader для обоих изображений? Если это так, возможно, вы перезаписываете одну из них в памяти и дважды выполняете операции с одним и тем же изображением.   -  person eigenchris    schedule 16.04.2015


Ответы (2)


Я думаю, что ваши изображения имеют только один уровень серого. Например, если вы сегментируете изображения с помощью инструмента itk-snap, при сохранении результата сегментации itk-snap сохраните его с одним уровнем серого. Таким образом, если вы попытаетесь вычислить признаки текстуры для изображений, сегментированных с помощью itk-snap, вы всегда будете получать одинаковые результаты, даже если вы измените изображения или размер окна, потому что у вас есть только один уровень шкалы серого в матрице совпадений< /сильный>. Попробуйте запустить программу с несегментированными изображениями, результаты наверняка будут другими.

ИЗМЕНИТЬ:

Чтобы вычислить особенности текстуры для сегментированных изображений, попробуйте другой метод сегментации, который сохраняет исходные уровни шкалы серого несегментированного изображения.

person M'henni Koroghli    schedule 16.04.2015

Что-то странное в вашем коде - size.Fill(50), а в примере они показывают, что он должен содержать размер изображения:

 size.Fill(3); //window size=3x3x3
person lib    schedule 11.04.2015
comment
Нет, size.Fill(3) не представляет размеры изображения, он содержит размер интересующей области roi. Размер window необходим для расчета матрицы совпадения уровней серого и не имеет ничего общего с размерами изображения. - person blackbishop; 11.04.2015
comment
да, извините, теперь я вижу .. Но можете ли вы получить разные результаты для разных областей интереса? (визуализация или вычисление максимальной интенсивности?) И диапазон гистограммы 0-255, подходит ли он для ваших изображений? - person lib; 11.04.2015