ITK-图像处理,计算三维图像的形状特征

3
我正在使用C++的ITK库计算3D图像的形状特征。所以我按照ITK文档中给出的示例进行操作。该示例使用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: no suitable conversion function from const itk::ImageRegion<3U> to "double" exists

是否有人使用ITK来做这件事?如果有其他方法可以实现,请帮忙指点一下吗?

非常感谢您的帮助。


1
你能否编辑你的帖子,包括你所收到的错误信息?我也不确定你正在尝试存储的“double”值是什么。你能在代码中指出它们吗? - eigenchris
这是错误信息: IntelliSense: 不存在从"const itk :: ImageRegion <3U>"到"double"的适合转换函数 - M'henni Koroghli
1个回答

2
问题不在于 const 类型,你可以从 const 中赋值,但是不能将值赋给 const
问题在于 GetBoundingBox() 返回一个 itk::ImageRegion 对象,它是一个包含 IndexSize 对象的复杂对象。没有简单的方法将其转换为 ITK 可理解的 double,因此尝试将其转换为 double 是没有意义的。
你应该查看 ShapeLabelObject 类文档,并查看哪些方法返回可转换为 double 的类型。
例如,GetNumberOfPixels() 方法返回一个 SizeValueType,它只是一个 unsigned longtypedef,因此可以将其转换为 double。而 GetElongation()GetRoundness() 方法都具有返回类型 const double,因此也可以使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接