考虑一个问题,如果通过调整参数得到了一个较好三维重建结果,如何进行保存?
比如下面这个图形,如何保存这个重建结果?
上图是一个CT的脚踝扫描结果,通过调整体绘制的颜色映射和透明度映射,最终得到了只显示骨骼的结果。现在想要把这个结果保存,避免每次使用的时候都要进行参数调整。在vtk中可以通过抽取等值面来实现,流程图如下:
从流程图中可以看出,通过vtkContourFilter类可以将vtkImagedata中的等值面提取出来,具体代码如下:
this->pvtkContourFilter->SetInputData(this->pvtkImageData);
this->pvtkContourFilter->SetValue(0, 1300); // 等值面的值
this->pvtkPolyDataMapper->SetInputConnection(this->pvtkContourFilter->GetOutputPort());
提取等值面的显示效果图如下:
是不是和上面体绘制的绘制效果一样?
接下来是保存为vtk格式的代码:
if (this->input_path != "")
{
static char BASED_CODE szFilter[] = "VTK Files (*.vtk)|*.vtk|All Files (*.*)|*.*||";
CFileDialog cFileDialog(FALSE, ".vtk", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter); // 使用了MFC的创建对话框的形式来选择存储路径,输入文件名
if (cFileDialog.DoModal() == IDOK)
{
UpdateData(true);
auto writer = vtkPolyDataWriter::New(); // 存储为vtk格式的类
writer->SetInputData(pvtkContourFilter->GetOutput()); // 数据来源于等值面提取
writer->SetFileTypeToBinary();
writer->SetFileName(cFileDialog.GetPathName()); // 存储的文件名
writer->Update();
writer->Delete();
}
}
再使用第三讲编写的程序打开该vtk文件,和提取等值面前的对比效果图如下:
是不是除了颜色不一样,其他都一样,滑稽.jpg
好了,把这个图像再共享一下,比较大120多M。
脚踝CT图像,点这里
更多VTK教程,请VX搜索CodeKit。