基于图的图像分割(Graph-Based Image Segmentation)

 

1、介绍html

基于图的图像分割(Graph-Based Image Segmentation),论文《Efficient Graph-Based Image Segmentation》,P. Felzenszwalb, D. Huttenlocher,International Journal of Computer Vision, Vol. 59, No. 2, September 2004算法

论文下载和论文提供的C++代码在这里post

Graph-Based Segmentation是经典的图像分割算法,其做者Felzenszwalb也是提出DPM(Deformable Parts Model)算法的大牛。网站

Graph-Based Segmentation算法是基于图的贪心聚类算法,实现简单,速度比较快,精度也还行。不过,目前直接用它作分割的应该比较少,不少算法用它做垫脚石,好比Object Propose的开山之做《Segmentation as Selective Search for Object Recognition》就用它来产生过度割(over segmentation)。spa

2、图的基本概念命令行

由于该算法是将图像用加权图抽象化表示,因此补充图的一些基本概念。3d

一、图code

是由顶点集V(vertices)和边集E(edges)组成,表示为G=(V, E),顶点v∈V,在论文即为单个的像素点,链接一对顶点的边(vi, vj)具备权重w(vi, vj),本文中的意义为顶点之间的不类似度(dissimilarity),所用的是无向图。component

二、树orm

特殊的图,图中任意两个顶点,都有路径相链接,可是没有回路。以下图中加粗的边所链接而成的图。若是当作一团乱连的珠子,只保留树中的珠子和连线,那么随便选个珠子,都能把这棵树中全部的珠子都提起来。

若是顶点i和h这条边也保留下来,那么顶点h,i,c,f,g就构成了一个回路。

三、最小生成树(minimum spanning tree)

特殊的树,给定须要链接的顶点,选择边权之和最小的树。

论文中,初始化时每个像素点都是一个顶点,而后逐渐合并获得一个区域,确切地说是链接这个区域中的像素点的一个MST。以下图,棕色圆圈为顶点,线段为边,合并棕色顶点所生成的MST,对应的就是一个分割区域。分割后的结果其实就是森林。

 

3、类似性

既然是聚类算法,那应该依据何种规则断定什么时候该合二为一,什么时候该继续划清界限呢?对于孤立的两个像素点,所不一样的是灰度值,天然就用灰度的距离来衡量两点的类似性,本文中是使用RGB的距离,即

固然也能够用perceptually uniform的Luv或者Lab色彩空间,对于灰度图像就只能使用亮度值了,此外,还能够先使用纹理特征滤波,再计算距离,好比先作Census Transform再计算Hamming distance距离。

4、全局阈值 >> 自适应阈值,区域的类内差别、类间差别

上面提到应该用亮度值之差来衡量两个像素点之间的差别性。对于两个区域(子图)或者一个区域和一个像素点的类似性,最简单的方法即只考虑链接两者的边的不类似度。以下图,已经造成了棕色和绿色两个区域,如今经过紫色边来判断这两个区域是否合并。那么咱们就能够设定一个阈值,当两个像素之间的差别(即不类似度)小于该值时,合二为一。迭代合并,最终就会合并成一个个区域,效果相似于区域生长:星星之火,能够燎原。

举例说明:

对于上右图,显然应该聚成上左图所示的3类:高频区h,斜坡区s,平坦区p。

若是咱们设置一个全局阈值,那么若是h区要合并成一块的话,那么该阈值要选很大,可是那样就会把p和s区域也包含进来,分割结果太粗。若是以p为参考,那么阈值应该选特别小的值,那样的话p区是会合并成一块,可是h区就会合并成特别特别多的小块,如同一面支离破碎的镜子,分割结果太细。显然,全局阈值并不合适,那么天然就得用自适应阈值。对于p区该阈值要特别小,s区稍大,h区巨大。

先来两个定义,原文依据这两个附加信息来获得自适应阈值。

一个区域内的类内差别Int(C)

能够近似理解为一个区域内部最大的亮度差别值,定义是MST中不类似度最大的一条边。

俩个区域的类间差别Diff(C1, C2)

即链接两个区域全部边中,不类似度最小的边的不类似度,也就是两个区域最类似的地方的不类似度。

直观的判断,当:

时,两个区域应当合并!

5、算法步骤

一、计算每个像素点与其8邻域或4邻域的不类似度。

如上图,实线为只计算4领域,加上虚线就是计算8邻域,因为是无向图,按照从左到右,从上到下的顺序计算的话,只须要计算右图中灰色的线便可。

二、将边按照不类似度non-decreasing排列(从小到大)排序获得e1, e2, ..., en

三、选择ei

四、对当前选择的边ej(vi和vj不属于一个区域)进行合并判断。设其所链接的顶点为(vi, vj)

if 不类似度小于两者内部不类似度:

五、更新阈值以及类标号

else:

六、若是i < n,则按照排好的顺序,选择下一条边转到Step 4,不然结束。

 

6、论文提供的代码

打开本博文最开始的链接,进入论文网站,下载C++代码。下载后,make编译程序。命令行运行格式:

 

 
/********************************************
 
sigma 对原图像进行高斯滤波去噪
 
k 控制合并后的区域的数量
 
min: 后处理参数,分割后会有不少小区域,当区域像素点的个数小于min时,选择与其差别最小的区域合并
 
input 输入图像(PPM格式)
 
output 输出图像(PPM格式)
 
 
 
sigma: Used to smooth the input image before segmenting it.
 
k: Value for the threshold function.
 
min: Minimum component size enforced by post-processing.
 
input: Input image.
 
output:Output image.
 
 
 
Typical parameters are sigma = 0.5, k = 500, min = 20.
 
Larger values for k result in larger components in the result.
 
*/
 
./segment sigma k min input output

  


7、OpenCV3.3 cv::ximgproc::segmentation::GraphSegmentation类

 

 

/opencv_contrib/modules/ximgproc/include/opencv2/ximgproc/segmentation.hpp
相关文章
相关标签/搜索