VTK三维重建面绘制算法之MC表面重建

面绘制

面绘制算法是基于表面实现的一种三维重建算法。该类算法实现的响应速度快,对于一些实时的交互操作中不存在卡顿问题,在日常使用中有助于提高处理效率,但该算法在细节特征上的重建效果是不如体绘制方法。基于算法实现原理,现阶段的面绘制算法有体素级重建和切片级重建,本文则针对体素级重建中的MC表面重建做详细描述。

MC表面重建

MC表面重建是目前应用最广泛的面绘制算法,该算法基于VTK类库能够实现针对DICOM序列图像三维重建和可视化,同时该算法响应时间快,便于实时绘制,有利于进行交互操作。算法实现原理根据规定的筛选准则,基于内部点和等值面的相对位置关系,将若干个体素的边界连接,从而保留更多的内部信息。当我们对系统重建的三维模型进行一些简单的交互操作时,对比于体绘制重建模型,在我们对重建模型进行缩放或者旋转等交互操作时,三维模型不会像体绘制效果模型出现重绘制的卡顿。当然,MC表面重建相比与体绘制的各种算法效果还存在一些不足,当我们对于一些层间密度较低的医学影像,采用MC表面重建算法时会产生中间台阶,这样便会对重建的三维模型重构、显示和分析等操作产生很大影响。

基于VTK的MC表面重建实现流程

依赖VTK类库实现MC表面重建主要有三个步骤:(1)三维体数据内部重采样;(2)提取等值面;(3)计算表面法线。三维体数据内部重采样以使二次函数采样方式为主,从而实现对数据压缩,减小MC表面重建过程中的计算量。VTK类库中,又vtkContourFilter和vtkMarchingContourFiter等多个取等值面类,本系统中MC表面重建算法实现基于vtkMarchingCubes类来实现等值面提取。关于计算表面法线的主要目的则是为了实现在后线渲染过程中的表面着色光滑。
VTK实现MC表面重建的相关类
基于上图显示算法实现流程图可知,创建基于vtkMarchingCubes类的智能指针marchingcube,通过类中的静态函数SetInputConnection()获取经过平滑处理的图像体数据;静态函数SetValue()设置等值面的值,该函数中需设置两个参数,分别用来表示等值面的序号和当前等值面提取的范围。创建基于vtkStripper类的智能指针Stripper,完成等值面提取后获取三角片。创建基于vtkPolyDataMapper类的智能指针Mapper,将三角片映射为几何数据。最后基于vtkActor类创建演员,即智能指针actor,将几何数据传递给该指针,并通过该类中的静态函数来设置颜色、反射率、透明度以及反射光强度等参数。最后通过vtkRender类,将绘制模型渲染传递到图像显示窗口。

VTK代码实现

#include<vtkRenderWindow.h>
#include<vtkRenderWindowInteractor.h>
#include<vtkDICOMImageReader.h>
#include<vtkMarchingCubes.h>
#include<vtkPolyDataMapper.h>
#include<vtkStripper.h>
#include<vtkActor.h>
#include<vtkProperty.h>
#include<vtkCamera.h>
#include<vtkOutlineFilter.h>
#include<vtkOBJExporter.h>
#include<vtkRenderer.h>
#include<vtkMetaImageReader.h>
#include<vtkInteractorStyleTrackballCamera.h>
#include <vtkPolyDataMapper.h>
#include <vtkPolyData.h>
#include <vtkTriangleFilter.h>
#include<vtkImageCast.h>
#include<vtkImageConvolve.h>
#include<vtkImageGaussianSmooth.h>
#include<iostream>
#include<string.h>
//需要进行初始化,否则会报错
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);//基于vtk-7.0,所以是OpenGL,若基于VTK-8.0则是OpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL);
using namespace std;
int main()
{

	vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New();
	vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();//WINDOW;

	renWin->AddRenderer(ren);

	vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();//wininteratcor;
	iren->SetRenderWindow(renWin);

	vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();
	reader->SetDirectoryName("D:\\Bishe\\Projects\\DICOM\\dicom\\lung");
	reader->SetDataByteOrderToLittleEndian();
	reader->Update();

	vtkSmartPointer<vtkImageGaussianSmooth> gaussianSmoothFilter =
		vtkSmartPointer<vtkImageGaussianSmooth>::New();
	gaussianSmoothFilter->SetInputConnection(reader->GetOutputPort());
	gaussianSmoothFilter->SetDimensionality(3);
	gaussianSmoothFilter->SetRadiusFactor(5);
	gaussianSmoothFilter->SetStandardDeviation(1);
	gaussianSmoothFilter->Update();//这是添加的图像平滑处理,高斯平滑

	vtkSmartPointer<vtkMarchingCubes> marchingcube = vtkSmartPointer<vtkMarchingCubes>::New();
	marchingcube->SetInputConnection(gaussianSmoothFilter->GetOutputPort());//获得读取的数据的点集;
	marchingcube->SetValue(0, 200);//Setting the threshold;
	marchingcube->ComputeNormalsOn();//计算表面法向量;

	vtkSmartPointer<vtkStripper> Stripper = vtkSmartPointer<vtkStripper>::New();
	Stripper->SetInputConnection(marchingcube->GetOutputPort());//获取三角片

	vtkSmartPointer<vtkPolyDataMapper> Mapper = vtkSmartPointer<vtkPolyDataMapper>::New();//将三角片映射为几何数据;
	Mapper->SetInputConnection(Stripper->GetOutputPort());
	Mapper->ScalarVisibilityOff();//

	vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();//Created a actor;
	actor->SetMapper(Mapper);//获得皮肤几何数据
	actor->GetProperty()->SetDiffuseColor(1, .49, .25);//设置皮肤颜色;
	actor->GetProperty()->SetSpecular(0.3);//反射率;
	actor->GetProperty()->SetOpacity(1.0);//透明度;
	actor->GetProperty()->SetSpecularPower(20);//反射光强度;
	actor->GetProperty()->SetColor(1, 0.52, 0.30);//设置角的颜色;
	actor->GetProperty()->SetRepresentationToWireframe();//线框;

	vtkSmartPointer<vtkOutlineFilter> outfilterline = vtkSmartPointer<vtkOutlineFilter>::New();
	outfilterline->SetInputConnection(reader->GetOutputPort());
	vtkSmartPointer<vtkPolyDataMapper> outmapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	outmapper->SetInputConnection(outfilterline->GetOutputPort());

	ren->AddActor(actor);
	ren->ResetCamera();
	ren->ResetCameraClippingRange();
	ren->SetBackground(0, 0, 0);//设置背景颜色;
	renWin->SetSize(1000, 600);

	vtkInteractorStyleTrackballCamera* style = vtkInteractorStyleTrackballCamera::New();
	iren->SetInteractorStyle(style);

	renWin->Render();
	iren->Initialize();
	iren->Start();

	return EXIT_SUCCESS;
}

实现效果

基于上述MC表面重建算法实现流程,完成代码编写和实现。在实现对重建模型进行多项参数重建效果比对测试中,主要通过对比在等值面提取均为200的情况下,进行均值滤波处理和高斯平滑处理后的重建模型,具体重建渲染效果显示如图3.2中(a)和(b)所示;对比在同进行高斯平滑处理的情况下,等值面提取分别为80和200的情况下重建模型,具体重建渲染效果显示如图3.2中的©和(d)所示。

(a)
(b)
(c)
(d)

  • 不同参数效果比对测试。(a)等值面提取为200,均值滤波处理后的模型,(b)等值面提取为200,高斯平滑后的模型,©高斯平滑,等值面提取为80的模型,(d)高斯平滑,等值面提取为200的模型。

通过上图对比可知,在同一等值面提取的情况下,进行均值滤波处理后的重建模型和进行高斯平滑处理后的重建模型,在大体上没有太大的差别,都减少了噪声对重建模型的影响,也极大的保证了图像绘制中的细节部分避免失真。在同样进行高斯平滑处理的情况下,等值面提取为80的情况下,对于重建后的模型可以看出了勾勒处理皮肤轮廓;在等值面提取为200的情况下,重建后的模型则清晰地勾勒处理骨骼轮廓。针对程序在不同情况下的响应时间,可以总结出,当等值面提取值越小,提取的等值面数量反而越多,从而导致绘制响应时间越长。

  • 0
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要使用VTK在Python中进行三维重建绘制,你需要完成以下步骤: 1. 安装VTK库:你需要先安装VTK库,这可以通过使用pip安装来完成。 2. 导入必要的库:在Python代码中,你需要导入VTK库和其他必要的库,例如numpy和matplotlib。 3. 创建图形窗口:使用vtkRenderWindow类创建一个图形窗口。 4. 创建渲染器:使用vtkRenderer类创建一个渲染器。 5. 创建演员:使用vtkActor类创建一个演员,并将其添加到渲染器中。 6. 创建数据源:使用vtkPolyData类创建一个数据源,并将其添加到演员中。 7. 创建映射器:使用vtkPolyDataMapper类创建一个映射器,并将其添加到演员中。 8. 设置外观:使用vtkProperty类设置演员的外观属性,例如颜色和透明度。 9. 显示图形:使用vtkRenderWindowInteractor类创建一个图形显示器,并启动它以显示三维重建绘制。 这里是一个示例代码: ```python import vtk import numpy as np import matplotlib.pyplot as plt # 创建图形窗口 window = vtk.vtkRenderWindow() # 创建渲染器 renderer = vtk.vtkRenderer() window.AddRenderer(renderer) # 创建演员 actor = vtk.vtkActor() renderer.AddActor(actor) # 创建数据源 points = np.random.rand(100, 3) polyData = vtk.vtkPolyData() pointsVTK = vtk.vtkPoints() for point in points: pointsVTK.InsertNextPoint(point) polyData.SetPoints(pointsVTK) # 创建映射器 mapper = vtk.vtkPolyDataMapper() mapper.SetInputData(polyData) actor.SetMapper(mapper) # 设置外观 property = vtk.vtkProperty() property.SetColor(1, 0, 0) actor.SetProperty(property) # 显示图形 interactor = vtk.vtkRenderWindowInteractor() window.SetInteractor(interactor) window.Render() interactor.Start() ``` 这个示例代码会在窗口中显示一个由随机生成的点构成的红色三维重建绘制。你可以根据自己的需要修改点的数量和外观属性,以创建不同的三维重建绘制
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值