ITK-图像处理,计算3D图像的形状特征

时间:2015-04-15 17:39:29

标签: c++ image-processing itk

我正在尝试使用带有C ++的ITK库来计算3D图像的形状特征。所以我按照ITK文档中给出的example进行了操作。该示例采用2D图像,并提取不同的形状特征。在我的程序中,我只想要一个给定的3D图像来获取形状属性并将它们存储在array <double>中。

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

//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类型。我收到此错误: IntelliSense:const itk :: ImageRegion&lt; 3U&gt;中没有合适的转换函数“双重”存在

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

任何帮助都会被贬低

1 个答案:

答案 0 :(得分:2)

问题不在于const类型 - 您可以从 const分配,您只是不允许将分配给他们。

问题是GetBoundingBox()返回一个itk::ImageRegion对象,这是一个更复杂的对象,包含IndexSize个对象作为成员。没有简单的方法可以将其转换为ITK理解的double,因此尝试将其转换为double并不合理。

您应该查看ShapeLabelObject类文档,看看哪些方法可以返回可以转换为double的类型。

例如,GetNumberOfPixels()方法返回的SizeValueType只是typedef的{​​{1}},因此可以投放到unsigned longdoubleGetElongation()方法都有返回类型GetRoundness(),所以这些也可以。