网格平滑

现代扫描技术的发展使得获取点云数据不再困难,通过曲面重建技术可以获取表面网格来表示各种复杂的实体。但是点云数据中往往存在噪声,这样得到的重建网格通常都需要进行平滑处理。网格平滑是一种调整数据集中点坐标的技术。网格平滑的目的是提高网格的外观和提高单元数据集的形状。在平滑过程中,不会改变数据集的拓扑结构,只改变几何结构。网格平滑的应用包括提高等值面的外观,或者作为移除表面噪声的模型工具。通过应用网格平滑,模型的外观能够动态地提高。下图是平滑应用到一个任意变形的分析曲面(半圆柱)的例子。

        拉普拉斯平滑是一种常用的平滑算法。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相关推荐

  1. VTK修炼之道49:图形基本操作进阶_网格平滑(点云的曲面重建技术)

    1.网格平滑 现代扫描技术的发展使得获取点云数据不再困难,通过曲线重建技术可以获取表面网格来表示各种复杂的实体.但是点云数据中往往存在噪声,这样得到的重建网格通常都需要进行平滑处理. 拉普拉斯平滑是一 ...

  2. 3dmax:3dmax的软件右边栏常用修改器(面挤出、网格/平滑、涡轮平滑、球形化、曲面修改器、星、融化、删除网格修改器、体积选择、优化、UVW贴图修改器、弯曲、置换、噪波、锥化)之详细攻略

    3dmax:3dmax的软件右边栏常用修改器(面挤出.网格/平滑.涡轮平滑.球形化.曲面修改器.星.融化.删除网格修改器.体积选择.优化.UVW贴图修改器.弯曲.置换.噪波.锥化)之详细攻略 目录

  3. 网格平滑基础算法总结

    基于滤波的算法 拉普拉斯网格平滑算法 可 以 认 为 定 义 在 顶 点 上 的 信 息 是 一 个 信 号 流 f ( x , t ) , 这 个 信 号 会 随 时 间 扩 散 可以认为定义在顶点 ...

  4. 银河土星_不要购买三星银河笔记20

    银河土星 Samsung's "Unpacked" event took place online on August 5th and since then, the questi ...

  5. 图形处理(三)简单拉普拉斯网格变形-Siggraph 2004

    三角网格变形一直是CAGD相关领域的重点,刚上研究生的时候,感觉有点神奇.而且一上来导师就给我发了一篇基于格林坐标的自由变形的相关paper,让我看,外文文献,看了n多天,第一次看外文文献,啥也没看懂 ...

  6. 三维数据平滑处理_VTK图像处理(二)--vtkPolyData数据处理

    前言 vtkPolyData数据是一种广泛使用的vtk数据结构,可以用来表示很多常用的数据结构,如点云数据.面片模型等.本文章先分析vtkPolyData数据的基本组成,创建方法和显示管线,结果介绍了 ...

  7. svg大小自适应_网格自适应的 2 种方法——实现更高效的计算

    网格自适应的目标是:修正网格以更有效地解决问题.通常,我们希望使用尽可能少的单元来获得精确的解:并希望在不太重要的区域使用较粗糙的网格,而在感兴趣的区域使用较精细的网格.有时,我们甚至可能会考虑各向异 ...

  8. three.js 几何体-组合网格_3dmax利用优化和多边形倒角制作饰品组合1

    大家好,今天为大家讲解一下如何利用3dmax的优化和多边形倒角命令制作饰品组合. 单击创建,选择几何体,对象切换为标准基本体,选择圆柱体在场景中进行创建. 单击修改,半径设置为60mm,高度设置为28 ...

  9. 三维数据平滑处理_关于CAD三维对象建模

    下面是本公众号文章分类目录,点击标题文字可打开分类文章列表: 安装卸载 异常.退出 文件及输入输出  基本操作技巧 设置及相关问题  界面和显示 快捷键 视图设置和调整  图层管理 颜色   线型   ...

最新文章

  1. POSIX标准总体分析
  2. 常用3种数据库的Sql分页
  3. 深入浅出CSS(二):关于雪碧图、background-position与steps函数的三角恋情
  4. IDL与C#混合编程技术
  5. 1092. To Buy or Not to Buy (20)
  6. Perl文档操作选项
  7. Linux源码安装pgadmin4,Linux 服务器部署 PgAdmin 4 Server
  8. 中小微企业公共信用数据的风险评估
  9. Intel 旗下 Habana Labs 遭勒索软件 Pay2Key 攻击,数据被盗
  10. c语言实验交换字母,C语言实验内容.doc
  11. 分发服务器linux,Linux-LVS分发服务器
  12. 10月19日 蒟蒻的流水账
  13. 做web开发需要学习哪些技术--基础篇
  14. C#中根据传入的字符串字段返回实体Lambda表达式
  15. Java多线程:同步集合与同步锁
  16. HardDisk读取速度
  17. 2021年全球电池供电无线烟雾报警器行业调研及趋势分析报告
  18. 股市投资必修课十九---DCF三要素经营存续期、现金创造力、经营周期定位
  19. Guava之Joiner笔记
  20. 区块链 数据交易专利

热门文章

  1. 所有学java的女生都进来看看
  2. css3弹性盒子居中总结1
  3. 【Tensorflow+自然语言处理+LSTM】搭建智能聊天客服机器人实战(附源码、数据集和演示 超详细)
  4. python执行其它py_如何在一个py程序里执行另一个py程序?
  5. 资深工程师,专家,研究员等进阶
  6. SAP HANA Temporal Table (历史表)
  7. java打印超市消费小票_Java-超市购物小票案例-详细介绍
  8. 阿里云播放器AliyunPlayer的走马灯组件的位置
  9. 电信行业大数据(大数据平台系列)
  10. java实现收藏功能