2015-10-26 2 views
2

У меня есть проблема с доступом к списку пикселей itk :: LabelObject. Этот объект LabelObject получается с помощью itk :: OrientedBoundingBoxLabelObject (https://github.com/blowekamp/itkOBBLabelMap). Оригинальное трехмерное изображение - CBCT Dicom, внутри которого я ищу положение и ориентацию маленького прямоугольного маркера.ITK получить список пикселей из itk :: LabelObject

Вот код, который приводит к получить ИТК :: 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 напрямую) в двоичное изображение, где я мог бы легко получить пиксели; и конвертировать и отображать этот markerBinaryImage с VTK, без каких-либо результатов (я получаю черное изображение).

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

Есть ли у кого-нибудь идеи о том, как добраться до этого списка пикселей?

ответ

2

Вы можете сделать это следующим образом:

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

Эта информация была получена из Insight Journal в статье Label object representation and manipulation with ITK. Там говорится, что вы можете получить ограничивающие прямоугольники напрямую, используя атрибут Region . Я не нашел способ получить область в ИТК :: LabelObject, однако здесь удел схема itk::LabelObject:

Inheritance diagram of LabelObject

Если ваш объект метка типа itk::ShapeLabelObject, вы можете использовать GetBoundingBox() метод для получения ограничивающей рамки. У него есть и другие методы, на которые стоит обратить внимание.

Я попытался преобразовать itk :: LabelMap (...) с не более результатами (я получаю черное изображение).

Советуйте здесь, не пробуйте этот сложный материал для проверки других сложных вещей. Возможно, вы провалились в другом месте цепи. Вместо этого прочитайте пиксели, как я уже говорил, и проверьте данные. Хороший взгляд!

+0

Спасибо, мне удалось получить этот список пикселей, благодаря вашим советам. Причина, по которой я не использую непосредственно атрибут region, заключается в том, что он дает только ограничительную рамку с осью, и мне нужен ориентированный. Этот фильтр OBB работает хорошо. –

+0

Да. :) добро пожаловать в проблемный клуб AABB! Рад, что это сработало! –

Смежные вопросы