图形处理之网格平滑vtkSmoothPolyDataFilter
网格平滑
现代扫描技术的发展使得获取点云数据不再困难,通过曲面重建技术可以获取表面网格来表示各种复杂的实体。但是点云数据中往往存在噪声,这样得到的重建网格通常都需要进行平滑处理。网格平滑是一种调整数据集中点坐标的技术。网格平滑的目的是提高网格的外观和提高单元数据集的形状。在平滑过程中,不会改变数据集的拓扑结构,只改变几何结构。网格平滑的应用包括提高等值面的外观,或者作为移除表面噪声的模型工具。通过应用网格平滑,模型的外观能够动态地提高。下图是平滑应用到一个任意变形的分析曲面(半圆柱)的例子。
拉普拉斯平滑是一种常用的平滑算法。VTK中 的vtkSmoothPolyDataFilter类实现了网格的拉普拉斯平滑算法,原理如下面公式:
其中:Xnew表示新的坐标位置,X表示当前的坐标位置。j表示X的邻域点个数,Xi表示第i个邻域点的坐标位置。
vtkSmoothPolyDataFilter::SetNumberOfIterations()控制平滑次数,次数越大平滑越厉害,即细节损失越多。该类中还有多个变量来控制平滑过程,利用这些变化在一定程度岸上可以控制细节的损失。BoundarySmoothing控制是否对边界点平滑。FeatureEdgeSmoothing控制是否对特征边上的点的平滑。如果一条边被两个邻近的多边形公用,若这两个多边形法向量的夹角(特征角)大于定义的阈值,则说明这边为一条特征边。虽然通过特征边平滑设置可以降低一部分细节损失,并不能完全避免,且随着拉普拉斯平滑的不断迭代,模型会逐渐向网格的中心收缩。所以vtkWindowedSincPolyData是一个更好的选择,该算法使用窗口Sinc函数实现网格平滑,能够最小程度地避免收缩。
示例演示
我们演示如何利用vtkSmoothPolyDataFilter进行平滑。
/**********************************************************************Copyright (c) Mr.Bin. All rights reserved.
For more information visit: http://blog.csdn.net/webzhuce**********************************************************************/
#include <vtkSmartPointer.h>
#include <vtkPolyDataReader.h>
#include <vtkPolyData.h>
#include <vtkSmoothPolyDataFilter.h>
#include <vtkWindowedSincPolyDataFilter.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>int main(int argc, char *argv[])
{vtkSmartPointer<vtkPolyDataReader> reader =vtkSmartPointer<vtkPolyDataReader>::New();reader->SetFileName("E:/github/Study-VTK/data/fran_cut.vtk");reader->Update();vtkSmartPointer<vtkSmoothPolyDataFilter> smoothFilter =vtkSmartPointer<vtkSmoothPolyDataFilter>::New();smoothFilter->SetInputConnection(reader->GetOutputPort());smoothFilter->SetNumberOfIterations(200);smoothFilter->Update();vtkSmartPointer<vtkPolyDataMapper> inputMapper =vtkSmartPointer<vtkPolyDataMapper>::New();inputMapper->SetInputConnection(reader->GetOutputPort());vtkSmartPointer<vtkActor> inputActor =vtkSmartPointer<vtkActor>::New();inputActor->SetMapper(inputMapper);vtkSmartPointer<vtkPolyDataMapper> smoothedMapper =vtkSmartPointer<vtkPolyDataMapper>::New();smoothedMapper->SetInputConnection(smoothFilter->GetOutputPort());vtkSmartPointer<vtkActor> smoothedActor =vtkSmartPointer<vtkActor>::New();smoothedActor->SetMapper(smoothedMapper);double leftViewport[4] = { 0.0, 0.0, 0.5, 1.0 };double rightViewport[4] = { 0.5, 0.0, 1.0, 1.0 };vtkSmartPointer<vtkRenderer> leftRenderer =vtkSmartPointer<vtkRenderer>::New();leftRenderer->SetViewport(leftViewport);leftRenderer->AddActor(inputActor);leftRenderer->SetBackground(0.8, 0.8, 0.8);leftRenderer->ResetCamera();vtkSmartPointer<vtkRenderer> rightRenderer =vtkSmartPointer<vtkRenderer>::New();rightRenderer->SetViewport(rightViewport);rightRenderer->AddActor(smoothedActor);rightRenderer->SetBackground(0.8, 0.8, 0.8);rightRenderer->SetActiveCamera(leftRenderer->GetActiveCamera());rightRenderer->ResetCamera();vtkSmartPointer<vtkRenderWindow> renderWindow =vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(leftRenderer);renderWindow->AddRenderer(rightRenderer);renderWindow->SetSize(640, 320);renderWindow->Render();renderWindow->SetWindowName("SmoothPolyData");vtkSmartPointer<vtkRenderWindowInteractor> interactor =vtkSmartPointer<vtkRenderWindowInteractor>::New();interactor->SetRenderWindow(renderWindow);renderWindow->Render();interactor->Start();return EXIT_SUCCESS;
}
运行结果
图左是原始网格,图右是平滑后的。可以看出平滑后,网格的部分特征信息也被丢失。
参考资料
- VTK图形图像开发进阶[M]
图形处理之网格平滑vtkSmoothPolyDataFilter相关推荐
- VTK修炼之道49:图形基本操作进阶_网格平滑(点云的曲面重建技术)
1.网格平滑 现代扫描技术的发展使得获取点云数据不再困难,通过曲线重建技术可以获取表面网格来表示各种复杂的实体.但是点云数据中往往存在噪声,这样得到的重建网格通常都需要进行平滑处理. 拉普拉斯平滑是一 ...
- 3dmax:3dmax的软件右边栏常用修改器(面挤出、网格/平滑、涡轮平滑、球形化、曲面修改器、星、融化、删除网格修改器、体积选择、优化、UVW贴图修改器、弯曲、置换、噪波、锥化)之详细攻略
3dmax:3dmax的软件右边栏常用修改器(面挤出.网格/平滑.涡轮平滑.球形化.曲面修改器.星.融化.删除网格修改器.体积选择.优化.UVW贴图修改器.弯曲.置换.噪波.锥化)之详细攻略 目录
- 网格平滑基础算法总结
基于滤波的算法 拉普拉斯网格平滑算法 可 以 认 为 定 义 在 顶 点 上 的 信 息 是 一 个 信 号 流 f ( x , t ) , 这 个 信 号 会 随 时 间 扩 散 可以认为定义在顶点 ...
- 银河土星_不要购买三星银河笔记20
银河土星 Samsung's "Unpacked" event took place online on August 5th and since then, the questi ...
- 图形处理(三)简单拉普拉斯网格变形-Siggraph 2004
三角网格变形一直是CAGD相关领域的重点,刚上研究生的时候,感觉有点神奇.而且一上来导师就给我发了一篇基于格林坐标的自由变形的相关paper,让我看,外文文献,看了n多天,第一次看外文文献,啥也没看懂 ...
- 三维数据平滑处理_VTK图像处理(二)--vtkPolyData数据处理
前言 vtkPolyData数据是一种广泛使用的vtk数据结构,可以用来表示很多常用的数据结构,如点云数据.面片模型等.本文章先分析vtkPolyData数据的基本组成,创建方法和显示管线,结果介绍了 ...
- svg大小自适应_网格自适应的 2 种方法——实现更高效的计算
网格自适应的目标是:修正网格以更有效地解决问题.通常,我们希望使用尽可能少的单元来获得精确的解:并希望在不太重要的区域使用较粗糙的网格,而在感兴趣的区域使用较精细的网格.有时,我们甚至可能会考虑各向异 ...
- three.js 几何体-组合网格_3dmax利用优化和多边形倒角制作饰品组合1
大家好,今天为大家讲解一下如何利用3dmax的优化和多边形倒角命令制作饰品组合. 单击创建,选择几何体,对象切换为标准基本体,选择圆柱体在场景中进行创建. 单击修改,半径设置为60mm,高度设置为28 ...
- 三维数据平滑处理_关于CAD三维对象建模
下面是本公众号文章分类目录,点击标题文字可打开分类文章列表: 安装卸载 异常.退出 文件及输入输出 基本操作技巧 设置及相关问题 界面和显示 快捷键 视图设置和调整 图层管理 颜色 线型 ...
最新文章
- POSIX标准总体分析
- 常用3种数据库的Sql分页
- 深入浅出CSS(二):关于雪碧图、background-position与steps函数的三角恋情
- IDL与C#混合编程技术
- 1092. To Buy or Not to Buy (20)
- Perl文档操作选项
- Linux源码安装pgadmin4,Linux 服务器部署 PgAdmin 4 Server
- 中小微企业公共信用数据的风险评估
- Intel 旗下 Habana Labs 遭勒索软件 Pay2Key 攻击,数据被盗
- c语言实验交换字母,C语言实验内容.doc
- 分发服务器linux,Linux-LVS分发服务器
- 10月19日 蒟蒻的流水账
- 做web开发需要学习哪些技术--基础篇
- C#中根据传入的字符串字段返回实体Lambda表达式
- Java多线程:同步集合与同步锁
- HardDisk读取速度
- 2021年全球电池供电无线烟雾报警器行业调研及趋势分析报告
- 股市投资必修课十九---DCF三要素经营存续期、现金创造力、经营周期定位
- Guava之Joiner笔记
- 区块链 数据交易专利