2015-10-26 205 views
2

访问itk :: LabelObject的像素列表时遇到问题。 使用itk :: OrientedBoundingBoxLabelObject(https://github.com/blowekamp/itkOBBLabelMap)获得此LabelObject。原始的3D图像是一个CBCT Dicom,我正在寻找一个小矩形标记的位置和方向。ITK从itk获取像素列表:: LabelObject

这是导致获取代码ITK :: LabelObject:

typedef short LabelPixelType; 
typedef itk::LabelMap<LabelObjectType> LabelMapType; 
typedef itk::OrientedBoundingBoxLabelMapFilter<LabelMapType> OBBLabelMapFilter; 

typename OBBLabelMapFilter::Pointer toOBBLabelMap = OBBLabelMapFilter::New(); 
typename ToLabelMapFilterType::Pointer toLabelMap = ToLabelMapFilterType::New(); 

toOBBLabelMap->SetInput(toLabelMap->GetOutput()); 
toOBBLabelMap->Update(); 

LabelObjectType* labelObject = toOBBLabelMap->GetOutput()->GetNthLabelObject(idx); 
OBBSize = labelObject->GetOrientedBoundingBoxSize(); 

我猜访问像素坐标是可能的,因为它要访问的某种方式,以计算边界框,但到目前为止我还没有做到这一点。然后我尝试将itk :: LabelMap(或LabelObject直接)转换为二进制图像,我可以更轻松地获取像素。并用VTK转换并显示这个markerBinaryImage,而没有更多的结果(我得到一个黑色的图像)。

typedef itk::LabelMapToBinaryImageFilter<LabelMapType, ImageType> LabelMapToBinaryImageFilterType; 
LabelMapToBinaryImageFilterType::Pointer labelImageConverter = LabelMapToBinaryImageFilterType::New(); 
labelImageConverter->SetInput(toLabelMap->GetOutput()); 
labelImageConverter->Update(); 
ImageType::Pointer markerBinaryImage = labelImageConverter->GetOutput(); 

有没有人有关于如何到这个像素列表的想法?

回答

2

你可能不喜欢这样:在从Insight杂志文章Label object representation and manipulation with ITK获得

for(unsigned int i = 0; i < filter->GetOutput()->GetNumberOfLabelObjects(); ++i) { 
    //Obtain the ith label object 
    FilterType::OutputImageType::LabelObjectType* labelObject = 
     filter->GetOutput()->GetNthLabelObject(i); 

    //Then, you may obtain the pixels of each label object like this: 
    for(unsigned int pixelId = 0; pixelId < labelObject->Size(); pixelId++) { 
     std::cout << labelObject->GetIndex(pixelId); 
    } 
} 

此信息。在那里,它说你可以直接使用Region属性来获得边界框。我没有找到ITK :: LabelObject获得区域的方式,但这里是itk::LabelObject的继承图:

Inheritance diagram of LabelObject

如果你的标签对象是itk::ShapeLabelObject类型的,你可以使用GetBoundingBox()方法来获得边界框。它还有其他许多值得关注的方法。

我试图然后转换itk :: LabelMap(...)没有更多的结果(我得到一个黑色的图像)。

这里有一条建议,不要试试这个复杂的东西来验证其他复杂的东西。你可能在连锁店的其他地方失败。相反,像我之前说的那样读取像素并检查数据。好看!

+0

谢谢你,我设法得到这个像素列表,感谢您的建议。我不直接使用region属性的原因是它只给出了一个轴对齐的边界框,我需要一个定向的边界框。这个OBB过滤器虽然运行良好。 –

+0

是的。 :)欢迎来到AABB问题俱乐部!很高兴工作! –