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

2024-03-13 11:10

本文主要是介绍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的情况下,重建后的模型则清晰地勾勒处理骨骼轮廓。针对程序在不同情况下的响应时间,可以总结出,当等值面提取值越小,提取的等值面数量反而越多,从而导致绘制响应时间越长。

这篇关于VTK三维重建面绘制算法之MC表面重建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/804671

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

dp算法练习题【8】

不同二叉搜索树 96. 不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3输出:5 示例 2: 输入:n = 1输出:1 class Solution {public int numTrees(int n) {int[] dp = new int

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯: