当前位置: 首页 > article >正文

头发的方向图(2D和3D)与合成

首先,我们从一个不受光照限制的环境中拍摄一组输入图像,这些图像包含了头发的不同视角和姿态。我们对这些图像进行半自动的分割,将头发从背景中分离出来,然后使用PMVS ,一种先进的多视角立体算法,来重建一个点云。我们通常使用30到50张输入图像来进行重建。
然后,我们对重建的点云和PMVS估计的法向量进行滤波,因为它们可能会有噪声。我们使用移动最小二乘法(MLS)来平滑它们:对于每个点,我们用最优的平面来拟合它附近的加权邻居点。平面的法向量和点在平面上的投影就用来更新点的原始法向量和位置。我们使用2毫米的标准差来得到合理的滤波结果。

接下来,我们对滤波后的点云进行方向场的计算,这个方向场表示了每个点的3D方向。我们使用了一种基于图像的方法,它利用了输入图像中的方向信息。我们首先对每张输入图像进行方向滤波,得到每个像素的2D方向。然后,我们对每个点云中的点,找到它在输入图像中的对应像素,以及它的邻居点在输入图像中的对应像素。我们用这些像素的方向来计算点云中的点的3D方向,这个方向是无指向性的,只表示方向但不区分左右。我们使用了一种基于PCA的方法,它可以从多个2D方向中推断出一个3D方向。

 详细:从输入图像中提取出每个像素的方向信息,这个信息可以帮助网络重建出毛发的形状和流动性。

 在点云上生长毛发段的过程是这样的:对于每个点云中的点,我们根据它的方向,找到它的下一个邻居点,然后将它们连接成一条线段,这条线段就是一个毛发段的一部分。我们重复这个过程,直到遇到以下情况之一:1) 没有找到合适的邻居点;2) 邻居点的方向与当前点的方向差异过大;3) 邻居点已经被其他毛发段占用。这样,我们就可以在点云上生长出一组局部的毛发段,它们可以近似地用一条曲线来表示。

用带状物覆盖毛发段的过程是这样的:对于每个毛发段,我们用一个固定的宽度和厚度的带状物来覆盖它,这个带状物的方向和长度都是由毛发段的数据决定的。然后,我们对每个带状物进行聚类,根据它们的位置和方向的相似性,将它们分成若干个组,每个组包含一些相邻的带状物,它们可以近似地用一条曲线来表示。这样,我们就可以用带状物覆盖点云,揭示出局部一致的毛发束结构,这些结构可以反映出头发的纹理和流动性,而且也可以与导向毛发关联,用于动画。

- 发现带状物之间的缺失连接的过程是这样的:由于遮挡和缺失数据,带状物之间可能存在一些空隙,这些空隙会影响毛发束的完整性和连续性。为了解决这个问题,我们尝试用圆弧来拟合带状物覆盖的毛发段,看看是否可以在空隙处建立连接。我们对每个带状物,找到它的一个端点,然后在它的邻域内,寻找另一个带状物的一个端点,看看它们是否可以用一个圆弧来连接。我们使用了一种基于最小二乘法的方法,来计算圆弧的参数,包括圆心、半径和角度。我们还定义了一个拟合误差的度量,它取决于圆弧和毛发段的距离和方向的差异。如果拟合误差小于一个阈值,我们就认为这两个带状物之间有一个合理的连接,我们将这个连接编码在一个连接图中,用于后续的分析和优化。
- 对带状物进行方向分析的过程是这样的:由于方向场的180度歧义,带状物的方向可能是不确定的,这会导致毛发束的方向不一致或者不合理。为了解决这个问题,我们对带状物进行一个全局的方向分析,使用一个马尔可夫随机场(MRF)公式,来优化每个带状物的方向。我们的目标是使得带状物的方向尽可能地与连接图中的连接和带状物方向的局部提示相兼容。连接图中的连接表示了带状物之间的拓扑关系,它们应该满足一些几何约束,例如,相邻的带状物的方向应该是平滑的,而不是突然转弯的。带状物方向的局部提示表示了带状物的形状特征,它们可以从点云中的数据中提取出来,例如,带状物的曲率、长度和方向变化等。我们使用了一种基于图割的方法,来求解这个MRF公式,得到每个带状物的最优方向。这样,我们就可以保证毛发束的方向是一致和合理的。
- 将带状物连接成毛发束的过程是这样的:在进行了连接和方向分析之后,我们就可以将带状物连接成完整的毛发束了。我们的目标是使得每个毛发束都能从头皮开始,到头发的末端结束,而且不会有断裂或重叠的现象。我们使用了一种基于深度优先搜索的方法,来遍历连接图中的所有节点,即带状物的端点,然后根据它们的连接和方向,将它们连接成一条连续的曲线,这条曲线就是一个毛发束。我们重复这个过程,直到遍历完所有的节点,或者达到预设的毛发束的数量。这样,我们就可以从带状物中生成一组完整的毛发束,它们可以反映出头发的结构和风格,而且也可以作为导向毛发,用于动画和模拟。 


http://www.kler.cn/news/148285.html

相关文章:

  • 【Mybatis】预编译/即时sql 数据库连接池
  • linux进入telnet和推出telnet
  • 零基础在ubuntu上搭建rtmp服务器-srs
  • 关于Redis底层的两个问题
  • 18、Android 组件化
  • C++中的map和set的使用
  • 【Spark入门】基础入门
  • facebook引流软件需要具备什么功能
  • 相关性分析和作图
  • php高级工程师范文模板
  • 完美解决:Nginx访问PHP出现File not found.
  • 逆向扒cocosjs安卓包教程-破解加密的js源码
  • vue+elementUI的tabs与table表格联动固定与滚动位置
  • 【JUC】十二、CompletableFuture(上)
  • Java 之 lambda 表达式(二)---- Stream 操作 API
  • C语言—什么是数组名
  • 5种主流API网关技术选型,yyds!
  • Python基础语法之学习print()函数
  • JAVA 使用stream流将List中的对象某一属性创建新的List
  • ubuntu中root和普通用户切换方法
  • LeetCode Hot100 20.有效的括号
  • Android Frameworks 开发总结之七
  • UniApp 中的 u-input 属性讲解
  • 大数据-之LibrA数据库系统告警处理(ALM-37006 Coordinator进程异常)
  • python tkinter 使用(八)
  • C++之STL库:string类(用法列举和总结)
  • springboot项目修改项目名称
  • JVM的知识点
  • python:由深浅拷贝谈到变量值的核心区别
  • 【SpringCloud】设计原则之单一职责与服务拆分