Как использовать алгоритмы роста регионов для определения интересующей области?

Я работаю над изображениями DICOM (КТ) и хотел бы выделить на моем снимке некоторые структуры, представляющие интерес, такие как человеческие органы (например, аорта, см. прилагаемое изображение). Пишу на С++ с помощью ITK и VTK.

Яркая трубка описывает больную аорту и соответствует структуре, которую я хотел бы выделить.

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

Как я могу оставить на изображении только аорту с помощью функций ITK/VTK? Я думаю, мне нужен фильтр, который будет делать прямо противоположное 1MaskImageFilter.html" rel="nofollow noreferrer">фильтр изображения маски ITK.

Пожалуйста, найдите (псевдо) код, соответствующий выделению органов ниже. Я вычислил расширение в 5 вокселей в результате наращивания области, чтобы убедиться, что он включает все воксели органа и чтобы после обрезки был достаточный запас вокруг органа.

typedef short InputPixelType;
typedef unsigned char OutputPixelType; 
const int Dimension = 3;

typedef itk::Image< InputPixelType, Dimension > InputImageType;
typedef itk::Image< OutputPixelType, Dimension > OutputImageType;

// Region growing
typedef itk::ConnectedThresholdImageFilter< InputImagetype, 
OutputImagetype > ConnectedFilterType;

ConnectedFilterType::Pointer connectedThreshold = ConnectedFilterType::New();

connectedThreshold->SetInput(input);
connectedThreshold->SetUpper(upperThreshold);
connectedThreshold->SetLower(lowerThreshold);

//Initializing seed
InternalImagetype::IndexType index;
index[0] = seed_x; 
index[1] = seed_y;
connectedThreshold->SetSeed(index);

// Dilate the resulting region-growing of 5 voxels for safety
typedef itk::BinaryBallStructuringElement< OutputImageType, 
Dimension > StructuringElementType;
typedef itk::BinaryDilateImageFilter< OutputImageType, 
OutputImageType, StruturingElementType > DilateFilterType;

StructuringElementType structuringElement;
structuringElement.SetRadius(5);
structuringElement.CreateStructuringElement();

DilateFilterType::Pointer dilateFilter = DilateFilterType::New();
dilateFilter->SetInput(connectedThreshold->GetOutput());
dilatefilter->SetKernel(structuringElement);

// Saving the results of the RG+dilation
typedef itk::ImageFileWriter< OutputImageType > WriterType;
WriterType::Pointer writer = WriterType::New();
writer->SetInput(dilateFilter->GetOutput());
writer->SetFileName("organ-segmented-with-dilation.mhd");
try {
    writer->Update();
} catch(itk::ExceptionObject& err) {
    std::cerr << "Exception caught! " << err.what() << std::endl;
    return EXIT_FAILURE;
}

// What to do next to crop the input image with this region-growing? 

Любая помощь или замечание приветствуется.


person avazula    schedule 18.08.2017    source источник


Ответы (2)


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

person Dženan    schedule 18.08.2017
comment
На самом деле я нашел itkMaskNegatedImageFilter, который делает именно то, что я искал. Я тоже думал о том, что вы предложили, но не смог этого сделать, не знаю почему. Спасибо за Ваш ответ. - person avazula; 18.08.2017
comment
Возможно, проголосовать за ответ и/или отметить его как решение? - person Dženan; 18.08.2017

Для справки: я решил свою проблему с помощью фильтра с отрицанием маски ITK, который в отличие от фильтр базовой маски напрямую отвечает на вопрос.

person avazula    schedule 23.08.2017