ITK 从 itk::LabelObject 获取像素列表

ITK get pixels list from itk::LabelObject

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

这是获取 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();

有人知道如何访问这个像素列表吗?

你可以这样做:

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);
    }
}

此信息是从文章 Label object representation and manipulation with ITK 中的 Insight Journal 获得的。在那里,它说您可以直接使用 Region 属性 获取边界框。我没找到itk::LabelObject获取区域的方法,这里是itk::LabelObject的继承图:

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

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

这里提个忠告,不要用这个复杂的东西去验证其他复杂的东西。您可能在链中的其他地方失败了。相反,像我之前说的那样读取像素并检查数据。好看!