考慮一個問題,如果通過調整參數得到了一個較好三維重建結果,如何進行保存?
比如下面這個圖形,如何保存這個重建結果?
上圖是一個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圖像,點這裏