Python计算机视觉编程第九章——图像分割

本文深入探讨Python计算机视觉中的图像分割技术,包括图割(Graph Cut)原理与应用,利用聚类进行分割的归一化切割算法,以及变分法中的Chan-Vese模型。通过实例分析,展示了不同方法在图像分割中的效果和优劣,强调了在复杂背景和用户交互场景下分割的挑战与解决方案。
摘要由CSDN通过智能技术生成

(一)图割(Graph Cut)

图论中的图(graph)是由若干节点(有时也称顶点)和连接节点的边构成的集合。边可以是有向的或无向的,并且这些可能有与它们相关联的权重。

图割是将一个有向图分割成两个互不相交的集合,可以用来解决很多计算机视觉方面的问题,诸如立体深度重建、图像拼接和图像分割等计算机视觉方面的不同问题。

从图像像素和像素的近邻创建一个图并引入一个能量或“代价”函数,我们有可能利用图割方法将图像分割成两个或多个区域。图割的基本思想是,相似且彼此相近的像素应该划分到同一区域。

图割 C(C 是图中所有边的集合)的“代价函数定义为所有割的边的权重求合相加
E c u t = ∑ ( i , j ) ⊂ C W i j E_{cut} = \sum_{(i,j)\subset C}^{}W_{ij} Ecut=(i,j)CWij

W i j W_{ij} Wij是图中节点i到节点j的边(i,j)的权重,并且是对割 C 所有的边进行求和。

图割图像分割的思想是用图来表示图像,并对图进行划分以使割代价 E c u t E_{cut} Ecut最小。在用图表示图像时,增加两个额外的节点,即源点和汇点;并仅考虑那些将源点和汇点分开的割。

寻找最小割(minimum cut 或 min cut)等同于在源点和汇点间寻找最大流(maximum flow 或 max flow)

  1. 最大流不可能大于最小割,因为最大流所有的水流都一定经过最小割那些割边,流过的水流怎么可能比水管容量还大呢?
  2. 最大流不可能小于最小割,如果小,那么说明水管容量没有物尽其用,可以继续加大水流。

最大流 :把有向图看作是水管,容量就是能够通过该水管段最高单位流量。基于此类比,最大流就是从起点到终点所能达到的最高单位流量。

计算最大流:假如顶点s(源点)源源不断有水流出,边的权重代表该边允许通过的最大水流量,请问顶点t(终点)流入的水流量最大是多少?

从源点s到终点t共有3条路径:

  1. s -> a -> t (流量被边s -> a限制,最大流量为2)
  2. s -> b -> t (流量被边”b -> t”限制,最大流量为3)
  3. s -> a -> b-> t (边s -> a的流量已经被s -> a -> t 占满,没有流量)

所以顶点流入的最大流为:
2 + 3 = 5 2+3=5 2+3=5

最小割:最小割就是将图切割为两个部分时,代价最小的割的集合。

计算最小割:以最大流图为例,剪短图中的某几条边,使得不存在从s到t的路径,并且保证所减的边的权重和最小。

剪掉边s->a,b->t,剪完以后如图所示:

图中已不存在从s->t的路径,且所修剪的边的权重和为:
2 + 3 = 5 2 + 3 = 5 2+3=5
为所有修剪方式中权重和最小的。这样的修剪称为最小割。

可以观察到,最小割和最大流都为5。

举例:用 python-graph 工具包计算一幅较小的图的最大流 / 最小割

from pygraph.classes.digraph import digraph
from pygraph.algorithms.minmax import maximum_flow

gr = digraph()
gr.add_nodes([0,1,2,3])

gr.add_edge((0,1), wt=4)
gr.add_edge((1,2), wt=3)
gr.add_edge((2,3), wt=5)
gr.add_edge((0,2), wt=3)
gr.add_edge((1,3), wt=4)
flows,cuts = maximum_flow(gr, 0, 3)
print ('flow is:' , flows)
print ('cut is:' , cuts)

创建有 4 个节点的有向图,4 个节点的索引分别 0…3,然后用 add_edge() 增添边并为每条边指定特定的权重。边的权重用来衡量边的最大流容量。以节点 0 为源点、3 为汇点,计算最大流。打印出流和割结果:
在这里插入图片描述
上面两个 python 字典包含了流穿过每条边和每个节点的标记:0 是包含图源点的部分,1 是与汇点相连的节点。

1.1 从图像创建图

给定一个邻域结构,我们可以利用图像像素作为节点定义一个图。这里讨论最简单的像素四邻域和两个图像区域(前景和背景)情况。一个四邻域 (4-neighborhood)指一个像素与其正上方、正下方、左边、右边的像素直接相连 。

除了像素节点外,我们还需要两个特定的节点——源点和汇点,来分别代表图像的前景和背景。可以利用一个简单的模型将所有像素与源点、汇点连接起来。

步骤:

  1. 每个像素节点都有一个从源点的传入边;
  2. 每个像素节点都有一个到汇点的传出边;
  3. 每个像素节点都有一条传入边和传出边连接到它的近邻。

为确定边的权重,需要一个能够确定这些像素点之间,像素点与源点、汇点之间边的权重(表示那条边的最大流)的分割模型。

像素 i 与像素 j 之间的边的权重记为 w i j w_{ij} wij,源点到像素 i 的权重记为 w s i w_{si} wsi,像素 i 到汇点的权重记为 w i t w_{it} wit

假定我们已经在前景和背景像素(从同一图像或从其他的图像)上训练出了一个贝叶斯分类器,我们就可以为前景和背景计算概率 p F ( I i ) p_{F}(I_{i}) pF(Ii) p B ( I i ) p_{B}(I_{i}) pB(Ii)。这里, I i I_i Ii是像素 i 的颜色向量。

W s i = P F ( I i ) P F ( I i ) + P B ( I i ) W_{si}=\frac{P_{F}(I_{i})}{P_{F}(I_{i})+P_{B}(I_{i})} W

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值