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

C++ 如何使用区域增长算法来定义感兴趣的区域?,c++,vtk,dicom,itk,C++,Vtk,Dicom,Itk,我正在研究DICOM图像(CT扫描)&我想分离出一些图片中感兴趣的结构,例如人体器官(如主动脉,参见所附图像)。在C++和VTK的帮助下,我用C++编写代码。 让我们假设这些器官具有特定的亮度强度,因此我可以使用区域生长算法(代码如下)自动识别它们。为了做到这一点,我之前根据属于该器官的体素的平均值和标准偏差值计算了一些阈值 如何借助ITK/VTK功能在图像中保留主动脉?我想我要找的是一个过滤器,它的作用与图像完全相反 请在下面找到对应于器官隔离的(伪)代码。我在区域生长的结果上计算了5个体素

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

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

如何借助ITK/VTK功能在图像中保留主动脉?我想我要找的是一个过滤器,它的作用与图像完全相反

请在下面找到对应于器官隔离的(伪)代码。我在区域生长的结果上计算了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? 
typedef短输入像素类型;
typedef unsigned char OutputPixelType;
常数int维=3;
typedef itk::ImageInputImageType;
typedef itk::ImageOutputImageType;
//区域增长
typedef itk::已连接ThresholdImageFilterConnectedFilterType;
ConnectedFilterType::Pointer connectedThreshold=ConnectedFilterType::New();
已连接阈值->设置输入(输入);
connectedThreshold->SetUpper(上限阈值);
已连接阈值->设置降低(降低再保持);
//初始化种子
InternalImagetype::IndexType索引;
索引[0]=种子x;
索引[1]=种子y;
连接阈值->设定种子(索引);
//为安全起见,放大5个体素的结果区域
typedef itk::BinaryBallStructuringElement结构元素类型;
typedef itk::BinaryImageFilterExplateFilterType;
StructuringElementType structuringElement;
structuringElement.SetRadius(5);
structuringElement.CreateStructuringElement();
ExplateFilterType::指针ExplateFilter=ExplateFilterType::New();
扩展过滤器->设置输入(connectedThreshold->GetOutput());
过滤器->设置内核(structuringElement);
//保存RG+膨胀的结果
typedef itk::ImageFileWriterWriterType;
WriterType::指针编写器=WriterType::New();
writer->SetInput(filter->GetOutput());
writer->SetFileName(“通过dictional.mhd分割的器官”);
试一试{
writer->Update();
}捕获(itk::例外对象和错误){

std::cerr本身可以做与通常相反的事情。默认情况下,掩蔽值为0,外部值也是。这意味着与掩蔽的非零部分相对应的图像部分被保留,其余部分被调零。如果这不是您想要的,您可以通过设置不同的掩蔽值和外部值来轻松反转逻辑

作为记录,我使用解决了我的问题,这与基本遮罩过滤器正好相反。事实上,我找到了ITKmaskNegateImage过滤器,它完全符合我的要求。我也考虑了你的建议,但无法做到,我不知道为什么。谢谢你的回答。也许投票吧把答案加起来和/或标记为解决方案?