ITK - 计算分段 3D 大脑 MRI 的纹理特征
ITK - Calculate texture features for segmented 3D brain MRI
我正在尝试使用 ITK 库和 C++ 计算 texture features
的分段 3D 大脑 MRI。所以我跟着这个example。该示例采用 3D image
,并为所有 13 个可能的空间方向提取 3 个不同的特征。在我的程序中,我只想让给定的 3D 图像得到:
- 能量
- 相关性
- 惯性
- Haralick 相关性
- 逆差矩
- 星团日珥
- 簇阴影
这是我目前的情况:
//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
.[=15],它也会为 不同的 3D 图像 提供 相同的结果 =]
有没有人用ITK来做这个?如果有任何其他方法可以实现这一点,请问有人能指出解决方案吗?
我们将不胜感激任何帮助。
您的代码中有些奇怪的地方是 size.Fill(50)
,而在示例中他们显示它应该保持图像尺寸:
size.Fill(3); //window size=3x3x3
我认为你的图像只有一个灰度级。例如,如果您使用 itk-snap
工具对图像进行分割,当您保存分割结果时,itk-snap
将其保存为一个灰度级。因此,如果您尝试计算使用 itk-snap
分割的图像的纹理特征,即使您更改图像或 window 大小,您也总是会得到相同的结果,因为您只有 一个共生矩阵中的灰度等级。尝试 运行 你的程序使用未分割的图像,你肯定会有不同的结果。
编辑:
为了计算分割图像的纹理特征,尝试另一种分割方法,保存未分割图像的原始灰度级。
我正在尝试使用 ITK 库和 C++ 计算 texture features
的分段 3D 大脑 MRI。所以我跟着这个example。该示例采用 3D image
,并为所有 13 个可能的空间方向提取 3 个不同的特征。在我的程序中,我只想让给定的 3D 图像得到:
- 能量
- 相关性
- 惯性
- Haralick 相关性
- 逆差矩
- 星团日珥
- 簇阴影
这是我目前的情况:
//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
.[=15],它也会为 不同的 3D 图像 提供 相同的结果 =]
有没有人用ITK来做这个?如果有任何其他方法可以实现这一点,请问有人能指出解决方案吗?
我们将不胜感激任何帮助。
您的代码中有些奇怪的地方是 size.Fill(50)
,而在示例中他们显示它应该保持图像尺寸:
size.Fill(3); //window size=3x3x3
我认为你的图像只有一个灰度级。例如,如果您使用 itk-snap
工具对图像进行分割,当您保存分割结果时,itk-snap
将其保存为一个灰度级。因此,如果您尝试计算使用 itk-snap
分割的图像的纹理特征,即使您更改图像或 window 大小,您也总是会得到相同的结果,因为您只有 一个共生矩阵中的灰度等级。尝试 运行 你的程序使用未分割的图像,你肯定会有不同的结果。
编辑:
为了计算分割图像的纹理特征,尝试另一种分割方法,保存未分割图像的原始灰度级。