精华内容
下载资源
问答
  • 超像素合并分割

    2018-10-30 20:45:39
    超像素合并分割,只要运行文件夹下面的Demo_Matlab.m即可,亲测有效
  • 超像素区域合并

    2017-03-16 12:59:05
    本工具为超像素区域合并的学术版软件,免费使用。
  • 对图像进行区域分割,把图像分割成一个个区域,并进行区域合并
  •  最近两年,超像素分割方法非常火爆,计算机视觉、模式识别许多方向都兴起了超像素研究的热潮,提出的方法也比较多。其实这不是个什么新鲜的东西,以前的许多分割算法所获得的结果都可以称为超像素,如Watershed,...
     
    

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

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

    1、超像素分割方法

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


    需要指出的是,其实分水岭方法效果非常好的,在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记录区域合并一个简单的示例




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

                                                                                         

    其中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,其实效果也很好,不过稍慢一些,毕竟模型复杂很多)。以下是两者准则下的效果:


    通过对比就可发现了,其实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演化的曲线,大概如下(红线),那么把最低点和最高点连成直线,计算所有点到这条直线的距离,距离最大的点就是区域合并该停止的点。 这个只能保证你得到一个比较好的结果,但是对于很多计算机视觉的应用,大概已经足够了。至于更好的方法,暂时还不太适合公开...


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

    展开全文
  • 超像素分割与超像素合并/区域合并/多尺度分割

    万次阅读 多人点赞 2014-05-14 11:19:40
    最近两年,超像素分割

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

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

    1、超像素分割方法

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


    需要指出的是,其实分水岭方法效果非常好的,在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记录区域合并一个简单的示例




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

                                                                                         

    其中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,其实效果也很好,不过稍慢一些,毕竟模型复杂很多)。以下是两者准则下的效果:


    通过对比就可发现了,其实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演化的曲线,大概如下(红线),那么把最低点和最高点连成直线,计算所有点到这条直线的距离,距离最大的点就是区域合并该停止的点。 这个只能保证你得到一个比较好的结果,但是对于很多计算机视觉的应用,大概已经足够了。至于更好的方法,暂时还不太适合公开...


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



    展开全文
  • 亲测可用的SRM分割算法,可用于图像分割(超像素分割)
  • 本文介绍了一种基于图论的超像素分割及其合并算法,主要在检测图像的边界,图的分割准则,超像素区域特征的提取,度量超像素区域间的相似性这几个方面进行了研究. 首先,针对图像的边界检测这一问题,本文对最...

    摘要:

    超像素分割是计算机视觉中的热点问题,超像素的使用能有效地减少图像局部信息的冗余,大大降低了图像处理的复杂度和运算量,而且还保留了对图像进行进一步处理的有效信息,超像素技术越来越广泛地应用于许多领域.本文介绍了一种基于图论的超像素分割及其合并算法,主要在检测图像的边界,图的分割准则,超像素区域特征的提取,度量超像素区域间的相似性这几个方面进行了研究. 首先,针对图像的边界检测这一问题,本文对最近比较好的图像边界检测方法进行简单的介绍,通过实验对比和分析选取最优的边界检测方法,其边界检测结果作为本文超像素分割算法的输入.以图论为基础,介绍一种超像素分割准则,最后研究了一种把边界检测方法和图论算法相结合的超像素分割算法,此超像素分割算法使基于图论的分割方法能够分割像素分辨率较高的图像,改变了以往基于图论的超像素分割算法只能分割分辨率较低的图像的现状. 然后,在相似性测量方面,利用图像的低水平信息,例如颜色特征,纹理特征,位置特征,形状特征,设计了一种新的度量两个超像素区域之间相似性的方法.图像经过超像素分割算法分割得到超像素区域后,根据相似性度量方法测量每个超像素区域与其相邻超像素区域之间的相似性. 最后,针对图像分割中的过分割现象,本文利用研究的的超像素区域间相似性度量方法,计算超像素间的相似性,然后根据选定的阈值判断是否把它们进行合并,超像素合并算法可以使超像素分割算法中存在的过分割现象得到很好的改善,并且打破了以前仅仅运用图像的颜色和位置这些信息进行区域合并的限制.

    展开

    展开全文
  • 该方法利用k-means算法将图像细分为大量均匀同质类似单元格的小区域,使用互惠最近邻聚类算法以区域面积为约束条件在小范围搜寻互惠最近邻进行合并,从而生成超像素。通过实验与SLIC(simplelineariterativeclustering)...
  • 针对岩屑颗粒密集和颗粒表面纹理复杂的特点,提出一种基于熵率超像素分割和区域合并的分割方法。熵率超像素分割将图像分为一系列紧凑的、具有区域一致性的区域,不仅边缘定位准确且降低图像计算的复杂度;针对存在的过...
  • opencv3以上实现超像素

    千次阅读 热门讨论 2018-03-29 20:43:20
    感谢博主的整理,收藏用,原文...fps=1opencv关于超像素生成,目前没有发现网上有代码,这里为了方便大家使用超像素,我整理了一下opencv生成超像素的方法,希望对大家有帮助。这里主要介绍使用opencv生成superpixel...

    感谢博主的整理,收藏用,原文出自:https://blog.csdn.net/zhangyonggang886/article/details/52854219?locationNum=5&fps=1

    opencv关于超像素生成,目前没有发现网上有代码,这里为了方便大家使用超像素,我整理了一下opencv生成超像素的方法,希望对大家有帮助。

    这里主要介绍使用opencv生成superpixel,主要介绍的算法为SLIC,SEEDS,LSC。但是目前superpixel生成算法在OpenCV 3.1.0的Release版本中并不存在,因为他们是存放在opencv_contrib目录下面的未稳定功能模块,所以如果我们想要使用这个目录的功能,就需要自己重新进行OpenCV的编译。编译opencv网上有好多教程,大家可以查一查,按照教程一般都能够自己编译opencv。编译所需要的资源如下: 
    opencv3.1下载地址:http://opencv.org/downloads.html 
    opencv_contrib-master下载地址:https://github.com/opencv/opencv 
    cmake-gui下载地址:https://cmake.org/download/ 
    这里我就不具体介绍如何编译opencv了,编译以后的文件目录如下: 
    这里写图片描述

    install就是我们需要的目录,这里面的目录结构和我们下载opencv release版本差不多,见下图:

    这里写图片描述
    按照官网release版本做相应的配置就OK了。这里如要配置内容如下:这里写图片描述
    这里写图片描述

    具体的编译,配置就简单介绍到这里,下面是本文的主要内容。

    superpixel相关的类在cv::ximgproc命名空间下,在opencv文档中。我们可以看到一下内容: 
    这里写图片描述
    opencv官方文档中SLIC内容如下:

    #include <opencv2/core.hpp>
    namespace cv
    {
    namespace ximgproc
    {
    class CV_EXPORTS_W SuperpixelSLIC : public Algorithm
    {
    public:
       // 这个函数用于获得超像素的数量
        CV_WRAP virtual int getNumberOfSuperpixels() const = 0;
        //迭代的次数
        CV_WRAP virtual void iterate( int num_iterations = 10 ) = 0;
        //获得图像超像素标签,是一个CV_32SC1的Mat,标签的值在这个范围内[0, getNumberOfSuperpixels()]
        CV_WRAP virtual void getLabels( OutputArray labels_out ) const = 0;
        //获取超像素的边界,用于展示superpixel分割情况
        CV_WRAP virtual void getLabelContourMask( OutputArray image, bool thick_line = true ) const = 0;
        //这里主要是合并一些小的superpixel,min_element_size 最小超像素,像素点的数量
        CV_WRAP virtual void enforceLabelConnectivity( int min_element_size = 25 ) = 0;
    };
        //算法的种类
        enum SLIC { SLIC = 100, SLICO = 101 };
        //静态构造方法
        CV_EXPORTS_W Ptr<SuperpixelSLIC> createSuperpixelSLIC( InputArray image, int algorithm = SLICO, int region_size = 10, float ruler = 10.0f );
    }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    完整代码如下:

    #include "stdafx.h"
    #include<opencv2/opencv.hpp>
    #include <opencv2/ximgproc.hpp>
    #include<ctime>
    using namespace cv;
    using namespace std;
    
    int main()
    {
        clock_t start;
        clock_t end;
        Mat frame,labels;
        VideoCapture capture("E://image/skating2.avi");//打开文件
        Mat mask;
        if (!capture.isOpened()) 
        {
            cout << "文件打开失败!" << endl;  
        }
    
        while (1) 
        {
            capture >> frame;//获取一帧图像
            start = clock();//开始计时
    
            Ptr<cv::ximgproc::SuperpixelSLIC> slic = cv::ximgproc::createSuperpixelSLIC(frame);//创建一个对象
    
            slic->iterate();//迭代次数,默认为10
            slic->enforceLabelConnectivity();
            slic->getLabelContourMask(mask);//获取超像素的边界
            slic->getLabels(labels);//获取labels
            int number = slic->getNumberOfSuperpixels();//获取超像素的数量
    
            frame.setTo(Scalar(255, 255, 255), mask);
            end = clock();//结束计时
            cout << "时间:" << end - start << endl;
    
            imshow("test", frame);
    
            int key = waitKey(1);
            if (key == 27)
                break;
        }
        return 0;
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    运行结果如下: 
    这里写图片描述

    这里面具体参数的设定,大家可以参考文档和算法作者的论文,论文已经在参考文献中列举出来了。

    opencv官方文档中SEEDS内容如下:

    #include <opencv2/core.hpp>
    
    namespace cv
    {
    namespace ximgproc
    {
    
    class CV_EXPORTS_W SuperpixelSEEDS : public Algorithm
    {
    public:
    
        CV_WRAP virtual int getNumberOfSuperpixels() = 0;
    
        CV_WRAP virtual void iterate(InputArray img, int num_iterations=4) = 0;
    
        CV_WRAP virtual void getLabels(OutputArray labels_out) = 0;
    
        CV_WRAP virtual void getLabelContourMask(OutputArray image, bool thick_line = false) = 0;
    
        virtual ~SuperpixelSEEDS() {}
    };
    
    CV_EXPORTS_W Ptr<SuperpixelSEEDS> createSuperpixelSEEDS(
        int image_width, int image_height, int image_channels,
        int num_superpixels, int num_levels, int prior = 2,
        int histogram_bins=5, bool double_step = false);
    }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    seeds算法实现过程差不多,代码片段如下:

        //这里可以放到循环外面
        Ptr<cv::ximgproc::SuperpixelSEEDS> seeds = cv::ximgproc::createSuperpixelSEEDS(frame.cols, frame.rows, frame.channels(), 1000, 15, 2, 5, true);
    
        seeds->iterate(frame);//迭代次数,默认为4
        seeds->getLabels(labels);//获取labels
        seeds->getLabelContourMask(mask);;//获取超像素的边界
        int number_seeds = seeds->getNumberOfSuperpixels();//获取超像素的数量
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    运行结果如下: 
    这里写图片描述
    opencv官方文档中LSC内容如下:

    #include <opencv2/core.hpp>
    
    namespace cv
    {
    namespace ximgproc
    {
    
    class CV_EXPORTS_W SuperpixelLSC : public Algorithm
    {
    public:
    
        CV_WRAP virtual int getNumberOfSuperpixels() const = 0;
    
        CV_WRAP virtual void iterate( int num_iterations = 10 ) = 0;
    
        CV_WRAP virtual void getLabels( OutputArray labels_out ) const = 0;
    
        CV_WRAP virtual void getLabelContourMask( OutputArray image, bool thick_line = true ) const = 0;
    
        CV_WRAP virtual void enforceLabelConnectivity( int min_element_size = 20 ) = 0;
    };
    
        CV_EXPORTS_W Ptr<SuperpixelLSC> createSuperpixelLSC( InputArray image, int region_size = 10, float ratio = 0.075f );
    }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    LSC算法的代码片段如下:

        Ptr<cv::ximgproc::SuperpixelLSC> lsc = cv::ximgproc::createSuperpixelLSC(frame);
    
        lsc->iterate();//迭代次数,默认为4
        lsc->enforceLabelConnectivity();
        lsc->getLabels(labels);//获取labels
        lsc->getLabelContourMask(mask);;//获取超像素的边界
        int number_lsc = lsc->getNumberOfSuperpixels();//获取超像素的数量
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    运行结果如下: 
    这里写图片描述

    三个算法完整代码如下:

    #include "stdafx.h"
    #include<opencv2/opencv.hpp>
    #include <opencv2/ximgproc.hpp>
    #include<ctime>
    using namespace cv;
    using namespace std;
    
    int main()
    {
        clock_t start;
        clock_t end;
        Mat frame,labels;
        VideoCapture capture("E://image/skating2.avi");//打开文件
        Mat mask;
        if (!capture.isOpened()) 
        {
            cout << "文件打开失败!" << endl;  
        }
    
        while (1) 
        {
            capture >> frame;//获取一帧图像
            start = clock();//开始计时
    
            //Ptr<cv::ximgproc::SuperpixelSLIC> slic = cv::ximgproc::createSuperpixelSLIC(frame);//创建一个对象
    
            //slic->iterate();//迭代次数,默认为10
            //slic->enforceLabelConnectivity();
            //slic->getLabelContourMask(mask);//获取超像素的边界
            //slic->getLabels(labels);//获取labels
            //int number_slic = slic->getNumberOfSuperpixels();//获取超像素的数量
    
            //这里可以放到循环外面
            //Ptr<cv::ximgproc::SuperpixelSEEDS> seeds = cv::ximgproc::createSuperpixelSEEDS(frame.cols, frame.rows, frame.channels(), 1000, 15, 2, 5, true);
    
            //seeds->iterate(frame);//迭代次数,默认为4
            //seeds->getLabels(labels);//获取labels
            //seeds->getLabelContourMask(mask);;//获取超像素的边界
            //int number_seeds = seeds->getNumberOfSuperpixels();//获取超像素的数量
    
            Ptr<cv::ximgproc::SuperpixelLSC> lsc = cv::ximgproc::createSuperpixelLSC(frame);
    
            lsc->iterate();//迭代次数,默认为4
            lsc->enforceLabelConnectivity();
            lsc->getLabels(labels);//获取labels
            lsc->getLabelContourMask(mask);;//获取超像素的边界
            int number_lsc = lsc->getNumberOfSuperpixels();//获取超像素的数量
    
            frame.setTo(Scalar(255, 255, 255), mask);
            end = clock();//结束计时
            cout << "时间:" << end - start << endl;
    
            imshow("test", frame);
    
            int key = waitKey(1);
            if (key == 27)
                break;
        }
        return 0;
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    大体上介绍到这里,如果文中描述有什么问题,大家可以提出来。

    参考文献: 
    [1] Zhengqin Li and Jiansheng Chen. Superpixel segmentation using linear spectral clustering. June 2015. 
    [2] Radhakrishna Achanta, Appu Shaji, Kevin Smith, Aurelien Lucchi, Pascal Fua, and Sabine Susstrunk. Slic superpixels compared to state-of-the-art superpixel methods. IEEE Trans. Pattern Anal. Mach. Intell., 34(11):2274–2282, nov 2012. 
    [3] Michael Van den Bergh, Xavier Boix, Gemma Roig, Benjamin de Capitani, and Luc Van Gool. Seeds: Superpixels extracted via energy-driven sampling. In Computer Vision–ECCV 2012, pages 13–26. Springer, 2012.

    展开全文
  • Python实现超像素分割

    千次阅读 2019-12-07 10:44:49
    一、什么是超像素? 二、超像素具有哪些特点? 三、Simple Linear Iterative Clustering (SLIC)算法实现步骤 四、SLIC算法代码实现 五、效果展示和分析 六、基于超像素的边缘检测代码 七、基于超像素的...
  • 二值形态学是一个邻域计算,结构核通过定义哪些周围像素对形态有益,然后进行形态学处理。但是它是从图像二值化开始的。 我们常用到的膨胀是一个布尔或(or)运算,腐蚀是布尔与(and)运算。腐蚀是为
  • 首先,利用Mean Shift算法对图像进行超像素分割,然后根据非参数贝叶斯聚类模型,融合超像素的空间信息,提出一种区域合并策略对超像素进行合并,得到了最终的分割结果。实验结果表明,MS-BRM算法改善了超像素的过...
  • Superpixel Sampling Networks 摘要 超像素为图像数据提供了一种高效的低/中层次的表示,大大减少了后续视觉...大量的实验分析表明,SSNs不仅在传统的分割基准上优于现有的超像素算法,而且可以学习超像素用于其他任
  • 一种互惠最近邻区域合并超像素生成方法,罗学刚,王华军,针对传统的超像素生成方法的性能受超像素数目制约,提出一种互惠最近邻区域聚类生成超像素的方法。该方法利用k-means算法将图像细��
  • 以图像分割为应用背景,在广泛调研文献特别是超像素最新发展成果的基础上,结合对比实验,对每种方法的基本思想、方法特点进行总结,并对超像素分割目前存在的局限性进行说明,对未来可能发展方向进行展望。...
  • Weakly Supervised Semantic Segmentation Using Superpixel Pooling Network ...为此,我们提出了超像素合并网络(SPN),它利用输入图像的超像素分割作为池化层,以反映用于学习和推断语义分割的低级图像结构。然后,
  • 超像素—学习笔记

    万次阅读 多人点赞 2019-06-28 15:04:46
    图像分割中的超像素是指具有相似纹理、颜色、亮度等特征的相邻相似构成的具有一定意义的不规则的像素块。它利用像素之间特征的相似性将像素分组,用少量的超像素代替大量的像素来表达图像特征,很大程度上降低了图像...
  • MATLAB中在对图像超像素分割后如何提取超像素块,从而以超像素块为单位进行后继的操作?譬如超像素分割后以像素块为单位进行像素块的分类等等?超像素分割后以以像素块为单位进行分类等,如何提取出分类后的像素块?
  • 对高光谱图像执行基于 SLIC 超像素的降维,然后是基于 SVM 的分类,如论文中所述: X. Zhang、SE Chew、Z. Xu 和 ND Cahill,“SLIC Superpixels for Efficient Graph-Based Dimensionality Reduction of ...
  • 图像分割——超像素(Superpixels)分割(Matlab)

    千次阅读 多人点赞 2019-10-23 15:57:23
    超像素计算函数,SLIC如下: %SLIC算法 %输入参数: %I 为RGB图像 %numseeds 种子点数量 %compactness 颜色与空间距离相关性 function [labels]=SLIC(num_seeds,compactness,R,G,B) [M,N]=size(R); %图像总的...
  • 下一步就是初始化聚类中心,对应的函数在GetKValues_LABXYZ或者GetLABXYSeeds_ForGivenStepSize中,按照用户提供的超像素的大小或者超像素的个数来均匀的分布取样的XY位置和LAB的值,作者用vector来保存这些值,在源...
  • SLIC超像素分割算法

    万次阅读 多人点赞 2017-09-22 18:17:13
    超像素概念是2003年Xiaofeng Ren提出和发展起来的图像分割技术,是指具有相似纹理、颜色、亮度等特征的相邻像素构成的有一定视觉意义的不规则像素块。它利用像素之间特征的相似性将像素分组,用少量的超像素代替大量...
  • 超像素SLIC算法源码阅读

    千次阅读 2019-04-30 15:48:50
    超像素SLIC算法源码阅读超像素SLIC算法源码阅读SLIC简介源码阅读实验结果 超像素SLIC算法源码阅读 SLIC简介 SLIC的全称Simple Linear Iterative Clustering,即简单线性迭代聚类,论文和代码链接如下: 论文传送...
  • 为了解决超像素图像分割的过分割问题,提出了一种基于超像素区域颜色直方图相似性和统计特性的合并判断准则,用来合并超像素图像分割的区域。该合并准则将超像素分割结果作为区域合并的基本单元,利用基本单元的颜色...
  • 使用OpenCV和Python标记超像素色彩

    千次阅读 2020-11-02 21:06:52
    考虑到超像素会比滑动窗口更自然地分割输入图像,我们可以通过以下方法来计算图像中特定区域的色彩: 对输入图像进行超像素分割。 循环每个超像素,并计算其各自的彩色数值。 更新一个包含每个超像素的色彩数值的掩...
  • Mean-shift超像素分割

    千次阅读 2017-08-16 21:17:43
    Mean-shift超像素分割 超像素概念:超像素是指具有相似纹理、颜色、亮度等特征的相邻像素构成的图像块。是通过图像分割获取的小区域,但是超像素中往往存在过分割。 现有的超像素分割方法: l 基于图论的超像素分割...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,707
精华内容 5,482
关键字:

超像素合并

友情链接: RF_Example_Code.rar