请注意,本文编写于 84 天前,最后修改于 84 天前,其中某些信息可能已经过时。
Matas提出的MSER方法的步骤
-
将原始图像处理为灰度图,获得灰度图矩阵与灰度集合 I
-
设灰度图像中所有的像素构成的有序序列为 L,对 L 按照像素的灰度值进行非降序排序。初始化并查集集合 T=∅
-
令 Active(p)←false,∀p∈L,遍历序列 L。设当前像素为 p,像素 p 的灰度阈值为 i←G(p)
-
初始化像素 p,标记 Active(p)←true,为像素 p 创建:
- 并查集 Uj :Component(p)←Uj,Parent(Uj)←Uj,Size(Uj)←1
- 历史记录 :Birth(Uj)←i,Death(Uj)←∅,History(Uj)←∅
将 Uj 加入到 T 中
-
遍历像素 p 四邻域中存在于图像中的像素,设当前像素为 q,跳过所有 Active(q)=true 的轮次
-
检查像素所在并查集的根节点 rp=Find(Uj),p∈Uj 是否等于 rq=Find(Uk),q∈Uk。若是,则跳过像素 q;若否,则合并像素 p 和像素 q 所在的并查集,分别为 Urp 和 Urq
合并规则为:比较 Size(Urp) 与 Size(Urq)。
-
Size(Urp)>Size(Urq):
将 Urq 并入 Urp,标记 Death(Urq)←i,Parent(Urq)←Urp,更新 Urp 的 Size(Urp)←Size(Urp)+Size(Urq)。
此处不要更新 History(Urp),等待该灰度阈值下的所有像素均处理完成后再统一更新
-
Size(Urp)=Size(Urq):
可根据自定义规则决定集合的并入,如可根据 Birth(Urq) 与 Birth(Urp) 的大小决定
-
Size(Urp)<Size(Urq):
将 Urp 并入 Urq,步骤与 Size(Urp)>Size(Urq) 时对称
-
完成像素 p 的邻域像素的遍历。在序列 L 中,若存在下一像素且下一像素的灰度值与像素 p 的一致,则继续处理下一个像素。
-
在序列 L 中,若当前元素为队列末尾元素或下一像素与当前像素的灰度值不一致,则遍历 T 中存活的并查集,设当前并查集为 Uj,Find(Uj)=Uj∧Death(Uj)=∅,更新 History(Uj)[i]←Size(Uj)
-
遍历 T 中历史记录不为空的并查集,设当前并查集为 Uj
-
遍历并查集 Uj 的 History(Uj),设 History(Uj) 中记录的灰度值集合为 Ij,当前灰度为 i∈Ij ,变化率计算的灰度阈值偏移量为 Δ,窗口长度为 2Δ,计算窗口的左边界灰度默认值为 il=i−Δ,计算窗口的右边界灰度默认值为 ir=i+Δ,区域面积的相对变化率计算公式为:
q(Uj,i)=AiAi+Δ−Ai−Δ,Ak=History(Uj)[k],k∈{i−Δ,i,i+Δ}
若 左边界满足 i−Δ<Birth(Uj) 或右边界满足 Death(Uj)=∅∧i+Δ≥Death(Uj),说明计算的区域面积的相对变化率使用的历史变化区间超过了区域本身的生命周期,应当直接跳过计算,对于其他情况可如下继续计算。
若 i−Δ∈/Ij,则在灰度集合Ij 中寻找最大的灰度 ilreplace 满足
ilreplace=max{k∈Ij∣k≤i−Δ}
以等效代替 i−Δ ,令 il=ilreplace。
若 i+Δ∈/Ij,则在灰度集合 Ij 中寻找最大的灰度 irreplace 满足
irreplace=max{k∈Ij∣k≤i+Δ}
以等效代替 i+Δ ,令 ir=irreplace
每个区域都是随阈值灰度的增长而单向增长的,当某一灰度不存在于灰度值集合 Ij 中时,该区域在此灰度阈值下没有发生面积变化,因此该区域的面积与较低的灰度阈值时的面积相等。所以, i−Δ∈/Ij 、i+Δ∈/Ij 时,对应使用较小的满足条件的灰度时的历史记录作为代替。
若 il∈/Ij∨ir∈/Ij ,跳过当前灰度阈值;否则,按如下公式计算区域面积相对变化率:
q(Uj,i)=History(Uj)[i]History(Uj)[ir]−History(Uj)[il]
- 遍历完成 History(Uj) 中的区域面积相对变化率计算后,设得到的区域面积相对变化率队列为 Q,Q 中的元素 q(Uj,i) 按照 i 的大小排列。遍历 Q,设当前的区域面积相对变化率为 qk,取 Q 中所有满足 qk<qk−1 且 qk<qk+1 的元素,那么 (Uj,ik,qk) 为一个MSER,将其放入MSER集合M+ 中。
- 获取原始图像灰度图的反相灰度图 G−(p)=Gmax−G(p),对于反相图有 i−=Gmax−i,其中 i− 为正相图中灰度阈值 i 在反相图中的对称灰度阈值,Gmax 为灰度图像所在灰度值域中灰度的最大值。重复步骤2到步骤11,最终得到MSER集合 M−
- 最终,最大稳定极值区域集合 M=M+∪M− 为所求
如何获得每个MSER包含的像素
- 遍历MSER集合 M+,设当前的MSER为 Mj=(U,i,q),MSER对应区域的像素集合为 S=∅。
- 获取 U 的根节点对应的像素 p,从 p 开始做洪水填充(Flood-Fill),洪水填充的灰度阈值为 i,即从 p 开始使用DFS或BFS遍历四邻域的属于 U 的像素,设遍历的当前像素为 q, 则将所有满足 iq≤i 的加入 S。
- 在MSER集合 M− 中执行对称操作,寻找满足 iq≥i 的像素加入像素集合 S
本文作者:Idoyt
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA
许可协议。转载请注明出处!