欢迎关注更多精彩
关注我,学习常用算法与数据结构,一题多解,降维打击。
学习文章
关注公众号回复 Mesh Denoising GeoMetric
可获取电子书
去噪框架介绍
顶点移动迭代法
假设已经计算出来pi的移动向量vi,
对每个点进行迭代移动
for i=0 to iterator_num {
for each vertex pi {
pi=pi+λvi
}
}
λ是用户参数
vi 的计算方法也有很多:
利用uniform 权值 可以得到
v
i
=
1
N
i
∑
N
i
(
p
j
−
p
i
)
,
N
i
为
p
i
1
邻域点集
v_i = \frac {1}{N_i}\displaystyle \sum_{N_i}(p_j-p_i), N_i为pi1邻域点集
vi=Ni1Ni∑(pj−pi),Ni为pi1邻域点集
可以发现
v
i
+
p
i
=
1
N
i
∑
N
i
(
p
j
)
v_i + p_i = \frac {1}{N_i}\displaystyle \sum_{N_i}(p_j)
vi+pi=Ni1Ni∑(pj)
所以这种方法是把点往周围的平均值上移动。
利用cotangent权值
cotangent点击了解
v i = 1 2 A i [ ∑ p j ∈ N i ( c o t α i , j + c o t β i , j ) ( p j − p i ) ] v_i = \frac {1} {2A_i} \left [\displaystyle \sum_{p_j\in N_i}(cot \alpha_{i,j}+cot \beta_{i,j})(p_j-p_i)\right ] vi=2Ai1 pj∈Ni∑(cotαi,j+cotβi,j)(pj−pi)
领域面积计算
领域面积计算有三种形式
- 中点法,即取边的中点和三角形的中点连线后形成的多边形区域。
- 泰森多边法,对每条1邻域边作中垂线,形成的多边形区域。
- 混合法,默认用方法2,当三角形是钝角三角形时,泰森多边法形成的区域会越界,此时,越界的三角形的中心点用钝角对边的中点代替。
以上是比较常用的拉普拉斯平滑算法
还有其他定义vi的算法,可以参考论文中的引用文章
法向优化
基本定义
J 代表网格中所有三角形集合, n i 和 m i 是分别是第 i 个面的原法向和优化后的法向 J代表网格中所有三角形集合,n_i和m_i是分别是第i个面的原法向和优化后的法向 J代表网格中所有三角形集合,ni和mi是分别是第i个面的原法向和优化后的法向
a ∝ b , a 是向量, b 是表达式, ∝ 代表计算完以后要对 a 做单位化 a∝b, a是向量,b是表达式,∝代表计算完以后要对a做单位化 a∝b,a是向量,b是表达式,∝代表计算完以后要对a做单位化
基本步骤
1. 优化后得到 m i , ∀ i ∈ J 1. 优化后得到m_i, \forall i\in J 1.优化后得到mi,∀i∈J
2. 算出 v i 通过上述顶点移动迭代法,移动点使得面法向接近 m i 2. 算出v_i通过上述顶点移动迭代法,移动点使得面法向接近m_i 2.算出vi通过上述顶点移动迭代法,移动点使得面法向接近mi
法向优化类型
Youyi Zheng提出的双边滤波算法
基于三角面法向的双边滤波网格平滑算法实现
m i = 1 K p ∑ j ∈ N i A j W s ( d i j ) W r ( ∣ ∣ n i − n j ∣ ∣ ) ⋅ n j m_i = \frac{1}{K_p} \displaystyle \sum_{j\in N_i}A_{j}W_s(d_{ij})W_r(||n_i-n_j||)\cdot n_j mi=Kp1j∈Ni∑AjWs(dij)Wr(∣∣ni−nj∣∣)⋅nj
上述式子中
d i j 是面 i , 面 j 中心点的距离 d_{ij} 是面i,面j中心点的距离 dij是面i,面j中心点的距离
A j 表示第 j 个面的面积 A_j表示第j个面的面积 Aj表示第j个面的面积
W s ( x ) 是一个高斯函数 = e − x 2 2 σ s 2 , 其中 x = d i j 的长度, σ s 是可调参数 W_s(x)是一个高斯函数 = e^{-\frac{x^2}{2\sigma^2_s}}, \\其中x=d_{ij}的长度,\sigma_s是可调参数 Ws(x)是一个高斯函数=e−2σs2x2,其中x=dij的长度,σs是可调参数
W r ( x ) 是一个高斯函数 = e − x 2 2 σ r 2 , 其中 x = n k ( f i ) − n k ( f j ) 的长度, σ r 是可调参数 W_r(x)是一个高斯函数 = e^{-\frac{x^2}{2\sigma^2_r}}, \\其中x=n^k(f_i)-n^k(f_j)的长度,\sigma_r是可调参数 Wr(x)是一个高斯函数=e−2σr2x2,其中x=nk(fi)−nk(fj)的长度,σr是可调参数
K p = ∑ j ∈ N i A j W s ( d i j ) W r ( ∣ ∣ n i − n j ∣ ∣ ) K_p = \displaystyle \sum_{j\in N_i}A_{j}W_s(d_{ij})W_r(||n_i-n_j||) Kp=j∈Ni∑AjWs(dij)Wr(∣∣ni−nj∣∣)
Ohtake 提出 皱褶增强扩散
m i ∝ ∑ j ∈ M i ( a j e x p ( − c ( ψ i j / d i j ) 2 ) ) n j m_i∝\displaystyle \sum _{j\in M_i}(a_j exp(-c(\psi_{ij}/d_{ij})^2))n_j mi∝j∈Mi∑(ajexp(−c(ψij/dij)2))nj
M i 是与第 i 个面相邻的面集合,包括共享顶点和共享边关系 M_i 是与第i个面相邻的面集合,包括共享顶点和共享边关系 Mi是与第i个面相邻的面集合,包括共享顶点和共享边关系
a i 是面 i 的面积 , ψ i j 是 n i , n j 的夹角, d i j 是面 i , 面 j 中心点的距离 a_i是面i的面积,\psi_{ij}是n_i, n_j的夹角,d_{ij} 是面i,面j中心点的距离 ai是面i的面积,ψij是ni,nj的夹角,dij是面i,面j中心点的距离
文章中还提到了很多其他的算法。
点调整
基本步骤是遍历所有点pi,只移动当前点pi, 其他点不动。
我们可以列出能量方程
E d ( p i ) = ∑ R ∈ T i A R ( m R ⋅ ( p i − C R ) ) 2 E_d(p_i) = \displaystyle \sum_{R\in T_i} A_R(m_R\cdot (p_i-C_R))^2 Ed(pi)=R∈Ti∑AR(mR⋅(pi−CR))2
上述方程的意义是调整点,使得点与平面中心的连线与目标法向越垂直越好。
梯度
∇ E d ( p i ) = 1 ∑ R ∈ T i A R ⋅ ∑ R ∈ T i A R ( ( C R − p i ) ⋅ m R ) m R 文章给出的 ( 1 ) \nabla E_d(p_i) = \frac {1}{\displaystyle \sum_{R\in T_i} A_R}\cdot \displaystyle \sum_{R\in T_i} A_R((C_R-p_i)\cdot m_R)m_R 文章给出的(1) ∇Ed(pi)=R∈Ti∑AR1⋅R∈Ti∑AR((CR−pi)⋅mR)mR文章给出的(1)
∇ E d ( p i ) = ∑ R ∈ T i A R ( ( p i − C R ) ⋅ m R ) m R 我推导的 ( 2 ) \nabla E_d(p_i) =\displaystyle \sum_{R\in T_i} A_R((p_i-C_R)\cdot m_R)m_R 我推导的(2) ∇Ed(pi)=R∈Ti∑AR((pi−CR)⋅mR)mR我推导的(2)
A R 是三角形面积,有些情况下也可取 1 A_R 是三角形面积,有些情况下也可取1 AR是三角形面积,有些情况下也可取1
求导过程
上述式子是加和,可以拆来看单项,AR是常数。
那么问题就是转化为
f ( x ) = ( a ⋅ ( x − b ) ) 2 的导数问题 f(x) = (a\cdot (x -b))^2 的导数问题 f(x)=(a⋅(x−b))2的导数问题
根据复合求导规则
∇ f ( x ) = 2 ( a ⋅ ( x − b ) ) ⋅ b \nabla f(x) = 2 (a\cdot (x -b))\cdot b ∇f(x)=2(a⋅(x−b))⋅b
应用到能量方程得到(2)式
文章给出的梯度公式,与推导公式2处不同,
1处是在前面做了加权平均,2处是里面变量调换位置了,导致符号相反。
根据梯度下降法,如果想能量变小,变量要沿负梯度方向移动。
文章中提到令
v i = − ∇ E d ( p i ) v_i = -\nabla E_d(p_i) vi=−∇Ed(pi)
是符合梯度下降法的思想的。
但是公式(1)本身方向相反不符合思想,作者给出的公式(1)应该是一个经验性的公式,前面的加权应该是相当于λ的效果,直接迭代行了。
如果按照
v i = − ∇ E d ( p i ) v_i = -\nabla E_d(p_i) vi=−∇Ed(pi)
要取公式(2)比较合理。
具体应用
有了上述公式以后,还是按照顶点移动迭代法
v i = − ∇ E d ( p i ) v_i = -\nabla E_d(p_i) vi=−∇Ed(pi) 公式(2)
或 v i = ∇ E d ( p i ) v_i =\nabla E_d(p_i) vi=∇Ed(pi) 公式(1)
基于曲率各向异性去噪
基本思想
法向平滑可以理解为粒子流扩散的过程,比如水的流动。
在没有外力作用的情况下,粒子总是喜欢从浓度(密度)高的地方流向浓度低的地方,直到浓度趋于相同。
下面来讨论一下粒子密度变化率与粒子密度的关系。
这里涉及到散度,菲克定理和质量守恒定理,稍微了解一下,不懂也没事,直接看参数和算法流程
设现在有一个很薄平面金属板。
定义 P ( x , t ) 是 t 时刻在 x 附近的粒子密度, V ( x , t ) 是 t 时刻在 x 处的速度场, P , V 是可微的 定义P(x,t) 是t时刻在x附近的粒子密度,V(x, t) 是t时刻在x处的速度场,P,V是可微的 定义P(x,t)是t时刻在x附近的粒子密度,V(x,t)是t时刻在x处的速度场,P,V是可微的
根据质量守恒定律得到
∂ P ( x , t ) ∂ t = − ∇ ⋅ V ( x , t ) \frac {\partial P(x, t)}{\partial t} = -\nabla\cdot V(x, t) ∂t∂P(x,t)=−∇⋅V(x,t)
上述公式中∇⋅ 代表的是散度算子。
密度对时间求导就是密度的变化率,散度是指单位时间单位体积里往外的流量,这两者是相加为0。
根据菲克定理:菲克第一定律是指在单位时间内通过垂直于扩散方向的单位截面积的扩散物质流量(称为扩散通量)与该截面处的浓度梯度成正比。
V ( x , t ) = − c ∇ P ( x , t ) , ∇ 后面不带 ⋅ 是梯度 V(x, t) = -c \nabla P(x,t), \nabla 后面不带\cdot是梯度 V(x,t)=−c∇P(x,t),∇后面不带⋅是梯度
结合上述两个式子得到扩散方程:
∂ P ( x , t ) ∂ t = c Δ P ( x , t ) , Δ 是拉普拉斯,相当于二阶导 \frac {\partial P(x, t)}{\partial t} = c \Delta P(x,t), \Delta 是拉普拉斯,相当于二阶导 ∂t∂P(x,t)=cΔP(x,t),Δ是拉普拉斯,相当于二阶导
之前的法向平滑就是基于粒子扩散的思想,但是系数c是不受控制的,最终会显一个正态分布,就会导致很多特征被过度平滑了。
各向异性保特征去噪算法的核心思想就是根据每处的曲率来调节系数c使得各处扩散程不同,来保护特征。
参数介绍与法向调整
曲率显著性
kmax(v) 是点v的最大绝对曲率
rmin(v) = 1/kmax(v) 代表在v点处的最小曲率半径
lavg(v) 是v与1邻域的平均边长
曲率显著性
点的显著性 s(v) = kmax(v)*lavg(v)
面的显著性 s(f) 由三个点的显著性平均得到
权重函数
g ψ , ρ ( x ) = { 1 i f ∣ x ∣ ≤ ψ ψ 2 / ( ρ ( ψ − x ) 2 + ψ 2 ) o t h e r w i s e g_{\psi,\rho} (x)= \left \{ \begin {array}{lc} 1 & if|x| \le \psi \\ \psi^2/(\rho(\psi-x)^2+\psi^2) & otherwise \end{array} \right. gψ,ρ(x)={1ψ2/(ρ(ψ−x)2+ψ2)if∣x∣≤ψotherwise
ψ,ρ是用户给定的参数
权重函数作用,ψ是用为控制开始下降的值,ρ是控制下降速度越大下降越快。
法向迭代
n i t + 1 ∝ ( 1 − λ i ) n i t + λ i ∑ j ∈ M i c j ⋅ n j t n_i^{t+1}∝ (1-\lambda_i)n_i^t + \lambda_i\displaystyle\sum_{j\in M_i}c_j\cdot n_j^t nit+1∝(1−λi)nit+λij∈Mi∑cj⋅njt
上式中t是当前迭代次数
c j = g S ( ∣ s j ∣ ) , s j 是第 j 个面的显著性, g S 是权重函数, S 是参数对应到权重函数的两个参数 c_j = g_S(|s_j|), s_j是第j个面的显著性,g_S是权重函数,S是参数对应到权重函数的两个参数 cj=gS(∣sj∣),sj是第j个面的显著性,gS是权重函数,S是参数对应到权重函数的两个参数
λ i = g P ( s j t o t ) , s j t o t = m a x j ∈ M i ∣ s i − s j ∣ , g P 是权重函数, P 是参数 \lambda_i = g_P(s_j^{tot}), s_j^{tot}=max_{j\in M_i} |s_i-s_j|,g_P是权重函数,P是参数 λi=gP(sjtot),sjtot=maxj∈Mi∣si−sj∣,gP是权重函数,P是参数
从上面式子中可以看出,调整法向需要用户给定4个参数Sψ,Sρ, Pψ,Pρ。
Sψ,Sρ是控制单个面对法向的影响。
Pψ,Pρ是控制周围面差异对法向的影响。
算法流程
- 对所有的点计算最大曲率和平均边长,显著度s(v)
- 根据s(v) 计算出面的显著度s(f)
- 根据法向迭代公式调整法向
- 对于每个点利用公式(1)或(2)调整
本人码农,希望通过自己的分享,让大家更容易学懂计算机知识。创作不易,帮忙点击公众号的链接,帮忙转发,感激不尽。