2015-04-15 143 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,所以那些也可以。