请注意,本文编写于 83 天前,最后修改于 83 天前,其中某些信息可能已经过时。
目录
本方法提出的原因
本方法的步骤
如何获取指定MSER包含的像素
本方法提出的原因
在Matas提出的标准MSER获取过程中,虽然很好的计算了MSER区域有哪些,但由于MSER的结构为 (Uj,ik,qk),即只保留了MSER的包含的像素的并查集、产生时的灰度阈值、区域面积相对变化率,无法方便的获取MSER包含的像素有哪些,需要额外的洪水填充(Flood-Fill)方法还原。
在 MSER 检测过程中,这些像素及其四邻域连通关系已经在连通分量的构建与合并过程中被处理过;而为了恢复 MSER 的完整像素集合,Flood Fill 需要再次遍历这些像素并重新判断邻域连通性,从而产生可以避免的额外计算开销。
因此,Erik Murphy-Chutorian和Mohan Trivedi提出了基于NDS森林的MSER(N-tree Disjoint-Set Forests MSER)。
本方法的步骤
步骤以《【MSER】初始MSER》为基础进行扩展,以下简称为《初始》
-
按照《初始》中的步骤1到步骤3,开始遍历像素的有序序列 L
-
在初始化像素 p 时,额外为像素 p 创建节点 NodeNDS:Index←iNeighbor[1:4]←∅
初始化像素 p,标记 Active(p)←true,为像素 p 创建:
- 并查集 Uj :Component(p)←Uj,Parent(Uj)←Uj,Size(Uj)←1
- 历史记录 :Birth(Uj)←i,Death(Uj)←∅,History(Uj)←∅
将 Uj 加入到 T 中
-
按照《初始》中的步骤5,遍历像素 p 的四邻域
-
完成 Urp 和 Urq 的合并后,为像素 p 和像素 q 的节点 NodeNDS(p) 和 NodeNDS(q) 的 Neighbor 中分别压入
检查像素所在并查集的根节点 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) 时对称
-
按照《初始》中的步骤7到步骤13进行,但在对反相图进行计算的时候,需要额外建立一个NDS森林
如何获取指定MSER包含的像素
-
假设指定的MSER为 (U,i,q),找到并查集 U 的根 在NDS森林中对应的N树
-
从MSER中的任意节点开始遍历这颗N树,通常可通过并查集 U 的根对应的节点开始,找到所有与起始节点连通的且 index 不大于 i 的节点。若某个节点的 indexp>i ,则无须继续遍历该分支。
注意,此操作为删除N树中所有 index>i 的节点,这可能会导致N树分裂为多个子树。在视觉效果上,这意味着MSER代表的区域较浅的像素消失,分裂为多个小区域
-
步骤2中找到的点的集合即此MSER包含的所有像素
本文作者:Idoyt
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA
许可协议。转载请注明出处!