VTK 库
vtkDICOMImageReader:专门用于读取医学图像格式 DICOM 的类。DICOM(Digital Imaging and Communications in Medicine)是医学图像和信息的标准。
vtkImageGaussianSmooth:用于图像的高斯平滑处理,主要用于去噪和边缘模糊。
vtkMarchingCubes:Marching Cubes 算法用于从 3D 体积数据生成表面。这在医学成像中非常有用,可以用来生成器官、骨骼等结构的 3D 模型。
vtkStripper:用于优化网格数据,提高渲染速度。
vtkClipPolyData:多边形裁剪,通常用于去除不需要的部分或者进行 ROI(Region of Interest)分析。
vtkPolyDataMapper 和 vtkActor:这两个类用于设置渲染管线。Mapper 负责将数据映射为图形,而 Actor 则是场景中的图形对象。
vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor:这些组成部分用于创建渲染窗口和交互。
vtkBoxWidget:一个交互式的 3D 窗口小部件,通常用于裁剪或标注 3D 对象。
void test(QString path)
{
vtkSmartPointer< vtkDICOMImageReader >reader =
vtkSmartPointer< vtkDICOMImageReader >::New();
reader->SetDataByteOrderToLittleEndian();
reader->SetDirectoryName(""); //设置读取路径
reader->SetDataSpacing(1.0, 1.0, 1.0); //设置每个体素的大小
reader->Update();
//对图像数据进行光滑处理
vtkSmartPointer<vtkImageGaussianSmooth> gaussianSmoothFilter = vtkSmartPointer<vtkImageGaussianSmooth>::New();
gaussianSmoothFilter->SetInputConnection(reader->GetOutputPort());
gaussianSmoothFilter->SetDimensionality(3); //图片维数
gaussianSmoothFilter->SetRadiusFactor(5); //半径因子决定了高斯核在被限制为零之前将走多远,默认为1.5/1.5/1.5
gaussianSmoothFilter->SetStandardDeviation(1); //像素标准差,值越大越平滑,也越模糊,默认2/2/2
gaussianSmoothFilter->Update(); //这是添加的图像平滑处理,高斯平滑
vtkSmartPointer< vtkMarchingCubes > boneExtractor = vtkSmartPointer< vtkMarchingCubes >::New();
boneExtractor->SetInputConnection(gaussianSmoothFilter->GetOutputPort());
boneExtractor->SetValue(0, 250); //设置提取的等值信息
boneExtractor->Update();
double bounds[6];
boneExtractor->GetOutput()->GetBounds(bounds); // 获取图像数据的边界
// 计算中心和大小
double center[3], halfSize[3];
for (int i = 0; i < 3; i++) {
center[i] = (bounds[i * 2] + bounds[i * 2 + 1]) / 2.0;
halfSize[i] = (bounds[i * 2 + 1] - bounds[i * 2]) / 4.0; // 二分之一的大小
}
//剔除旧的或废除的数据单元,提高绘制速度(可略去这一步)
vtkSmartPointer< vtkStripper > boneStripper = vtkSmartPointer< vtkStripper >::New(); //三角带连接
boneStripper->SetInputConnection(boneExtractor->GetOutputPort());
boneStripper->Update();
vtkSmartPointer<vtkClipPolyData> clipper = vtkSmartPointer<vtkClipPolyData>::New();
clipper->SetInputConnection(boneStripper->GetOutputPort());
vtkSmartPointer< vtkPolyDataMapper > boneMapper = vtkSmartPointer< vtkPolyDataMapper >::New();
boneMapper->SetInputData(clipper->GetOutput());
boneMapper->ScalarVisibilityOff();
vtkSmartPointer< vtkActor > bone = vtkSmartPointer< vtkActor >::New();
bone->SetMapper(boneMapper);
bone->SetMapper(boneMapper);
bone->GetProperty()->SetDiffuseColor(1.0, 1.0, 1.0);
bone->GetProperty()->SetSpecular(0.3);
bone->GetProperty()->SetSpecularPower(20);
bone->GetProperty()->SetOpacity(1.0);//透明度;
bone->GetProperty()->SetColor(1, 0.52, 0.30);//设置角的颜色;
bone->GetProperty()->SetRepresentationToWireframe();//线框;
vtkSmartPointer< vtkRenderer > aRenderer = vtkSmartPointer< vtkRenderer >::New();
vtkSmartPointer< vtkRenderWindow > renWin = vtkSmartPointer< vtkRenderWindow >::New();
renWin->AddRenderer(aRenderer);
vtkSmartPointer< vtkRenderWindowInteractor > iren = vtkSmartPointer< vtkRenderWindowInteractor >::New();
iren->SetRenderWindow(renWin);
aRenderer->AddActor(bone);
// 创建包围盒并设置其位置和大小
vtkSmartPointer<vtkBoxWidget> boxWidget = vtkSmartPointer<vtkBoxWidget>::New();
boxWidget->SetInteractor(iren);
boxWidget->SetPlaceFactor(1); // 根据需要调整
boxWidget->SetProp3D(bone); // 将包围盒与图像的演员关联
boxWidget->PlaceWidget( // 使用图像的边界设置包围盒的位置和大小
center[0] - halfSize[0], center[0] + halfSize[0],
center[1] - halfSize[1], center[1] + halfSize[1],
center[2] - halfSize[2], center[2] + halfSize[2]
);
vtkSmartPointer<vtkBoxWidgetCallback> clipCallback = vtkSmartPointer<vtkBoxWidgetCallback>::New();
clipCallback->SetClipper(clipper);
boxWidget->AddObserver(vtkCommand::InteractionEvent, clipCallback);
boxWidget->On(); // 开启交互
iren->Initialize();
iren->Start();
return;
}