2015-04-15 73 views
3

我正在尝试使用ITK库与C++计算3D图像的形状特征。所以我遵循ITK文档中给出的example。该示例采用2D图像,并提取不同的形状特征。在我的程序中,我只想为给定的3D图像获取形状属性并将其存储在array <double>中。ITK-图像处理,计算3D图像的形状特征

这是我到目前为止有:

//principal declarations 
const unsigned int Dimension = 3; 
typedef unsigned char         PixelType; 
typedef unsigned short        LabelType; 
typedef itk::Image<PixelType, Dimension>    InputImageType; 
typedef itk::Image< LabelType, Dimension >   OutputImageType; 
typedef itk::ShapeLabelObject< LabelType, Dimension > ShapeLabelObjectType; 
typedef itk::LabelMap<ShapeLabelObjectType>   LabelMapType; 
typedef itk::ImageFileReader<InputImageType> ReaderType; 
typedef itk::ConnectedComponentImageFilter <InputImageType, OutputImageType > ConnectedComponentImageFilterType; 
typedef itk::LabelImageToShapeLabelMapFilter< OutputImageType, LabelMapType> I2LType; 

typedef itk::Array<double> MeasurementVectorType; 

MeasurementVectorType formes(9); 
InputImageType::Pointer image; 

//read the 3Dimage 
ReaderType::Pointer reader = ReaderType::New(); 
reader->SetFileName(file); 
reader->Update(); 
image = reader->GetOutput(); 

ConnectedComponentImageFilterType::Pointer connected =  ConnectedComponentImageFilterType::New(); 
connected->SetInput(image); 
connected->Update(); 

// create the shape label map filter 
I2LType::Pointer i2l = I2LType::New(); 
i2l->SetInput(connected->GetOutput()); 
i2l->SetComputePerimeter(true); 
i2l->Update(); 

LabelMapType *labelMap = i2l->GetOutput(); 

//calculate shape attributes for the first label 
ShapeLabelObjectType *labelObject = labelMap->GetNthLabelObject(0); 
      //stock the attributes in the array 
      formes[0]=labelObject->GetBoundingBox(); 
      formes[1]=labelObject->GetNumberOfPixels(); 
      formes[2]=labelObject->GetPhysicalSize(); 
      formes[3]=labelObject->GetElongation(); 
      formes[4]=labelObject->GetPerimeter(); 
      formes[5]=labelObject->GetRoundness(); 
      formes[6]=labelObject->GetEquivalentSphericalRadius(); 
      formes[7]=labelObject->GetEquivalentSphericalPerimeter(); 
      formes[8]=labelObject->GetFlatness(); 

我能够读取3D图像,并计算出它的形状属性。但是,我有这个问题:我不能将它们存储在array <double>中,因为labelObject方法返回const类型。我得到这个错误:智能感知:从常量ITK没有合适的转换功能:: ImageRegion < 3U>以“双重”存在

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

任何帮助将大大apreciated

+1

你能编辑你的文章以包含你得到的确切错误信息吗?我也很困惑,你试图存储的'双重'值是什么。你可以在你的代码中指出它们吗? – eigenchris

+0

这是错误消息:**智能感知:从“const itk :: ImageRegion <3U>”到“double”存在没有合适的转换函数** –

回答

2

的问题是不是const型 - 你被允许从const小号分配,你只是不准分配他们。

的问题是,GetBoundingBox()返回itk::ImageRegion对象,它是一个包含IndexSize对象作为成员更复杂的对象。没有简单的方法将它转换成ITK能够理解的double,所以试图将其转换为double没有任何意义。

您应该通过ShapeLabelObject类文档,并查看哪些方法可以转换为double

例如,GetNumberOfPixels()方法返回SizeValueType,这仅仅是一个unsigned longtypedef,所以这可以被转换为doubleGetElongation()GetRoundness()方法都有返回类型const double,所以那些也可以。