Python计算机视觉 第9章-图像分割
图像分割是将一幅图像分割成有意义区域的过程。区域可以是图像的前景与背景或图像中一些单独的对象。这些区域可以利用一些诸如颜色、边界或近邻相似性等特征进行构建。
9.1 图割(Graph Cut)
图割(Graph Cut)是一种用于图像分割、能量最小化以及其他计算机视觉任务的离散优化算法。它主要基于图论,将图像分割问题转化为图结构上的最小割问题。
图割的基本概念
-
图模型:图割算法将图像表示为一个带权无向图,节点代表像素或像素的特征,边则表示这些节点之间的相似性。图中的每条边都有一个权重,表示两个像素之间的“关系强度”(例如颜色相似度、边缘强度等)。
-
源点(Source)和汇点(Sink):图中包含两个特殊节点,称为源点(Source)和汇点(Sink),分别表示前景和背景。在图像分割任务中,目标是将图分割为两部分,分别对应前景(源点关联的部分)和背景(汇点关联的部分)。
-
割(Cut):割是将图中的边分成两部分,其中一部分与源点相连,另一部分与汇点相连。算法通过选择一条割线,使得割线两侧的节点分别属于前景和背景。
-
最小割问题:在图割算法中,目的是找到一种分割方式,使得割线上的边权重之和最小,这对应于能量最小化问题。通过解决最小割问题,可以得到一个最优的图像分割。
图割的应用
- 图像分割:将图像中的前景与背景进行分割,常用于对象识别和图像处理。
- 能量最小化:图割算法可以用于求解一些能量最小化问题,例如图像去噪、图像修复等。
- 立体匹配:在立体视觉中,图割可以用于匹配两个图像之间的像素,从而计算视差图。
图割算法的流程
- 构建图模型:将图像转换为图的形式,节点代表像素,边表示像素间的关系。
- 设定能量函数:能量函数由数据项(Data Term)和光滑项(Smoothness Term)组成。数据项表示像素属于前景或背景的代价,光滑项表示相邻像素之间的相似性。
- 求解最小割:使用图割算法,找到能量函数最小的割,从而完成图像分割。
图割算法在图像分割任务中具有较高的准确性和鲁棒性,特别是在处理包含噪声的图像时表现良好。然而,它的计算复杂度较高,通常需要较大的计算资源。
9.1.1 从图像创建图
在图割算法中,图像首先需要被表示为一个图结构。这个图通常用 G=(V,E)G = (V, E)G=(V,E) 来表示,其中:
- VVV 表示图的节点集合,对应于图像中的像素或像素块。
- EEE 表示图的边集合,边连接的节点代表相邻的像素或像素块。
每个节点 v∈Vv \in Vv∈V 代表一个像素,每条边 e∈Ee \in Ee∈E 连接两个像素,边上的权重 wew_ewe 反映了这两个像素之间的相似性或距离。
图的构建过程:
-
节点定义:每个像素对应图中的一个节点,像素的特征(如颜色、纹理等)可以作为节点的属性。
-
边的连接:
- 相邻像素之间通过边连接,形成一个稠密的像素图。
- 边的权重 wew_ewe 通常根据像素之间的相似度或梯度强度来设定,常用的公式是:
we=exp(−∥Ip−Iq∥22σ2) w_e = \exp\left(-\frac{ {\lVert I_p - I_q \rVert^2}}{ {2\sigma^2}}\right) we=exp(−2σ2∥Ip−I