我非常了解那个来源。那是 Boykov-Kolmogorov Graph Cuts 库。我建议你首先做的是read their paper。
Graph Cuts 是一种交互式图像分割算法。您将图像中的像素标记为您认为属于对象(也称为前景)和不属于对象(也称为背景)的像素。这就是你首先需要的。执行此操作后,Graph Cuts 算法最佳猜测图像中其他像素的标签是什么。它基本上会遍历每个未标记的其他像素,并确定它们是否属于前景和背景。
Graph Cuts 背后的整个前提是图像分割类似于能量最小化。图像分割可以表述为两个项相加的成本函数:
- Self-Penalty:这是将每个像素分配为前景或背景的成本。这也称为数据成本。
- 相邻惩罚:这强制相邻像素或多或少应该共享相同的分类标签。这也称为平滑成本。
这种公式被称为最大后验马尔可夫随机场分类问题(MAP-MRF)。目标是最小化该成本函数,以便您实现最佳图像分割。这实际上是一个 NP-Hard 问题,并且实际上是 Clay Math Institute 提供资金的问题之一。
Boykov 和 Kolmogorov 从理论上证明了 MAP-MRF 问题可以转化为图论,解决 MAP-MRF 问题类似于将您的图像形成具有源和汇链接以及链接的图将相邻像素连接在一起。要求解 MAP-MRF,请执行最大流/最小割算法。有很多方法可以做到这一点,但 Boykov / Kolmogorov 找到了一种更有效的方法,比更成熟的算法(如 Push-Relabel、Ford-Fulkenson 等)快得多。
自我惩罚是所谓的t个链接,而相邻的惩罚是所谓的n个链接。您应该阅读论文以了解这些是如何计算的,但 t 链接描述了分类惩罚。基本上,将每个像素分类为属于前景或背景的成本是多少。这些通常基于图像的负对数概率分布。你要做的是创建一个被分类为前景的分布的直方图和一个被分类为背景的直方图。
通常,对前景和背景的每个颜色通道进行统一量化就足够了。然后您将这些转换为 PDF,但除以每个直方图中的元素总数,然后当您计算每个像素的 t 链接时,您可以访问颜色,然后查看它在直方图中的位置,然后取负对数。这将告诉您将该像素分类为前景或背景的成本。
相邻像素成本更直观。人们通常只取一个像素和相邻像素之间的欧几里得距离,并将这个距离应用于高斯。为简单起见,通常使用 4 像素邻域(北、南、东和西)。
一旦你弄清楚如何计算成本,你就可以按照这个过程:
- 将像素标记为前景或背景。
- 使用他们的库创建图形结构
- 计算前景和背景像素的直方图
- 计算 t 链接并添加到图表中
- 计算 n 链接并添加到图表中
- 在图表上调用
maxflow 例程来分割图像
- 遍历每个像素并确定该像素属于前景还是背景。
- 创建一个反映这一点的二进制映射,然后复制二进制映射为 true 的图像像素,当它为 false 时不要这样做。
maxflow的原始来源可以在这里找到:http://pub.ist.ac.at/~vnk/software/maxflow-v3.03.src.zip
它还有一个自述文件,因此您可以通过一些示例图像了解该库应该如何工作。
您需要消化很多东西,但 Graph Cuts 是目前最强大的交互式分割工具之一。
祝你好运!