本节继续上一节的讨论
sudit:Closed Form Matting 算法抠图以及优化(1)——目标函数zhuanlan.zhihu.com
构建拉普拉斯矩阵
首先,我们复习下矩阵乘法的分块形式,假设矩阵
![]()
和向量
![]()
按如下分块
那么
如果我们假设
![]()
,即
![]()
是一个带状矩阵,那么就有
这让我们看到了和前面推导的目标函数形式上的相似之处
而且我们知道,
![]()
其实就是向量
![]()
的一部分,这和
![]()
与
![]()
的关系相当,唯一的区别是
![]()
元素的位置在
![]()
上不是连续的,但这并不重要。于是,通过这种类比,我们可以推断,存在一个矩阵
![]()
,使得
由于刚才我们假设
![]()
是带状矩阵,那么有理由相信
![]()
肯定也是带状矩阵。因为
![]()
在
![]()
上不是连续的,对于单个
![]()
来说,其乘法关系在全量的矩阵表示形式下如图所示,图中黑色的部分代表对应的
![]()
和
![]()
。
现在,我们面临着和矩阵乘法分块相反的问题,那就是把已经分块的矩阵重新拼凑成原矩阵,即组装
![]()
。这与有限元中通过单元刚度矩阵组装总体刚度矩阵的方法十分相似,说不定它们之间还存在着更深刻的联系。
在讨论如何通过
![]()
来组装
![]()
之前,我们先回顾
![]()
这两个量的物理意义,
![]()
是由每个像素的透明度组成的向量,由于图片是二维的,所以我们按横向扫描所有像素,它的具体形式为
而
![]()
是第
![]()
个窗口的所有像素透明度组成的向量,同样按横向扫描
其中的下标
![]()
等是
![]()
中的元素索引。这里需要注意一下,前面在定义
![]()
的时候,最后还有一个元素为 0,这里我们去掉了,因为可以证明,如果向量
![]()
的某些位等于 0,那么只需要去掉这些位,以及
![]()
中相应的的行和列,其结果是等价的
其中
![]()
是修改之后的向量和矩阵。
现在我们举个简单的例子,假设
那么按照向量矩阵乘法的要求,
![]()
在
![]()
中的位置分布如下
也就是说,
![]()
的元素在
![]()
中的位置与
![]()
元素的下标有关,其对应关系为
其中
![]()
为
![]()
中第
![]()
个元素的下标。由于不同的
![]()
可能在
![]()
上的位置重叠,我们只需要将它们相加即可,因为矩阵乘法只是简单的线性操作。
使用上述方法构造出
![]()
之后,我们便得到了关于目标函数的新的表示形式
其中,
![]()
又被称为拉普拉斯矩阵。从而,优化的目标为
根据前面我们对
![]()
的推导可以证明,
![]()
的每一个元素都是非负的,并且按照定义
![]()
的每一个元素也是非负的,这样一来,就只需要令
![]()
的每一个元素都为 0,从而使
![]()
达到极小值 0,但这显然毫无意义。
这里的问题就出在我们没有对
![]()
施加约束条件,因为,我们知道肯定有一部分
![]()
是等于 1 的(即我们要提取的前景),所以大部分抠图算法都要求使用者提供约束条件,也就是说,给出部分绝对正确的前景和背景。Trimap 图便是一种这样的约束形式。
考虑上面第一张图,如果我们要抠取小狗的图像,那么其对应的 trimap 图如第二张图所示。其实就是把原图分割成三个部分,分别是100%背景,100%前景以及不那么确定的部分,这个不确定的部分就是我们要求解的,其余的都算约束。于是加上约束的优化目标就变成了
其中
![]()
是背景索引集合,
![]()
是前景索引集合。本节暂时到此未知,总结一下,我们首先通过对分块矩阵的乘法原理进行分析,假设出目标函数也具有类似
![]()
这样的乘法结构,然后发现了
![]()
是
![]()
的一部分元素,于是利用前者组装出后者,将目标函数
![]()
转换成了矩阵乘法形式,最后加入约束条件,得出了带约束的优化目标。