Edge Detection and Image SegmentatiON (EDISON) System 一、概述 MeanShift并不算一种很新的特征空间分析算法,但是它原理简单,计算速度较快,通常能在一次分割后形成大量小的模态区域。这样便直接将问题分析层次从像素域提升到特征域,对后续处理有很大的好处。CVPR07不少新颖的分析算法(比如多目标分割)都是以mean shift为基础的。因此,它仍然有很大的研究价值。 Rutgers的RIUL实验室将mean shift和synergistic分割算法以C++实现,并将派生的边缘检测方法集成到EDISON分析平台中,以自由软件的形式发放。本日志不讨论meanshift原理和性能,而是分析EDISON控制台程序中mean shift分割算法的实现过程和技巧。 EDISON控制台程序模块: 2. 算法控制平台(edison.h/edison.cpp) 3. mean shift算法(ms.h/ms.cpp/msImageProcessor.cpp) 分割过程: 2.指定meanshift参数: 3.流程: 二、迭代核 设图像数据长度为L,通道数为3(LUV格式存储),数据指针为data,空间窗为sigmaS,特征空间窗为sigmaR。以无加速(NO_SPEEDUP)设置下的NewNonOptimizedFilter()说明edsion迭代原理。 非参数核方法的关键为窗的选取以及窗内点选取的代码实现。如果采用常规方法,那么需要首先提取当前点迭代P所在窗以及其邻接四个窗内的所有点,然后比较每个点和P的特征分量距离是否在特征空间窗内。这个过程中的比较次数为O(L*I*sigmaS*sigmaS),I为每个数据点的平均迭代次数,和图像特征有关。同时,迭代过程需要频繁进行数据指针移动和边界检查,很容易造成计算错误。 edison采用了一种3维桶缓存(3d buckets[x,y,L])来替换搜索,其过程如下: slist[i] = buckets[cBuck]; idxs += lN; NONE,MEDIUM,HIGH的区别 (2) HIGH_SPEEDUP模式 迭代结束后,数据存储于LUV_data数组中。edison调用Connect()函数对各个像素进行模式标注,同时完成对各个模式的计数。Connect()将调用Fill()通过简单的非递归泛洪完成标注。 三、区域合并 区域合并包括相似的邻接区域合并和小区域剔除两个过程。它们的算法核心内容均是对区域邻接矩阵进行传递闭包迭代运算。因此,这里仅分析邻接区域合并。 1. 区域邻接矩阵(Region Adjacency Matrix, RAM)建立,函数为BuildRAM() 2.传递闭包迭代 neighCanEl = neighbor->label; if(iCanEl < neighCanEl) b.标识最小化 c.区域重新计数,并重新计算模式 至此便基本完成了对图像的分割运算,我们可以通过后续处理进行模式间的边界标注。 四、边界标注 GetBoundaries()函数可以获取图像边界,它将调用DefineBoundaries()定义边界。边界点将存储在boundaryMap数组中: 设labels为记录每个点所在区域标识的数组,则边界点按如下方式定义: boundaryMap含有大量无用数据,下一步将用更紧凑的数据结构存储边界: DefineBoundaries()返回的区域链表regionList在最后生成,它将调用RegionList::AddRegion()函数。AddRegion的3个形参的含义分别为: 有了boundaryBuffer和boundaryCount之后,边界的标注就简单了: |
Mean Shift
最新推荐文章于 2022-02-18 18:12:47 发布
Mean Shift
2010-10-11 17:34