Запись результатов ITK (Insight Toolkit) в локальный буфер

После применения конвейера фильтра ITK, как мне записать результат обратно в буфер, который будет использоваться (вне ITK)?

В Insight Software Guide есть пример Книги 1: Глава 4.1.7: Импорт данных изображения из буфера, и тот же пример также можно найти в WikiExamples.

Он показывает, как можно обернуть указатель ITK вокруг массива C ++, чтобы использовать его в дальнейшем, используя объект ImportImageFilter. Однако в этом примере затем используется объект Writer для записи отфильтрованного результата в файл.

Как мне вместо этого записать отфильтрованный результат в другой массив C ++? Или как мне перезаписать массив, который я использовал в качестве ввода?

По сути, у меня есть приложение, которое содержит изображение в буфере (localBuffer), которое я могу обернуть, следуя примеру кода:

 [...]
 const bool filterOwnsBuffer= false;    
 importFilter->SetImportPointer( localBuffer, size[0]*size[1], filterOwnsBuffer );

Затем я могу использовать его в любом конвейере itk и `` обновить '' на определенном этапе:

[...]
FilterType::Pointer filter = FilterType::New();
filter->SetInput( importFilter->GetOutput() );
filter->Update();

Как мне теперь убедиться, что localbuffer имеет отфильтрованные значения? Или, в качестве альтернативы, как мне установить другое resultbuffer для выходных значений? Должен ли я использовать итератор изображений и «цикл» над моим буфером вручную? Или я могу использовать filter->GetOutput() напрямую?

Мы были бы очень признательны за небольшой пример кода или ссылку на соответствующий пример. (Просто Экспорт данных изображения в буфер, эквивалентный данному примеру импорта.)


person BmyGuest    schedule 10.10.2014    source источник


Ответы (2)


ImageType::Pointer output = filter->GetOutput();
ImageType::PixelContainer * outputContainer = output->GetPixelContainer();
ImageType::PixelContainer::Element * resultBuffer = outputContainer->GetBufferPointer();

См. Документацию по Image и ImportImageContainer.

person Matt McCormick    schedule 13.10.2014
comment
Спасибо. Я попробую. Я предполагаю, что при условии, что у меня уже есть указатель на мой resultBuffer (из моего приложения), могу ли я использовать outputContainer- ›GetBufferPointer () для прямого назначения? (Разумеется, предполагается соответствие типа и порядка записи.) [Тем не менее, я почитаю документацию. ] - person BmyGuest; 13.10.2014
comment
Как я понял, * resultBuffer теперь является указателем на результаты, но буфер по-прежнему находится в другом месте памяти, чем я мог подготовить заранее. Если у меня уже есть выделенная память результатов (из моего приложения), как мне сказать itk использовать эту память в качестве буфера? (Конечно, размер памяти должен быть правильным.) То есть у меня есть (float *) dst Destination-указатель на непрерывную память соответствующего размера. - person BmyGuest; 13.10.2014
comment
Думаю, его нужно отредактировать на ImageType :: PixelContainer * outputContainer = output- ›GetPixelContainer (); - person BmyGuest; 29.10.2014

Вот средство для меня:

memcpy( buffer, filter->GetOutput()->GetBufferPointer(),
         size[0]*size[1]*sizeof(InputPixelType));

Это работает, потому что к моменту уничтожения фильтра буфер уже был преобразован в «буфер», который является указателем на ваши данные.

person colddie    schedule 09.05.2016