1. 读取 DICOM 图像序列
- 设置读取器以加载 DICOM 图像系列。
- 使用
itk::GDCMImageIO
作为 DICOM 图像的输入输出接口。 - 使用
itk::GDCMSeriesFileNames
获取指定路径下的所有 DICOM 文件名。 - 使用
itk::ImageSeriesReader
读取 DICOM 图像序列,并将其作为3D图像存储。
2. 阈值分割
- 创建
itk::ThresholdImageFilter
进行图像阈值分割。 - 设置阈值(在此例中为150到3071)以区分感兴趣的图像区域和背景。
- 更新滤波器并获取分割后的图像。
- 这里是为了过滤掉一些不需要的背景,只保留要处理的模型
3. 连通性分析
- 创建
itk::ConnectedComponentImageFilter
对分割后的图像进行连通性分析。 - 对每个连通区域分配唯一的标签。
- 获取标记(labeled)图像。
- 获得连通性分析后的图像像素,后面就可以对像素做处理
-
//连通域检测标记图 ImageType::Pointer labeledImage = connectedComponentFilter->GetOutput();
4. 选定区域处理
- 遍历用户选定的点。
- 对每个点,将屏幕坐标转换为图像坐标。
- 从标记图像中提取每个点的标签值。
- 将提取的标签值存储在列表中。
-
QList<int>selectIndex ; for(int i =0; i<g_index; i++) { ImageType::IndexType position; //这里要对position的三个坐标值做一些处理 ... PixelType labelValue = labeledImage->GetPixel(position); int a = static_cast<int>(labelValue); selectIndex << a; }
5. 创建输出图像
- 创建一个新的空白图像(
outputImage
)并设置其属性以匹配分割后的图像。 - 使用迭代器遍历分割图像、标记图像和输出图像。
- 将分割图像中属于选定标签的像素复制到输出图像中。
-
for (inputIt.GoToBegin(), labeledIt.GoToBegin(), outputIt.GoToBegin(); !inputIt.IsAtEnd(); ++inputIt, ++labeledIt, ++outputIt) { if (m_selectIndex.contains(labeledIt.Get())) { outputIt.Set(inputIt.Get()); } }
6. 转换为 VTK 图像
- 将 ITK 图像转换为 VTK 的
vtkImageData
。 - 设置体素间距、原点和尺寸。
- 复制 ITK 图像的像素值到 VTK 图像。
7. 创建并配置 VTK 体渲染器
- 创建
vtkSmartVolumeMapper
并设置输入数据。 - 创建
vtkVolume
并设置映射器。 - 定义颜色和不透明度传递函数,以及体属性。
8. 可视化
- 创建 VTK 渲染器和渲染窗口。
- 添加体对象到渲染器。
- 设置背景色并重置摄像机。
- 启动渲染窗口交互器以开始交互式查看。
这个过程涵盖了从读取 DICOM 图像、图像处理(阈值分割和连通性分析)、用户交互(选定区域处理)到最终的3D可视化。此代码对于理解如何在医学图像处理中结合使用 ITK 和 VTK 是非常有用的。