我对通过能量驱动采样 (SEEDS) 提取的超像素感兴趣,这是一种使用超像素进行图像分割的方法。这也是 OpenCV 用来创建超像素的方法。我在查找 SEEDS 算法背后的文档时遇到了麻烦。OpenCV 给出了一个非常笼统的描述,可以在这里找到。
我正在寻找有关 SEEDS 功能的更深入描述(一般演练或数学解释)。任何有关该算法的链接或想法将不胜感激!我似乎找不到任何好的材料。谢谢!
我对通过能量驱动采样 (SEEDS) 提取的超像素感兴趣,这是一种使用超像素进行图像分割的方法。这也是 OpenCV 用来创建超像素的方法。我在查找 SEEDS 算法背后的文档时遇到了麻烦。OpenCV 给出了一个非常笼统的描述,可以在这里找到。
我正在寻找有关 SEEDS 功能的更深入描述(一般演练或数学解释)。任何有关该算法的链接或想法将不胜感激!我似乎找不到任何好的材料。谢谢!
我将首先浏览一些通用的链接和资源,然后尝试描述算法的总体思路。
种子实现:
您显然已经在这里看到了文档。OpenCV 的 SEEDS 实现的使用示例可以在这里找到:Itseez/opencv_contrib/modules/ximgproc/samples/seeds.cpp,并允许实时调整超像素的数量、级别的数量和其他参数 - 所以在阅读了SEEDS 背后的想法你一定要试试这个例子。原始实现以及修改后的实现(我的学士论文的一部分)可以在 GitHub 上找到:davidstutz/superpixels-revisited/lib_seeds和davidstutz/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).
超像素的数量由层级的块决定L
,即用w_L
和h_L
表示层级的块的宽度和高度,超像素L
的数量为
S = W/w_L * H/h_L
我们使用整数除法。
初始超像素分割现在通过在相邻超像素之间交换像素块和单个像素来迭代细化。为此,计算超像素和所有块的颜色直方图(直方图由实现中的 bin 参数数量决定)。这可以通过看到超像素的直方图只是2 x 2
它所组成的块的直方图的总和来有效地完成,并且这些块之一的直方图是2 x 2
基础块的直方图的总和(等等) . 所以让h_i
是属于 superpixel 的像素块的直方图j
,以及h_j
这个超像素的直方图。然后,块j
与超像素的相似度j
由 和 的直方图交集计算h_i
(h_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
在实践中,块更新和像素更新的迭代次数不止一次(这是迭代次数参数),并且通常每级完成两倍的迭代次数(这是双步参数)。在原始分割中,超像素的数量由w
、h
和L
图像大小计算得出。在 OpenCV 中,使用上述等式,w
并h
根据所需的超像素数和级别数(由相应的参数确定)计算得出。
一个参数仍不清楚:先前尝试强制执行平滑边界。在实践中,这是通过考虑3 x 3
将要更新的像素周围的邻域来完成的。如果该邻域中的大部分像素属于超j
像素,则待更新的像素也更有可能属于超像素j
(反之亦然)。OpenCV 的实现以及我的实现(SEEDS 修订版)允许在 OpenCV 的情况下考虑更大的k x k
社区k in {0,...,5}
。