• 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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
  • 相关阅读:
    SpringMVC访问路径设置
    基于Java实现的语法分析器
    CAD快捷键——修改类
    0基础小白想学习软件测试,应该如何选择培训机构呢
    【数据结构与算法】之回溯、滑动窗口、分治算法经典问题
    k8s部署-kuboard安装(工具kuboard-spary)
    线扫相机DALSA--分频倍频计算公式及原理
    免费GIF动图制作,简简单单一招搞定
    IO作业:注册用户
    Java的数据类型
  • 原文地址:https://blog.csdn.net/Algabeno/article/details/132497013