- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
MSER最稳定极值区域源码分析
MSER最稳定极值区域源码分析
最稳定极值区域介绍
如把灰度图看成高低起伏的地形图,其中灰度值看成海平面高度的话,MSER的作用就是在灰度图中找到符合条件的坑洼。条件为坑的最小高度,坑的大小,坑的倾斜程度,坑中如果已有小坑时大坑与小坑的变化率。
上图展示了几种不同的坑洼,根据最小高度,大小,倾斜程度这些条件的不同,选择的坑也就不同。
?上图展示了最后一个条件,大坑套小坑的情况。根据条件的不同,选择也不同。
?以上便是对坑的举例,MSER主要流程就三部分组成:
1.预处理数据
2.遍历灰度图
3.判断一个区域(坑洼)是否满足条件
简单来说,就如将水注入这个地形中。水遇到低处就往低处流,如果没有低处了,水位就会一点点增长,直至淹没整个地形。在之前预处理下数据,在水位提高时判断下是否满足条件。
?先说下流程中的主要部件,如下:
1.img,由原8位单通道灰度图转化的更容易遍历和记录数据的32位单通道图。预处理内容为:
32位值记录从这点是否探索过,探索过的方向,灰度值;图大小也扩大了,最外添加了一个像素的完整一圈,值为-1可看作墙,宽度也改变为2的整数次方,用于加快运算。
如果由掩码图,如下:
2.heap,记录坑洼边界的堆栈,每个灰度值都有自己的堆栈。预处理内容为:
计算所有灰度值的个数,这样提前就可以分配堆栈大小。例如知道了灰度2的像素由4个,就可以将灰度2的堆栈大小分配为5(多一个位标志位空)。
3.comp,记录水坑数据的堆栈,有水位值(灰度值),面积(像素个数和像素位置)等。预处理内容为:
仅仅是分配内存,分配257个(0-255外多一个用作结束)
4.history,记录水位抬高的历史,就是一个小坑抬高水位后一点点变成大坑的历史。预处理内容为:
仅仅是分配内存,大小为像素点个数(就是宽*高)。可以想成所有点都不同都可以形成历史的最大个数。
在重复下整个简单的过程:就如将水注入这个地形中。水遇到低处就往低处流,如果没有低处了,水位就会一点点增长,直至淹没整个地形。先说下主要部件:
1.img,由原8位单通道灰度图转化的更容易遍历和记录数据的32位单通道图。遍历时:
当前像素位置中有3位记录方向(除了东南西北还有一个用来代表结束),逐个改变方向遍历。还有最高1位记录是否发现过了。根据方向遍历相邻像素,如果4个方向都探索过了,就从heap边界中找到一个最小灰度的边界,出栈来用作当前像素。最终将所有像素的4个方向都走完,也是所有像素都被发现了,遍历就结束。
2.heap,记录坑洼边界的堆栈,每个灰度值都有自己的堆栈。遍历时:
当水遇到低处时入栈当前位置为低处的边界,当水遇到相等高度或高处时入栈那个边界;当抬高水位时出栈被抬高到的边界。
3.comp,记录水坑数据的堆栈,有水位值(灰度值),面积(像素个数和像素位置)等。遍历时:
当水位下降时新入栈,水位提高时出栈并可能与之前的合并。
4.history,记录水位抬高的历史,就是一个小坑抬高水位后一点点变成大坑的历史。遍历时:
history主要是记录用来判断最大稳定极值区域的数据,没有遍历的作用。主要记录时刻有两种:提高水位到边界heap中的最小高度,提高水位到comp中上一项的高度。要记录灰度值,像素数,快捷指针,孩子指针,稳定时的像素数。
下面举例子,走下遍历的流程(并不是依次就是一步,一些步骤合并了)(红色为有变动位置,时间匆忙没有仔细校准每个位置):
?
中上,要遍历的灰度图。为了方便观看,上文提到周围一圈的-1被去掉了。
左下,history是抬高水位的历史。
中下,comp是水位数据。预先入栈一个256的灰度作为顶,用来抬高水位时判断边界值小还是上一个水位数据的灰度值小。
右下,heap是边界堆栈,heap_start是每个灰度指向heap堆栈的指针。特殊说明下,heap是一个个堆栈连接在一起的一个数组,由于上面说的预处理过了,已经知道每个灰度的像素个数,所以提前指定了heap_start中每个灰度指向heap中的位置,指向0代表所在堆栈没有数据。例如灰度2有4个像素,所以灰度3的指针从灰度2指针后5个后开始,4个是像素数,1个是代表空的0。
从A1位置开始,comp中入栈个灰度2的数据项,并将heap_cur当前指针设置为2灰度的指针。
探索A1右边B1,标识为已发现。B1的值2没有小于当前水位值2,作为边界入栈。
探索A1下面的A2。值1小于当前水位2,将2入栈边界栈,入栈水位数据1,调整边界指针heap_cur为指向1的指针,当前像素为A2。
探索A2右边B3与下边A3,都没有比当前水位1小,分别入栈所属灰度
文档评论(0)