【问题标题】:ITK-Image processing, calculate shape features for 3D imageITK-图像处理,计算3D图像的形状特征
【发布时间】:2015-04-16 05:04:06
【问题描述】:

我正在尝试使用 ITK 库和 C++ 计算 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 &lt;double&gt; 中,因为labelObject 方法返回const 类型。我收到此错误:IntelliSense:没有合适的从 const itk::ImageRegion 到“double”的转换函数存在

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

任何帮助将不胜感激

【问题讨论】:

  • 您能否编辑您的帖子以包含您收到的确切错误消息?我也对您尝试存储的 double 值感到困惑。你能在你的代码中指出它们吗?
  • 这是错误信息:IntelliSense:不存在从“const itk::ImageRegion”到“double”的合适转换函数

标签: c++ image-processing itk


【解决方案1】:

问题不在于const 类型——您可以 consts 分配,只是不能将它们分配

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

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

例如,GetNumberOfPixels() 方法返回一个SizeValueType,它只是unsigned long 的一个typedef,因此可以将其转换为doubleGetElongation()GetRoundness() 方法都有返回类型 const double 所以它们也可以。

【讨论】:

    猜你喜欢
    • 2015-06-16
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 2022-08-11
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多