TutteEmbedding

Tutte Embedding是一种将三维的图画在二维平面上的办法。我们知道,三维图,如人脸的三维mesh如果想要画在二维平面上,并且能够清楚地展示其拓扑结构,光去掉z坐标将其强行压平是不够的,这样子操作会使得多个立体的节点在平面上重合,不再是一个简单图。Tutte Embedding就是解决这样的问题而存在的,只要指定外轮廓在二维平面上的位置,算法就能够自动计算其他节点在二维平面上合适的位置,且能够保持原有的拓扑信息。

Tutte Embedding需要指定外轮廓的坐标,根据内部节点分布的权重,Tutte Embeeding可以有多个版本。

feature matching

barymetric mapping

第一种是简单的barymetric mapping, 该方法内部节点的分布完全由外轮廓所指定,只要确定了外轮廓的坐标,那么内部节点的左边也随之确定,不会考虑到内部节点之间的距离等因素。其做法就是解线性方程组。

Spline Warp

怎样将网格样条化

http://alumni.media.mit.edu/~maov/classes/comp_photo_vision08f/lect/07_Image%20Morphing.pdf
https://baike.baidu.com/item/Delaunay%E4%B8%89%E8%A7%92%E5%89%96%E5%88%86%E7%AE%97%E6%B3%95

Delaunay Triangulation(完美三角剖分)

给定一系列的点,怎样做三角化?这里有个方法叫做delaunay triangulation, 能够做到没有一个三角形的外接圆内包含第四个点(边界除外)。
560px-Delaunay_circumcircles_vectorial.svg

它的好处是,由于每三个点都在一个独立的外接圆上,因此所有点组成的三角形的角的和是比较大的,它能够较大限度提高了最小的角的下限。

算法步骤

首先建立一个足够大的三角形来包含所有的样本点,以这个三角形为起始,逐步添加样本点进来。在某一个时刻,将一个新的点添加进来,检查现有网格里面所有的三角形,如果某个三角形的外接圆包含了这个新的顶点,那么就将这个三角形记录下来。所有外接圆包含这个点的三角形会形成一个多边形,这个多边形的外边缘和这个点组合成新的星形的三角形。如图所示:

triangulate2c

triangulate2b

为什么这样子有用呢,因为这样子相当于外边缘换了一个更小的外接圆(此时原本在圆内的点变成了在圆上,也就是,之前能够将这个点收在囊中的外接圆都逐渐缩小到刚好在边界上与这个点相交。)重复这个过程,就能够获得最后的结果。

做surface interpolation

合成三角形后的三角形变

合成三角形后,需要在源A的形变应用到B中,这需要特定的方法来将两个三角形对应的像素放在一起。详细可以看这篇教程:
https://www.learnopencv.com/warp-one-triangle-to-another-using-opencv-c-python/

An Affine Transform is the simplest way to transform a set of 3 points ( i.e. a triangle ) to another set of arbitrary 3 points. It encodes translation ( move ), scale, rotation and shear.

https://inst.eecs.berkeley.edu/~cs194-26/fa17/upload/files/proj4/cs194-26-aae/

0%