VTK——使用包围盒切割医学图像

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;
}

你可能感兴趣的:(VTK学习,c++,qt)