OpenCV 2.4.x中初始化MSER时给定的参数的确切含义是什么?

33

OpenCV参考手册(2.4.x)指出,初始化MSER的构造函数需要以下参数:

delta、min_area、max_area、max_variation、min_diversity、max_evolution、area_threshold、min_margin、edge_blur_size。

我正在处理灰度图像。 "Delta"、"max_variation"和"min_diversity"参数有什么用途?这些参数帮助控制MSER的哪个属性?

我已经努力找到确切的答案,但我只能在以下页面上找到一些信息(其中没有特别有用的信息告诉我这3个参数控制了什么):

1. OpenCV wiki

2. MSER维基百科页面

3. MSER的StackOverflow问题页面

请帮帮我!

4个回答

53
我将假设您已经了解MSER特征检测的基础知识(如果没有,请参考Wikipedia,以下是简要回顾)。
您有两种类型的MSER区域,即正面和负面。
第一种类型,您可以通过使用所有强度(对于灰度图像为0255)进行阈值处理来获得。例如,对于阈值T = 100,所有强度< 100的像素都被分配为黑色前景,而所有强度>=100的像素则为白色背景
现在,想象一下您正在观察特定的像素p。在某个阈值T1处,它将开始属于前景,并保持这种状态直到T = 255。在T1处,像素将属于组件CC_T1(p)5个灰度级之后,它将属于组件CC_(T1+5)(p)

所有这些连接组件,都是通过各种阈值获得的MSER潜在候选项。(如果您反转我的黑/前景和白/背景阈值分配,则会获得其他类型的组件)。

参数有助于确定哪些潜在候选者确实是最大稳定的:

  • delta

    对于每个区域,测量变化

    V_T = (size(CC_T(p))-size(CC_{T-delta}(p)))/size(CC_{T-delta}(p))

    针对每个可能的阈值Ti。如果该像素的变化是变化的局部最小值,即V_T < V_{T-1}V_T < V_{T+1},则该区域是最大稳定的

    参数delta表示一个区域需要在多少个不同的灰度级别上保持稳定才能被认为是最大稳定的。对于较大的delta,你将获得更少的区域

    注意: 在介绍MSER区域的原始论文中,实际公式如下:

    V_T = (size(CC_{T+delta}(p))-size(CC_{T-delta}(p)))/size(CC_T(p))

    OpenCV实现使用了略有不同的公式来加快特征提取速度。

  • minArea, maxArea

    如果一个区域是最大稳定的,但它的像素少于minArea或多于maxArea,则仍然可以被拒绝。

  • maxVariation

    回到第1点(与delta相同的函数)的变化:如果一个区域是最大稳定的,但该区域的变化比maxVariation更大,则仍然可以被拒绝。

    也就是说,即使该区域比邻近区域更加“相对”稳定,但它可能仍然不够“绝对”稳定。对于较小的maxVariation,你将获得更少的区域

  • minDiversity

    此参数存在于修剪过于相似的区域(例如,只有几个像素不同)。

    对于一个最大稳定的区域CC_T1(p),找到一个“父最大稳定区域”CC_T2(p)。这意味着,T2 > T1CC_T2(p)是一个最大稳定区域,并且没有T2 > Tx > T1,使得CC_Tx(p)最大稳定。现在,比较父区域的大小差异:

    diversity = (size(CC_T2(p)) - size(CC_T1(p))) / size(CC_T1(p))

    如果这个diversity小于maxDiversity,则删除该区域CC_T1(p)。对于更大的多样性,你将获得更少的区域

    (对于此参数的确切公式,我必须查看程序代码)


1
@Flayn 我知道对你的评论做出这个回应已经很晚了,但总的来说,OpenCV在MSER实现方面存在一些问题(或者至少在几个版本之前存在一些问题,并且这些问题在几个版本中稳定存在)。它返回的区域甚至并不总是按定义最大稳定... - penelope
@penelope:你知道OpenCV3.0是否已经修复了MSER实现问题吗?VLFEAT的实现呢?或者你了解其他可靠的MSER实现方式(最好是C/C++)?非常感谢! - Dalpapa
@THClem 再次确认可能已经太晚了,但是...对于OpenCV3.0我没有什么想法,我没有检查过更新的代码(唯一的检查方法是测试它们的输出...)。VLFeat很好。我使用自己的实现,所以无法建议任何东西... - penelope
@penelope 非常感谢您提供这么详细的解释。对于那些想要非常仔细地跟进的人,我想指出一些我认为是一些小错误: (1)前景/背景的确定分别由< T>= T进行(而不是<= T> T) (2)方差计算取size(CC_T(p))-size(CC_{T-delta}(p))的_绝对值_ (3)最小方差要求与给定的相反,即应为:V_T < V{T-1}V_T < V{T+1} (4)在边缘情况T = 255下,只需要V_T < V{T-1} - Danny
@Danny 感谢你指出这个问题 :) 显然我每年会回到这个问题;我已经将你的更正(1)和(3)编辑到了问题中。当然,我同意边缘情况(4),但这是处理边缘情况的典型方式。至于(3),你会注意到 size(CC_T(p)) 对于任何 delta 都 始终 大于 size(CC_{T-delta}(p))(你总是从“较小”的 blob 向“较大”的 blob 前进),因此差异始终为正,绝对值不必要。 - penelope
显示剩余2条评论

12
  • Delta:delta指的是代码中比较的值,计算方法为(size_{i}-size_{i-delta)/size_{i-delta}。默认值为5。
  • MinArea:裁剪面积小于minArea的区域。默认值为60。
  • MaxArea:裁剪面积大于maxArea的区域。默认值为14400。
  • MaxVariation:裁剪与其子节点大小相似的区域。默认值为0.25。
  • MinDiversity:将多样性小于min_diversity的MSER去除,并返回。默认为0.2。
  • MaxEvolution:对于彩色图像,演化的步数。默认为200。
  • AreaThreshold:导致重新初始化的面积阈值。默认为1.01。
  • MinMargin:忽略太小的边缘。默认值为0.003。
  • EdgeBlurSize:用于边缘模糊的光圈大小。默认为5。
  • Mask:可选的输入掩膜,标记我们应该检测的特征区域。

谢谢!但是在delta的定义中,(size_{i}-size_{i-delta})/size_{i-delta}是什么意思?size_{i}代表什么?这对我来说是个大谜团。请帮忙解答! - Ekta
1
感谢您记录下这些默认值。在任何地方都很难找到它们。 - Libor

5
我在这个链接中找到了我的问题的答案:这里
通过从0到255变化强度阈值T,可以获得MSERs(最大稳定极值区域)。 Delta决定了该变化的最小量程。因此,size{i}表示灰度图像中具有强度值i的区域的大小或面积。
很快会回复MaxVariation和MinDiversity的解释。

5
该链接已失效。 - Mehdi

3

Matlab有一个几乎相同的函数MSER。在Mathworks中,您可以找到非常好地解释这些参数的含义。

我将复制您要求的2个输入定义(在Matlab中,没有针对彩色图像的选项):

  • _delta. 阈值级别之间的步长,指定为由“ThresholdDelta”和范围内(0,100]的数字值组成的逗号分隔对。此值表示选择极值区域时使用的输入数据类型范围的百分比。减小此值以返回更多的区域。典型值范围从0.8到4。

  • _max_variation. 在不同强度阈值下,极值区域之间的最大面积变化,指定为由“MaxAreaVariation”和正标量值组成的逗号分隔对。增加此值会返回更多的区域,但它们可能不太稳定。稳定区域在不同强度阈值下非常相似。典型值范围从0.1到1.0。

然而,正如penelope所说,原始论文对于更深入地了解整个过程非常有用。此外,我提供这个参考,其中包含一个非常有趣的比较已知特征检测器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接