图像形变算法
图像形变算法
参考:特效:脸部变形分析
需要注意的是,以下算法计算的都是形变的逆变换,即对于当前点计算形变前的像素坐标。
局部调整算法:基于1993年Andreas Gustafsson的文章 Interactive Image Warping
图像局部缩放算法(大眼或小眼)
参考:图像美容之眼睛放大算法。
参考:大眼之膨胀算法
参考:在OpenGL中利用shader进行实时瘦脸大眼等脸型微调
原算法来源于上述论文的局部缩放方法,以下方法为改进后。
包含三个参数:中心点
O
(
X
,
Y
)
O(X, Y)
O(X,Y),画笔大小(半径)
r
r
r,力度
s
s
s。
中心点以及画笔大小决定算法影响范围,力度影响缩放程度。
算法主要思想:处理以中心点为原点,画笔大小为半径的范围内像素,将范围内像素替换成该像素与中心像素连线上的某一点像素值。
设中心点
O
(
X
,
Y
)
O(X, Y)
O(X,Y),画笔大小(半径)
r
r
r,力度
s
s
s
(1)对于范围内任意像素点
(
x
1
,
y
1
)
(x1, y1)
(x1,y1), 计算其与中心点的距离平方
d
2
=
(
x
1
−
X
)
2
+
(
y
1
−
Y
)
2
d^2 =(x1-X)^2+(y1-Y)^2
d2=(x1−X)2+(y1−Y)2。
(2)计算缩放比例因子:
k
=
1
−
(
s
/
100
)
∗
(
1
−
d
2
r
2
)
k = 1 - (s/100)*(1-\frac{d^2}{r2})
k=1−(s/100)∗(1−r2d2)
(3)计算对应的新像素点坐标:
x
=
(
x
1
−
X
)
∗
k
+
X
x = (x1-X)*k+X
x=(x1−X)∗k+X,
y
=
(
y
1
−
Y
)
∗
k
+
Y
y=(y1-Y)*k+Y
y=(y1−Y)∗k+Y
局部图像平移算法(瘦脸)
参考:人脸形变算法——液化变形
参考:大眼瘦脸
参数:中心点
C
C
C,半径为
r
r
r,平移方向为
m
⃗
−
c
⃗
(即
C
M
→
)
\vec m-\vec c (即\overrightarrow{CM})
m−c(即CM),范围内点
U
U
U变换到
U
′
U^{'}
U′。
M
M
M点为中心点对应的变换点。
主要思想:对于圆形范围内任意一点,求出变换前对应的浮点坐标,用变化前图像在
U
U
U点附近的像素进行插值,求出
U
U
U的像素值,作为变换后
U
′
U^{'}
U′点的像素值。
设中心点 C C C,半径为 r r r,平移方向为 m ⃗ − c ⃗ (即 C M → ) \vec m-\vec c (即\overrightarrow{CM}) m−c(即CM),范围内点 U U U变换到 U ′ U^{'} U′:
(1)求出半径平方
r
2
r^2
r2和变换后点
U
′
U^{'}
U′到中心点
C
C
C距离的平方
d
2
=
∣
x
⃗
−
c
⃗
∣
2
d^2 = |\vec x - \vec c|^2
d2=∣x−c∣2
(2)求出平移系数
(
r
2
−
d
2
(
r
2
−
d
2
)
+
(
∣
m
⃗
−
c
⃗
)
2
)
2
(\frac{r^2-d^2}{(r^2-d^2)+(|\vec m - \vec c)^2})^2
((r2−d2)+(∣m−c)2r2−d2)2 和平移方向
∣
m
⃗
−
c
⃗
∣
|\vec m - \vec c|
∣m−c∣
(3)计算
特点:
中心点变换的距离最大,圆周处不变换。
全局点位变形算法:基于2006年Scott Schaefer的文章Image deformation using moving least squares
全局点位变形
基于移动最小二乘图像变形算法(MLS)
参考论文:Image Deformation Using Moving Least Squares
参考:移动最小二乘法(MLS)对图像进行变形
参考:利用MLS移动最小二乘法对图像变形
参考:卡通图像变形算法(Moving Least Squares)附源码
最小二乘法:根据一组测量数据来预估函数参数的方法。该方法求得的函数参数满足函数值在这一组测量数据中获得最小误差平方和。
MLS主要思想:给定一组控制点
p
i
p_i
pi和对应的变换后的点
q
i
q_i
qi,针对图像上的每个像素点
v
v
v构建相应的仿射变换
l
v
(
x
)
l_v(x)
lv(x),使得误差的平方和最小:
∑
i
w
i
∣
l
v
(
p
i
)
−
q
i
∣
2
\sum_i w_i |l_v(p_i)-q_i|^2
i∑wi∣lv(pi)−qi∣2
其中
w
i
w_i
wi的值与
v
v
v有关:
w
i
=
1
∣
p
i
−
v
∣
2
α
w_i=\frac{1}{|p_i-v|^{2\alpha}}
wi=∣pi−v∣2α1。这样对于每一个像素点
v
v
v都能求出对应的变换函数
l
v
(
x
)
l_v(x)
lv(x)。
仿射变换
l
v
(
x
)
l_v(x)
lv(x)由两部分组成:线性变换和平移变换。因此仿射变换又可以写成
l
v
(
x
)
=
x
M
+
T
l_v(x)=xM+T
lv(x)=xM+T。代入上式得:
∑
i
w
i
∣
p
i
M
+
T
−
q
i
∣
2
\sum_i w_i|p_iM+T-q_i|^2
i∑wi∣piM+T−qi∣2。
现在的目标是求出
M
M
M和
T
T
T使得上述式子结果最小。令上述式子对
T
T
T的偏导为0,得到:
2
∑
i
w
i
(
p
i
M
+
T
−
q
i
)
=
0
2\sum_i w_i(p_iM+T-q_i)=0
2i∑wi(piM+T−qi)=0
解得:
T
=
∑
i
w
i
q
i
−
∑
i
w
i
p
i
M
∑
i
w
i
T=\frac{\sum_iw_iq_i-\sum_i w_ip_iM}{\sum_i w_i}
T=∑iwi∑iwiqi−∑iwipiM, 令
q
∗
=
∑
i
w
i
q
i
∑
i
w
i
q^*=\frac{\sum_i w_i q_i}{\sum_i w_i}
q∗=∑iwi∑iwiqi,
p
∗
=
∑
i
w
i
p
i
∑
i
w
i
p^*=\frac{\sum_i w_i p_i}{\sum_i w_i}
p∗=∑iwi∑iwipi,则
T
=
q
∗
−
p
∗
M
T=q^*-p^*M
T=q∗−p∗M。因此,
l
v
(
x
)
l_v(x)
lv(x)可以改写为
l
v
(
x
)
=
x
M
+
T
=
x
M
+
q
∗
−
p
∗
M
=
(
x
−
p
∗
)
M
+
q
∗
l_v(x)=xM+T=xM+q^*-p^*M=(x-p^*)M+q^*
lv(x)=xM+T=xM+q∗−p∗M=(x−p∗)M+q∗。
上述平方和公式可以改写为
∑
i
w
i
∣
l
v
(
p
i
)
−
q
i
∣
2
=
∑
i
w
i
∣
(
p
i
−
p
∗
)
M
+
(
q
∗
−
q
i
)
∣
2
=
∑
i
w
i
∣
(
p
i
−
p
∗
)
M
−
(
q
i
−
q
∗
)
∣
2
\sum_i w_i |l_v(p_i)-q_i|^2=\sum_i w_i |(p_i-p^*)M+(q^*-q_i)|^2=\sum_i w_i |(p_i-p^*)M-(q_i-q^*)|^2
i∑wi∣lv(pi)−qi∣2=i∑wi∣(pi−p∗)M+(q∗−qi)∣2=i∑wi∣(pi−p∗)M−(qi−q∗)∣2
令
p
^
i
=
p
i
−
p
∗
\hat{p}_i=p_i-p^*
p^i=pi−p∗,
q
^
i
=
q
i
−
q
∗
\hat{q}_i=q_i-q^*
q^i=qi−q∗。上述式子改写为
∑
i
w
i
∣
p
^
i
M
−
q
^
i
∣
2
\sum_i w_i |\hat{p}_iM-\hat{q}_i|^2
∑iwi∣p^iM−q^i∣2。
将式子展开可得
∑
i
w
i
∣
p
^
i
M
−
q
^
i
∣
2
=
∑
i
w
i
(
p
^
i
M
−
q
^
i
)
(
p
^
i
M
−
q
^
i
)
T
\sum_i w_i |\hat{p}_iM-\hat{q}_i|^2=\sum_i w_i (\hat{p}_iM-\hat{q}_i)(\hat{p}_iM-\hat{q}_i)^T
∑iwi∣p^iM−q^i∣2=∑iwi(p^iM−q^i)(p^iM−q^i)T
∑ i w i ∣ p ^ i M − q ^ i ∣ 2 = ∑ i w i ( p ^ i M − q ^ i ) ( p ^ i M − q ^ i ) T = ∑ i w i ( p ^ i M ( p ^ i M ) T − p ^ i M q ^ i T − q ^ i ( p ^ i M ) T + q ^ i q ^ i T ) = ∑ i w i ( p ^ i M M T p ^ i T − 2 p ^ i M q ^ i T + q ^ i q ^ i T ) \begin{aligned} \sum_i{w_i |\hat{p}_iM-\hat{q}_i|^2}&=\sum_i{w_i (\hat{p}_iM-\hat{q}_i)(\hat{p}_iM-\hat{q}_i)^T} \\ &=\sum_i{w_i(\hat{p}_i M(\hat{p}_iM)^T - \hat{p}_iM\hat{q}_i^T - \hat{q}_i(\hat{p}_iM)^T + \hat{q}_i\hat{q}_i^T)} \\ &=\sum_i{w_i(\hat{p}_i MM^T\hat{p}_i^T - 2\hat{p}_iM\hat{q}_i^T + \hat{q}_i\hat{q}_i^T)} \end{aligned} i∑wi∣p^iM−q^i∣2=i∑wi(p^iM−q^i)(p^iM−q^i)T=i∑wi(p^iM(p^iM)T−p^iMq^iT−q^i(p^iM)T+q^iq^iT)=i∑wi(p^iMMTp^iT−2p^iMq^iT+q^iq^iT)
注意,根据矩阵的性质有, ( p ^ i M ) T = M T p ^ i T (\hat{p}_iM)^T=M^T\hat{p}_i^T (p^iM)T=MTp^iT,另外标量的转置等于该标量自身, q ^ i ( p ^ i M ) T \hat{q}_i(\hat{p}_iM)^T q^i(p^iM)T为标量,因此 q ^ i ( p ^ i M ) T = p ^ i M q ^ i T \hat{q}_i(\hat{p}_iM)^T=\hat{p}_iM\hat{q}_i^T q^i(p^iM)T=p^iMq^iT。(可以假设 p ^ i \hat{p}_i p^i为1x2的行向量,矩阵M为2x2的矩阵)
我们需要求得令上述和式最小化的
M
M
M的值,令上述和式子对
M
M
M求偏导,
∂
f
∂
M
=
∑
i
w
i
(
∂
(
(
p
^
i
T
)
T
(
M
T
)
T
M
T
p
^
i
T
)
∂
M
−
2
p
^
i
T
q
^
i
)
=
∑
i
w
i
(
[
∂
(
(
p
^
i
T
)
T
(
M
T
)
T
M
T
p
^
i
T
)
∂
M
T
]
T
−
2
p
^
i
T
q
^
i
)
=
∑
i
w
i
(
2
[
M
T
p
^
i
T
p
^
i
]
T
−
2
p
^
i
T
q
^
i
)
=
∑
i
w
i
(
2
p
^
i
T
p
^
i
M
−
2
p
^
i
T
q
^
i
)
=
2
∑
i
(
p
^
i
T
w
i
p
^
i
M
−
p
^
i
T
w
i
q
^
i
)
\begin{aligned} \frac{\partial{f}}{\partial{M}} &= \sum_i{w_i(\frac{\partial{((\hat{p}_i^T)^T(M^T)^TM^T\hat{p}_i^T)}}{\partial{M}} - 2\hat{p}_i^T\hat{q}_i)} \\ &=\sum_i{w_i([\frac{\partial{((\hat{p}_i^T)^T(M^T)^TM^T\hat{p}_i^T)}}{\partial{M^T}}]^T - 2\hat{p}_i^T\hat{q}_i)} \\ &=\sum_i{w_i(2[M^T\hat{p}_i^T\hat{p}_i]^T - 2\hat{p}_i^T\hat{q}_i)} \\ &=\sum_i{w_i(2\hat{p}_i^T\hat{p}_iM - 2\hat{p}_i^T\hat{q}_i)} \\ &=2\sum_i{(\hat{p}_i^Tw_i\hat{p}_iM - \hat{p}_i^Tw_i\hat{q}_i)} \end{aligned}
∂M∂f=i∑wi(∂M∂((p^iT)T(MT)TMTp^iT)−2p^iTq^i)=i∑wi([∂MT∂((p^iT)T(MT)TMTp^iT)]T−2p^iTq^i)=i∑wi(2[MTp^iTp^i]T−2p^iTq^i)=i∑wi(2p^iTp^iM−2p^iTq^i)=2i∑(p^iTwip^iM−p^iTwiq^i)
注意,根据标量函数
f
f
f对矩阵
M
M
M求偏导的性质,有
∂
f
∂
(
M
T
)
=
[
∂
f
∂
M
]
T
\frac{\partial{f}}{\partial{(M^T)}}=[\frac{\partial{f}}{\partial{M}}]^T
∂(MT)∂f=[∂M∂f]T,
∂
(
x
T
A
T
A
x
)
∂
A
=
2
A
x
x
T
\frac{\partial{(x^TA^TAx)}}{\partial{A}}=2Axx^T
∂A∂(xTATAx)=2AxxT,
∂
(
u
T
A
v
)
∂
A
=
u
v
T
\frac{\partial{(u^TAv)}}{\partial{A}}=uv^T
∂A∂(uTAv)=uvT
令上述求得的偏导结果为0,可得
2
∑
i
(
p
^
i
T
w
i
p
^
i
M
−
p
^
i
T
w
i
q
^
i
)
=
0
2\sum_i{(\hat{p}_i^Tw_i\hat{p}_iM - \hat{p}_i^Tw_i\hat{q}_i)}=0
2∑i(p^iTwip^iM−p^iTwiq^i)=0,解得
M
=
[
∑
i
(
p
^
i
T
w
i
p
^
i
)
]
−
1
∑
i
(
p
^
i
T
w
i
q
^
i
)
M=[\sum_i{(\hat{p}_i^Tw_i\hat{p}_i)}]^{-1} \sum_i{(\hat{p}_i^Tw_i\hat{q}_i)}
M=[∑i(p^iTwip^i)]−1∑i(p^iTwiq^i)
添加不同的限制条件对转换矩阵
M
M
M进行条件限制后,可以得到三种不同形式的转换矩阵
M
M
M:仿射变形、相似变形和刚性变形。
头部姿态(roll、yaw、pitch)
参考:
[1] 人脸实战之角度检测篇