超像素分割与超像素合并/区域合并/多尺度分割

     最近两年,超像素分割方法非常火爆,计算机视觉、模式识别许多方向都兴起了超像素研究的热潮,提出的方法也比较多。其实这不是个什么新鲜的东西,以前的许多分割算法所获得的结果都可以称为超像素,如Watershed,meanshift,graph-based segmentation,只不过后来兴起一种加入形状约束,使得到的区域如同细胞一般比较紧凑。个人觉得这对某些应用还是有一些好处的,比如这些小区域排列规整,可以把以前基于像素的方法改造改造加以应用,统计特征比较好保持等。

    鉴于最近总有一些朋友在问超像素合并怎么弄?原因其实很简单,超像素分割的代码很多都已经被公开了,没有技术含量,应用又做不来,找个相对容易入手点儿的。总结一下目前常用的超像素分割方法,以及基本的区域合并方法,希望对感兴趣的朋友们有用。

1、超像素分割方法

      常见的超像素分割方法:TurboPixel,SLIC,NCut,Graph-based,Watershed(Marker-based Watershed),Meanshift等等, 这里列举几种我常用的方法及其效果

超像素分割与超像素合并/区域合并/多尺度分割_第1张图片

需要指出的是,其实分水岭方法效果非常好的,在TurboPixel那个文章中实现的分水岭方法绝对有问题。真实的效果绝对不是那个样子。


      算法的效率:这个是本人比较关心的问题,因为是个急性子,等不得程序跑半天出不来结果。这也是为什么上面只列举了4种方法(其实还有些效果非常好的方法,只是自己想的,没有参考文献),因为有些方法效率太低,比如TurboPixel,NCut什么的,等得让我难受死。整体而言,在效率方面,以上四种方法都非常好,处理481*321的图像只需要0.15 s左右(笔记本i7 4500U, 2.1Ghz),对较大的影像效率也非常好。 经典的Turbopixel, NCut什么的在效率上被甩了N条街了....

      个人建议:如果非常看重紧凑度,选择NCut和SLIC;非常看重效率,SLIC和Watershed;非常看重边缘精确度和后期区域合并效果:Marker-based Watershed 和 Meanshift。 如果你仅仅是止步于超像素层次,就开始应用了,那么选择SLIC吧,速度,紧凑度都非常好;如果要做后面的区域合并,SLIC不一定拼得过后面三种方法。


2、区域合并方法


        区域合并基本方法:区域合并是实现比较精细的分割重要方法,常采用的方法可以是层次区域合并(Hierarchical Stepwise Region Merging),也可以是简单的剔除小区域(EDISON源码里面的Prune函数)。层次区域合并虽已提出多年,但仍然是顶尖的方法(K. Harris, 1998, IEEE TIP, Hybrid image segmentation using watershed and fast region merging),这个文章里面提及了区域邻接图(Region Adjacent Graph, RAG)和最近邻域图(Nearest Neighbor Graph,NNG)的概念,非常清晰明了。虽然后来有些人对RAG和NNG翻译了一下,在中文期刊上发表了不少文章,其实都是简单的实现了一遍,翻译了一下。在我看来没有啥创新,不过大家可以搜搜看,作为学习的参考。对这些方法的改进提了一些,但是有些是站不住脚的,仅仅是因为编程水平有限,没有把别人的方法实现好,以此却说别人的方法效率低。具体我就不点出来了。


RAG和NNG记录区域合并一个简单的示例


超像素分割与超像素合并/区域合并/多尺度分割_第2张图片


区域合并的代价:最早,区域合并是问题的数学解释其实是分片的影像拟合(Jean-Marie Beaulieu,1989, IEEE TPAMI, Hierarchy in Picture Segmentation: A Stepwise Optimization Approach ),每次的区域合并都会带来整个拟合误差的增加,这个增加量称之为合并代价,在图2中表现为,图的每条边都是有权重的,这个权重就表示这两个区域合并对整个图像拟合误差带来的增加量,具体的推导参见原文吧。

                                                                   超像素分割与超像素合并/区域合并/多尺度分割_第3张图片                  

其中N表示面积,μ表示区域的光谱平均值,这个合并代价后来又衍生出了很多版本,这个是大家关注的重点。比如把(μi-μj)2换成光谱直方图距离的,加入形状约束的,加入纹理约束的等等。这个选择取决于你处理的图像是啥,比如对于SAR图像,可能得更多的考虑统计特性,对于高光谱的遥感影像,得考虑光谱曲线相似性等。因为个人是研究遥感图像处理的,对于普通的遥感图像,自然影像,推荐Multi-resolution, object-oriented fuzzy analysis of remote sensing data for GIS-ready information这篇文章中的准则,主要是其适应性比较好,比较稳定。(顺便打个小广告:A Spatially-Constrained Color-Texture Model for Hierarchial VHR Image Segmentation,其实效果也很好,不过稍慢一些,毕竟模型复杂很多)。以下是两者准则下的效果:


超像素分割与超像素合并/区域合并/多尺度分割_第4张图片

通过对比就可发现了,其实SLIC对于区域合并而言,效果一般。其实在当前流行的超像素分割中,SLIC已经算好的了,其他的方法效果相比真是没法看了....

算法效率:如果按照原版的RAG和NNG实现,速度非常快的,关键看你技术水平怎么样了,具体实现非常麻烦,我用到了RBTree这样的结构,如果有用C++编程实现该功能的看官,可以考虑下什么地方可以用这个优化下。在我实现的版本里,对于481*321的图,采用以上超像素分割方法和推荐的合并准则,对于约700个初始区域,包括读取影像,区域合并,保存结果,花费0.236s,1200个初始区域 0.26s,更极端的,154401个初始区域(1个像素1个区域),花费2.1s,用我那个相比复杂一点的准则,时间略多一些,大概是前一组实验的2.5倍时间。 2.1s合并掉15W个区域,速度其实已经满足绝大多数的计算机视觉和模式识别中的图像处理需求了,如果进行并行可以实现近乎实时了。


3、区域合并的终止/尺度选择


何时终止区域合并的过程?这是研究的热点之一。常用的方法是设定一个阈值,当合并的代价值超过给定的阈值时,合并终止。然而一个重要的问题是,这个值常常需要手动设置。这无法实现对不同影像的精确分割。

在遥感图像处理领域,可以称之为尺度选择,有一些自动尺度选择的方法,大家可以搜索一下 “分割 最优尺度选择”,如:ISPRS Journal上发表的Unsupervised image segmentation evaluation and refinement using a multi-scale approach这都是采用了全局同质性和异质性来度量分割质量的方法,文章虽然是发表了,但经过我的测试该方法也仅仅只能在特定的软件(eCognition)和算法环境下可用,且对于许多影像,效果不行。当用这个策略来确定区域合并停止阈值时,很多时候会失败。是失败,而不是效果不好。因为在某些情况下按照这个准则,区域合并一开始就应该停止。 (许多中文文章跟这个是换汤不换药)。 还有IJGIS上的一篇文章 ESP: a tool to estimate scale parameter for multiresolution image segmentation of remotely sensed data,虽然引用比较多,但是最终还是有人敢于说实话(在这篇文章中:Semiautomatic Object-Oriented Landslide Recognition Scheme From Multisensor Optical Imagery and DEM Jiann-Yeou Rau, Jyun-Ping Jhan, and Ruey-Juin Rau),这玩意儿纯属扯淡!IJGIS这么牛叉的期刊怎么登了这么一篇水文?


言归正传,这块儿,个人仅限于对遥感图像处理领域有些了解,可能在计算机视觉和模式识别中的很多方法不知道。在此,仅推荐一个比较简单,但是有效的方法。借助于ISPRS Journal那篇文章的方法,你可以计算初始分割和每次合并之后的 Global Homogeneity,依次合并得到一个序列,直到所有的可能的合并进行到底(只剩下一个1个区域了),这时候你就可以得到一条Global Homogeneity演化的曲线,大概如下(红线),那么把最低点和最高点连成直线,计算所有点到这条直线的距离,距离最大的点就是区域合并该停止的点。 这个只能保证你得到一个比较好的结果,但是对于很多计算机视觉的应用,大概已经足够了。至于更好的方法,暂时还不太适合公开...

超像素分割与超像素合并/区域合并/多尺度分割_第5张图片

什么?都合并完了才来找该在哪儿停止? 是的,有时候往往就是这样曲折。但是你也不必重新执行一遍区域合并的,只需要把之前的区域合并顺序重新遍历一遍,找到停止点,把结果反算出来就OK了。



4、更多的思考

     (a) 你研究超像素干嘛的?不要一味追求当前的所谓超像素....

     (b) 你确定你真的是改进了当前的方法?还是仅仅没有阅读足够的资料,说不定别人已经做过了,或者你编程实现能力太弱了....

     (c) 路在何方? 这个领域可以研究的还是比较多的,区域合并准则、停止条件(尺度选择)、多尺度层次关系组织、应用等都还有许多进步的空间。对于遥感影像,还需要解决超大影像并行快速处理,比如给你一个20W*20W像素大小的图像,可能一幅图像就有100G,你怎么办?

     (d) 超像素的合并方法提供了丰富的层次结构信息,你用上了么?

     (e) 这些东西咋用啊? 遥感图像分类、目标识别、场景分类、显著性检测、目标提取等等等等等...具体咋样看情况..

     (f) 文献推荐: Scale-Sets image Analysis, IJCV,2006,个人认为可能会是该领域后续许多问题的指导思想之一。


有关超像素的代码,请参考:http://blog.csdn.net/anshan1984/article/details/8918167


学术交流QQ群: 217312431



你可能感兴趣的:(图像分割)