本次针对人像的 matting 算法做些简单的调研和介绍。
参考一介绍了部分 matting 算法,也展示了一部分的效果。
自己尝试了 closed form matting、alpha matting、knn matting、shared matting
。
这里有一个迪士尼出的影像级 matting 算法论文和介绍,视频中对比了各种算法的效果。链接,效果好的出奇,也符合影像级的要求了,还能解决目标身上的绿色晕染的问题,确实厉害。
image matting是一个专门整理和对比各类 matting 算法的网站,可以从这里找到一些参考和思路。
貌似大部分的 matting 都需要有2张图,一张原图,另一张要么是 scribble image, 要么是 trimap。scribble需要交互式的划出前景和背景图,trimap 一般比较难生成,除了一些提到用膨胀腐蚀来生成以外,似乎真实的场景下,如果想直接做 matting 的话,很难拿到 trimap 的结构,感觉非常的学术研究用途(蛋疼)。
抠图的问题,本质上是要求解
I
i
=
α
i
F
i
+
(
1
−
α
i
)
B
i
I_i=α_iF_i+(1−α_i)B_i
Ii=αiFi+(1−αi)Bi
由于前景F 和背景 B 都是未知,约束不足(under-constrained),要求解 α α α,就得有用户输入提示(有 trimap 和 scribbles 两种,起始是给出了 α α α的初始估计,scribbles更简洁)和图像分布假设。
closed form matting介绍(2008 PAMI)
推导过程
源码可见
灰度图的处理:需要假设 F 和 B 是局部平滑的,由此可以得到需要求解的问题变成:
J
(
α
)
=
α
T
L
α
J(α) = α^TLα
J(α)=αTLα
L
L
L即 matting laplace 矩阵,重要矩阵,正定且稀疏。最小二乘法求解
L
L
L 。
彩色图的处理:有3个通道,假设图像符合 color line model
,即假定子窗口内的前景和背景像素值不是固定的,而是位于一条直线上。同样是要求解
L
L
L。
L
L
L 的求解是image 独立的,只跟input image 有关,跟其他无关。之后计算用户输入约束下的优化问题,略;
注:计算巨慢无比,500*333分辨率大概也得20-30s。
knn matting
推导过程
源码可见
跟前面的灰度图的假设一致,且,matting laplace 矩阵的定义也一致。重点是提出了一种新的矩阵
L
L
L 的求解方式,即基于 KNN 的拉普拉斯矩阵计算方法。
定义像素的特征向量,计算相似度矩阵(取每个像素的 k 近邻),然后求解拉普拉斯矩阵,最后求解线性方程的解,即是 α \alpha α。
shared(alpha) matting
源码有多个版本,可以在 github 上搜索下
核心:速度加快。确实比较快一些,800*563的图,整个过程大概<10s,不过这里是 c++版本测试的,可能本身就比前面的 python 版本快。
引:
搜索过程:之所以叫 shared matting ,是因为在选择(前景-背景)候选集的时候,并不是每个未知像素都搜索以自己为中心的整个圆形区域。而是把圆分成了很多扇形,相邻像素搜索不重叠的扇形区域。避免了大面积搜索,同时由于相邻像素的 (alpha, F, B)值近似,因此将相邻像素的搜索结果(候选集)拿来共用,共同估计出当前像素的(alpha, F, B)。