通过能量驱动采样(SEEDS)提取的超像素

Nic*_*ick 1 opencv image-segmentation superpixels

我对通过能量驱动采样(SEEDS)提取的超像素感兴趣,这是一种使用超像素进行图像分割的方法.这也是OpenCV用于创建超像素的内容.我在查找SEEDS算法背后的文档时遇到了麻烦.OpenCV提供了一个非常一般的描述,可以在这里找到.

我正在寻找关于SEEDS功能的更深入的描述(无论是一般的演练还是数学解释).任何有关该算法的链接或想法将非常感谢!我似乎找不到任何好材料.谢谢!

Dav*_*utz 9

我将首先介绍一些常规链接和资源,然后尝试描述算法的一般概念.

SEEDS实施:

你显然已经在这里看到了文档.OpenCV的SEEDS实现的一个用法示例可以在这里找到:Itseez/opencv_contrib/modules/ximgproc/samples/seeds.cpp,并允许调整超像素的数量,级别的数量和其他参数的实时 - 所以在阅读之后SEEDS背后的想法你绝对应该尝试这个例子.最初的实现,以及修订的实现(我的学士论文的一部分),可以在GitHub上找到:davidstutz/superpixels-revisited/lib_seedsdavidstutz/seeds-revised.但是,这些实现应该具有可比性.

出版物和其他资源:

该论文发布于arxiv:arxiv.org/abs/1309.3848.我的网站上提供了更简短的描述(可能更容易理解):davidstutz.de/efficient-high-quality-superpixels-seeds-revised.提供的算法描述应该易于遵循,并且 - 在最好的情况下 - 允许实现SEEDS(参见本文的"算法"部分).在我的学士论文中也可以找到更精确的描述,特别是在3.1节中.

一般说明:

请注意,此描述基于上述文章和我的学士论文.两者都提供了数学上简洁的描述.

给定宽度W和高度的图像H,SEEDS首先将像素分组为大小的块w x h.这些块进一步排列成组2 x 2.对于L级别重复该方案(这是级别参数的数量).所以在级别上l,你有大小的块

w*2^(l - 1) x h*2^(l - 1).
Run Code Online (Sandbox Code Playgroud)

超级像素的数量由级别的块确定L,即,使用w_Lh_L表示块的宽度和高度L,超级像素的数量是

S = W/w_L * H/h_L
Run Code Online (Sandbox Code Playgroud)

我们在哪里使用整数除法.

初始超像素分割现在通过在相邻超像素之间交换像素块和单个像素来迭代地细化.为此,计算超像素和所有块的颜色直方图(直方图由实现中的区间数参数确定).这可以通过观察超像素的直方图只是2 x 2它所包含的块的直方图的总和来有效地完成,并且这些块之一的直方图是2 x 2底层块的直方图的总和(等等) .因此,h_i应该是属于超像素的像素块的直方图j,以及h_j该超像素的直方图.然后,将块的相似性j,以超像素j由直方图相交计算h_ih_j(见公式上述资源中的一个).类似地,像素和超像素的相似性是像素颜色与超像素平均颜色的欧几里德距离(这是性能更好的选项),或者像素的颜色属于超像素的概率(简单地归一化)以像素的颜色输入超像素的直方图.在此背景下,算法可归纳如下:

initialize block hierarchy and the initial superpixel segmentation
for l = L - 1 to 1 // go through all levels
    // for level l = L these are the initial superpixels
    for each block in level l
        initialize the color histogram of this block
        // as described this is done using the histograms of the level below
// now we start exchanging blocks between superpixels
for l = L - 1 to 1
    for each block at level l
        if the block lies at the border to a superpixel it does not belong to
            compute the histogram intersection with both superpixels
            assign the block to the superpixel with the highest intersection
// now we exchange individual pixels between superpixels
for all pixels
    if the pixel lies at the border to a superpixel it does not belong to
        compute the Euclidean distance of the pixel to both superpixel's mean color
        assign the pixel to the closest superpixel
Run Code Online (Sandbox Code Playgroud)

在实践中,块更新和像素更新被迭代多于1(这是迭代次数参数),并且通常每个级别的迭代次数是两次(这是双步参数).在原始分割中,超像素的数量由wh,L以及图像大小计算.在OpenCV中,使用上述等式,wh根据所需数量的超像素和级别数(由相应参数确定)计算.

一个参数仍然不清楚:先前尝试强制平滑边界.实际上,这是通过考虑3 x 3将要更新的像素周围的邻域来完成的.如果该邻域中的大多数像素属于超j像素,则要更新的像素也更可能属于超像素j(反之亦然).OpenCV中的实施以及我的实现(修订种子),允许考虑较大的社区k x kk in {0,...,5}OpenCV中的情况.