Graph Cut(图割算法)

article/2025/8/22 23:23:48

转载自:http://blog.csdn.net/zouxy09/article/details/8532111

 

  Graph cuts是一种十分有用和流行的能量优化算法,在计算机视觉领域普遍应用于前背景分割(Image segmentation)、立体视觉(stereo vision)、抠图(Image matting)等。

       此类方法把图像分割问题与图的最小割(min cut)问题相关联。首先用一个无向图G=<VE>表示要分割的图像,VE分别是顶点(vertex)和边(edge)的集合。此处的Graph和普通的Graph稍有不同。普通的图由顶点和边构成,如果边的有方向的,这样的图被则称为有向图,否则为无向图,且边是有权值的,不同的边可以有不同的权值,分别代表不同的物理意义。而Graph Cuts图是在普通图的基础上多了2个顶点,这2个顶点分别用符号”S”和”T”表示,统称为终端顶点。其它所有的顶点都必须和这2个顶点相连形成边集合中的一部分。所以Graph Cuts中有两种顶点,也有两种边。

第一种顶点和边是:第一种普通顶点对应于图像中的每个像素。每两个邻域顶点(对应于图像中每两个邻域像素)的连接就是一条边。这种边也叫n-links

第二种顶点和边是:除图像像素外,还有另外两个终端顶点,叫Ssource:源点,取源头之意)和Tsink:汇点,取汇聚之意)。每个普通顶点和这2个终端顶点之间都有连接,组成第二种边。这种边也叫t-links

       上图就是一个图像对应的s-t图,每个像素对应图中的一个相应顶点,另外还有st两个顶点。上图有两种边,实线的边表示每两个邻域普通顶点连接的边n-links,虚线的边表示每个普通顶点与st连接的边t-links。在前后景分割中,s一般表示前景目标,t一般表示背景。

       图中每条边都有一个非负的权值we,也可以理解为cost(代价或者费用)。一个cut(割)就是图中边集合E的一个子集C,那这个割的cost(表示为|C|)就是边子集C的所有边的权值的总和。

         Graph Cuts中的Cuts是指这样一个边的集合,很显然这些边集合包括了上面2种边,该集合中所有边的断开会导致残留”S”和”T”图的分开,所以就称为“割”。如果一个割,它的边的所有权值之和最小,那么这个就称为最小割,也就是图割的结果。而福特-富克森定理表明,网路的最大流max flow与最小割min cut相等。所以由BoykovKolmogorov发明的max-flow/min-cut算法就可以用来获得s-t图的最小割。这个最小割把图的顶点划分为两个不相交的子集ST,其中St TST=V 。这两个子集就对应于图像的前景像素集和背景像素集,那就相当于完成了图像分割。

        也就是说图中边的权值就决定了最后的分割结果,那么这些边的权值怎么确定呢?

       图像分割可以看成pixel labeling(像素标记)问题,目标(s-node)的label设为1,背景(t-node)的label设为0,这个过程可以通过最小化图割来最小化能量函数得到。那很明显,发生在目标和背景的边界处的cut就是我们想要的(相当于把图像中背景和目标连接的地方割开,那就相当于把其分割了)。同时,这时候能量也应该是最小的。假设整幅图像的标签label(每个像素的label)为L= {l1,l2,,,, lp },其中li0(背景)或者1(目标)。那假设图像的分割为L时,图像的能量可以表示为:

E(L)=aR(L)+B(L)

       其中,R(L)为区域项(regional term),B(L)为边界项(boundary term),而a就是区域项和边界项之间的重要因子,决定它们对能量的影响大小。如果a0,那么就只考虑边界因素,不考虑区域因素。E(L)表示的是权值,即损失函数,也叫能量函数,图割的目标就是优化能量函数使其值达到最小。

区域项:

,其中Rp(lp)表示为像素p分配标签lp的惩罚,Rp(lp)能量项的权值可以通过比较像素p的灰度和给定的目标和前景的灰度直方图来获得,换句话说就是像素p属于标签lp的概率,我希望像素p分配为其概率最大的标签lp,这时候我们希望能量最小,所以一般取概率的负对数值,故t-link的权值如下:

Rp(1) = -ln Pr(Ip|’obj’) Rp(0) = -ln Pr(Ip|’bkg’)

        由上面两个公式可以看到,当像素p的灰度值属于目标的概率Pr(Ip|’obj’)大于背景Pr(Ip|’bkg’),那么Rp(1)就小于Rp(0),也就是说当像素p更有可能属于目标时,将p归类为目标就会使能量R(L)小。那么,如果全部的像素都被正确划分为目标或者背景,那么这时候能量就是最小的。

边界项:

        其中,pq为邻域像素,边界平滑项主要体现分割L的边界属性,B<p,q>可以解析为像素pq之间不连续的惩罚,一般来说如果pq越相似(例如它们的灰度),那么B<p,q>越大,如果他们非常不同,那么B<p,q>就接近于0。换句话说,如果两邻域像素差别很小,那么它属于同一个目标或者同一背景的可能性就很大,如果他们的差别很大,那说明这两个像素很有可能处于目标和背景的边缘部分,则被分割开的可能性比较大,所以当两邻域像素差别越大,B<p,q>越小,即能量越小。

        好了,现在我们来总结一下:我们目标是将一幅图像分为目标和背景两个不相交的部分,我们运用图分割技术来实现。首先,图由顶点和边来组成,边有权值。那我们需要构建一个图,这个图有两类顶点,两类边和两类权值。普通顶点由图像每个像素组成,然后每两个邻域像素之间存在一条边,它的权值由上面说的“边界平滑能量项”来决定。还有两个终端顶点s(目标)和t(背景),每个普通顶点和s都存在连接,也就是边,边的权值由“区域能量项”Rp(1)来决定,每个普通顶点和t连接的边的权值由“区域能量项”Rp(0)来决定。这样所有边的权值就可以确定了,也就是图就确定了。这时候,就可以通过min cut算法来找到最小的割,这个min cut就是权值和最小的边的集合,这些边的断开恰好可以使目标和背景被分割开,也就是min cut对应于能量的最小化。而min cut和图的max flow是等效的,故可以通过max flow算法来找到s-t图的min cut。目前的算法主要有:

1) Goldberg-Tarjan

2) Ford-Fulkerson

3) 上诉两种方法的改进算法

 

权值:

         Graph cut3x3图像分割示意图:我们取两个种子点(就是人为的指定分别属于目标和背景的两个像素点),然后我们建立一个图,图中边的粗细表示对应权值的大小,然后找到权值和最小的边的组合,也就是(c)中的cut,即完成了图像分割的功能。

上面具体的细节请参考:

Interactive Graph Cuts for Optimal Boundary & Region Segmentation of Objects in N-D Images》(Boykoviccv01)这篇paper讲怎么用graphcut来做image segmentation

Boykov  Kolmogorov 俩人的主页上就有大量的code。包括maxflow/min-cutstereo algorithms等算法:

http://pub.ist.ac.at/~vnk/software.html

http://vision.csd.uwo.ca/code/

康奈尔大学的graphcuts研究主页也有不少信息:

http://www.cs.cornell.edu/~rdz/graphcuts.html

Image Segmentation: A Survey of Graph-cut Methods》(Faliu YiICSAI 2012


http://chatgpt.dhexx.cn/article/yaCyS9Qh.shtml

相关文章

sech和asech--双曲正割和反双曲正割函数

【功能简介】求变量的双曲正割和反双曲正割。 【语法格式】 1&#xff0e;Ysech(X) 计算X的双曲正割&#xff0c;sech(x)1/cosh(x)。X可以为向量、矩阵或多维数组&#xff0c;X中的元素可以为复数&#xff0c;所有表示角度的变量都采用弧度来表示。 2&#xff0e;Yasech (X) 计…

三角函数中的正弦、余弦、正切、余切、正割、余割函数性质及常用公式

三角函数 三角函数包括正弦、余弦、正切、余切、正割、余割函数 0 基础知识 正弦&#xff08;Sine&#xff09;&#xff1a;sin A CB/CA 余弦&#xff08;Cosine&#xff09; &#xff1a;cos A AB/CA 正切&#xff08;Tangent&#xff09;&#xff1a;tan A CB/BA 余切&a…

数学 三角函数 sin 正弦、cos 余弦、tan 正切、cot 余切、sec 正割、csc 余割 简介

目录 图解定义 文字定义 三角函数诱导公式 1.三角函数诱导公式记忆方法 2.三角函数诱导公式 诱导公式一&#xff1a;终边相同的角的同一三角函数的值相等 诱导公式二&#xff1a;πα的三角函数值与α的三角函数值之间的关系 诱导公式三&#xff1a;任意角α与-α的三角…

sinx、cscx、cosx、secx以及tanx、cotx图像详解

今天在复习三角函数一章中对正切正割等图像感觉比较有意思&#xff0c;仔细梳理了以下内容&#xff1a; sin&#xff1a;sine cos&#xff1a;cosine sec&#xff1a;secant csc&#xff1a;cosecant 首先明确定义&#xff1a;让我们解释一下sec(x)和cos(x)之间的关系。sec(x)是…

正割函数(sec)

1. 定义 正割与余弦互为倒数&#xff0c;余割与正弦互为倒数。即&#xff1a; ⎧⎩⎨⎪⎪⎪⎪secθ1cosθcscθ1sinθ \left\{ \begin{split}\secθ=\frac1{\cosθ} \\\cscθ=\frac1{\sinθ} \end{split} \right.也即在几何上&#xff0c;设 △ABC &#xff0c;∠C90&#xff…

printf 输出格式、域宽

printf: 函数原型:int printf("格式控制串"&#xff0c;输出表); 返回值&#xff1a;成功则返回输出的字节数&#xff08;按终端统计&#xff09; 格式控制符: %d ---- 有符号的十进制整型数 %u ---- 无符号的十进制整型数 %hd --- short …

C语言之printf输出各种格式

基础的东西总是很容易忘&#xff0c;要经常回顾&#xff1a; printf函数调用的一般形式为&#xff1a; printf(“格式控制字符串”, 输出表列) 其中格式控制字符串用于指定输出格式。格式控制串可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串&#xf…

C语言scanf怎么输入字母,C语言scanf输入格式printf输出格式

1. 转化说明符 %a(%A)浮点数,十六进制数字和p-(P-)表示法(C99)%c个字符 %d个有符号十进制整数 %f浮点数(包括浮点数和doulbe)%e(%E)浮点指数输出[e-(E-)表示法]%g(%G)浮点数不显示无意义的零“ 0”“ %i有符号十进制整数(与%d相同)%u无符号十进制整数 %o八进制整…

matlab printf格式化输出,如何使用 printf 来格式化输出

当我开始学习 Unix 时,我很早就接触到了 echo 命令。同样,我最初的 Python 课程也涉及到了 print 函数。再想起学习 C++ 和 Java 时学到 cout 和 systemout。似乎每种语言都骄傲地宣称拥有一种方便的单行输出方法,并生怕这种方式要过时一样宣传它。 但是当我翻开中级教程的第…

printf输出格式

1.printf()简介 printf()是C语言标准库函数&#xff0c;用于将格式化后的字符串输出到标准输出。标准输出&#xff0c;即标准输出文件&#xff0c;对应终端的屏幕。printf()申明于头文件stdio.h。 函数原型&#xff1a; int printf ( const char * format, ... );1 返回值&…

【Python笔记】SciPy的统计模块:scipy.stats

【Python笔记】NumPy数组 【DA】数据可视化matplotlib 【Python笔记】pandas常用函数图码总结 SciPy的统计模块是scipy.stats&#xff0c;其中有一个类是连续分布的实现&#xff0c;一个类是离散分布的实现。此外&#xff0c;该模块中还有很多用于统计检验的函数。 # 导入包 f…

使用scipy.signal函数进行信号滤波

目录 1、scipy.signal.filtfilt()函数介绍2、滤波器构造函数(巴特沃斯滤波器)3、如何进行高通、低通、带通、带阻滤波 1、scipy.signal.filtfilt()函数介绍 在信号的滤波过程中&#xff0c;因为scipy.signal.filtfilt()函数可以方便快捷得实现常见的多种滤波功能&#xff0c;所…

SciPy简单应用

SciPy简单应用 SciPy是在NumPy的基础上增加了大量用于数学计算&#xff0c;科学计算以及工程计算的模块&#xff0c;包括线性代数&#xff0c;常微分方程求解&#xff0c;信号处理&#xff0c;图像处理于稀疏矩阵等。参考文档 目录 SciPy简单应用文件输入/输出&#xff1a;scip…

使用scipy来进行曲线拟合

导读 曲线拟合的应用在生活中随处可见&#xff0c;不知道大家是否还记得物理实验中的自由落体运动中下降高度与时间关系之间的探究&#xff0c;在初速度为0的情况下&#xff0c;我们想要探究下降高度与时间的关系。 我们当时采用的方法是通过设置不同的下降时间来记录下降的高…

SciPy 优化

章节 SciPy 介绍SciPy 安装SciPy 基础功能SciPy 特殊函数SciPy k均值聚类SciPy 常量SciPy fftpack(傅里叶变换)SciPy 积分SciPy 插值SciPy 输入输出SciPy 线性代数SciPy 图像处理SciPy 优化SciPy 信号处理SciPy 统计 优化是指在某些约束条件下&#xff0c;求解目标函数最优解的…

Python scipy拟合分布

scipy 拟合分布文档&#xff1a;https://docs.scipy.org/doc/scipy/reference/tutorial/stats.html#fitting-distributions 代码&#xff1a; import numpy as np from scipy import statsnumber np.random.normal(10, 5, 4000) # 生成均值为10&#xff0c;方差为5的正态分布…

scipy求极值代码

1.求解一元函数极值 1.1 导包&#xff1a; from scipy.optimize import fmin这个函数主要用于求某个点附近的极小值。相应的&#xff0c;如果要求某个点附近的最大值&#xff0c;可以使用↓ from scipy.optimize import fmax1.2 定义求导函数 def f(x):return x(x-1) #retu…

scipy.interpolate插值

python SciPy库依赖于NumPy&#xff0c;提供了便捷且快速的N维数组操作。 可以实现插值&#xff0c;积分&#xff0c;优化&#xff0c;图像处理&#xff0c;特殊函数等等操作。 参考官方文档&#xff1a; Interpolation (scipy.interpolate) — SciPy v1.7.1 Manualhttps:/…

Scipy系列目录

Python科学计算和数据分析库系列目录 Scipy简介 Scipy是基于Numpy的科学计算工具库&#xff0c;方便、易于使用、专为科学和工程设计&#xff0c;是一个用于数学、科学、工程领域的常用软件包。 Scipy提供了许多用户友好和高效的高阶方法&#xff0c;如插值&#xff0c;积分&…

scipy笔记:FFT

数学笔记&#xff1b;离散傅里叶变化 DFT_UQI-LIUWJ的博客-CSDN博客 数学笔记&#xff1a;FFT&#xff08;快速傅里叶变换&#xff09;_快速傅里叶变换矩阵_UQI-LIUWJ的博客-CSDN博客 【个人理解&#xff1a;FFT是DFT的一种优化&#xff0c;DFT需要N个谱域信号来表示N个时域信…