ITK - 计算分段3D脑MRI的纹理特征

时间:2015-04-10 20:23:02

标签: c++ image-processing feature-extraction itk

我尝试使用带有C ++的 ITK 库来计算分段三维脑MRI的texture features。所以我跟着这个example。该示例采用3D image,并为所有13个可能的空间方向提取3个不同的要素。在我的程序中,我只想获得给定的3D图像:

  • 能源
  • 相关性
  • 惯性
  • Haralick Correlation
  • 反向差异时刻
  • 群集突出
  • 群集阴影

这是我到目前为止所做的:

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

该计划有效。但是我遇到了这个问题:即使我更改window size,它也会为不同的3D图像提供相同的结果

是否有人使用ITK来做这件事?如果有任何其他方法可以实现这一点,那么有人能指出我的解决方案吗?

任何帮助都会得到很多帮助。

2 个答案:

答案 0 :(得分:2)

我认为您的图片只有一个灰度级。例如,如果您使用itk-snap工具对图片进行细分,则在保存细分结果时,itk-snap会将其保存为一个灰度级。因此,如果您尝试为使用itk-snap分割的图像计算纹理特征,即使您更改图像或窗口大小,也会始终获得相同的结果,因为您在co中只有一个灰度级 - 发生矩阵。尝试使用未分段的图像运行程序,你肯定会有不同的结果。

编辑:

要计算分割图像的纹理特征,请尝试另一种分割方法,该方法可以保存未分割图像的原始灰度级。

答案 1 :(得分:0)

您的代码中有些奇怪的内容是size.Fill(50),而在示例中,它们应该包含图片维度:

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