如何使用区域增长算法来定义感兴趣的区域?

时间:2017-08-18 09:47:51

标签: c++ vtk dicom itk

我正在研究DICOM图像(CT扫描)&我想在我的图片中分离一些感兴趣的结构,如人体器官(如主动脉,参见附图)。我在ITK&帮助下用C ++编写代码。 VTK。

The bright tube describes a sick aorta and corresponds to the structure that I would like to isolate.

假设这些器官具有特定的亮度强度,因此我可以使用区域增长算法(下面的代码)自动识别它们。为了做到这一点,我先前根据平均值计算了一些阈值。属于器官的体素的标准偏差值。

我怎样才能在ITK / VTK功能的帮助下将主动脉保留在我的图像中?我想我正在寻找的是一个与{完全相反的过滤器'的过滤器{3}}

请找到下面与器官隔离相对应的(伪)代码。我计算了区域生长结果的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? 

欢迎任何帮助或评论。

2 个答案:

答案 0 :(得分:1)

Mask filter本身可以与通常做的相反。默认情况下,屏蔽值为0,外部值也是如此。这意味着保持对应于掩模的非零部分的图像部分,并且其余部分被清零。如果这不是您想要的,您可以通过设置不同的屏蔽和外部值来轻松反转逻辑。

答案 1 :(得分:0)

为了记录,我使用ITK mask negated filter解决了我的问题,与基本的掩码过滤器相反,它直接回答了问题。