归一化切割Normalized cut 是一种分群(cluster grouping)技术,在数据处理和图像处理方面有很广的运用
用其实现图像分割的思路是,把一个图片看成一个图(graph), 然后计算权重图(weighted graph),然后分割成一些具有相同特征(纹理, 颜色,明度等)的区域。
想要理解代码的含义,首先要先要理解一些基本的概念:
1.什么是图(graph)?
我们定义G = (V, E), 其中,V是顶点(vertex), E是边(edge)。
2.什么是权重图(weighted graph)
就是边(edge)上有权重(weight)的图,如下图所示:
(图1)
我们把这个图分成两个子集左侧的A和右侧的B, 通过观察,A由4个顶点组成,B由5个顶点组成。需要注意的是,同属于一个子集中的顶点之间的边的权重的值相对来说会大一些。子集与子集直接的点的边上的权重会小, 这个特性也就是normalized cut能分割区域的基础了。这张图表示是,相近的点之间的权重大。但是实际运用中,距离并不是衡量权重的唯一标准。如何计算权重是具体项目具体设计的了。
想要理解normalized cut 需要先理解什么是分割(cut)与最小化分割(min cut)
我这里用相对数学一点的表述方式:
把G = (V,E) 分成两个子集A,B,另:
其中, 就是权重(weight), 最小化分割就是让上式的值最小的分割。如何理解这个过程?
拿图一做例子,我们把图一看成一个整体G,目的是把它分成两个部分。显然中间的两条权重为0.1的边就是最小化切割。最小化分割很完美的就解决了把这个G分成两部分的任务,但是问题来了如下图(图2)所示,最小化切割性能就不很好了。
(图2)
可以看到,图2所示的情况,想要的结果是中间虚线表示的分割,但是最小化切割却切掉了最边缘的角。这很容易理解,因为最小化切割就是让cut(A,B)的值最小的情况,而边缘处cut值确实是最小。因此我们称最小化切割时有偏差的(bias)。如何去除这种偏差就要引入我们这篇文章的主角归一化切割了。
其中:
assoc(A,V)的含义是A中所有点到图中做有点的权重的和。通过上面的公式我们可以很清晰的看到Ncut在追求不同子集间点的权重最小值的同时也追求同一子集间点的权重最大值
至此,数学含义已经讲的差不多了,但是如果想要写成代码,我们需要用矩阵数学的知识重新把normalized cut解释一遍。