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

    2014-12-14 16:18:07
    该程序代码是完整的Matlab代码,实现了超像素分割算法功能。超像素分割能将很小的区域目标准确分割,是现在研究的热点分割算法!这个程序供广大研究者参考!
  • 加权超像素分割

    2021-03-02 13:24:16
    加权超像素分割
  • slco超像素分割程序

    2020-10-22 21:47:22
    在Windows系统下,通过设置生成像素数目和参数M,可以对输入影像进行超像素分割,生成超像素分割的jpg影像
  • 超像素分割综述

    2019-01-25 10:40:21
    超像素分割文献综述。。
  • 最小势垒超像素分割

    2021-03-06 00:35:39
    超像素已成为许多计算机视觉系统中必不可少的处理单元,图像的超像素分割是最重要的步骤之一。 本文提出了一种有效的超像素分割算法。 我们为超像素分割(MBS)引入了一种新的紧凑型感知最小障碍距离,并为层次结构...
  • 超像素分割算法

    2016-10-31 21:16:04
    超像素分割算法
  • SNIC超像素分割算法

    2019-10-11 21:50:52
    超像素分割为图像分割,图像处理的基础,文件为MATLAB和C混编的代码,demo为主程序,运行demo主程序进行超像素分割
  • SLIC超像素分割

    2016-06-25 09:26:06
    SLIC超像素分割
  • 基于分水岭的超像素分割方法,效率给常高,分割效果也非常不错,适合超像素分割算法的朋友们学习。
  • matlab 超像素分割代码

    2017-09-24 21:20:18
    超像素分割代码 超像素概念是2003年Xiaofeng Ren提出和发展起来的图像分割技术,是指具有相似纹理、颜色、亮度等特征的相邻像素构成的有一定视觉意义的不规则像素块。它利用像素之间特征的相似性将像素分组,用少量的...
  • 超像素分割学习笔记

    2021-02-05 17:24:56
    掌握超像素分割的原理、超像素分割方法的推导过程以及实现方法 1.1 超像素 超像素是指将具有相似纹理、颜色、亮度等特征的相邻像素聚合成某一个像素块。结合超像素的思想,使得少量的像素块可以用来代替原本大量的...

    学习目标

    掌握超像素分割的原理、超像素分割方法的推导过程以及实现方法

    1.1 超像素

    超像素是指将具有相似纹理、颜色、亮度等特征的相邻像素聚合成某一个像素块,结合超像素的思想,这样可以使少量的像素块代替原本大量的像素。
    目前超像素广泛应用于图像分割、目标识别等领域。

    1.2 SLIC

    SLIC(Simple Linear IterativeClustering,简单线性迭代聚类)是超像素分割中使用比较多的方法,主要特点(优点)如下:
    1.基于LAB颜色空间
    2.运行速度快,生成的超像素紧凑
    3.思想比较简单

    1.3 SLIC实现的具体步骤

    1.初始化种子点

    在图像内均匀分布种子点(与Kmeans不同)
    若图像像素为N*N,预想分为K个像素块,则:

    • 每个像素块的初始大小为NN/KN*N/K

    • 相邻种子点间的步长S为 NN/K\sqrt {N*N/K}(假设初始每个像素块的大小是均匀的)

    2.重新选择种子点

    结合图像中的梯度信息,在n*n邻域内重新选择种子点(一般n取3)。重新选择种子点是为了防止均匀初始化后的种子点处于边缘或是噪声,将种子点移动到梯度比较小的位置。

    3.以各像素块种子点为中心更新标签

    以超像素的种子点为中心,在其上下左右2S的范围内搜索(和Kmeans 不同,这里的搜索不是全局范围的)

    在这里插入图片描述
    4.计算距离

    计算各像素点与种子点的距离,距离包括颜色距离空间位置的距离。

    颜色距离dcd_c的计算方法如下:

    ljli)2+(aiaj)2+(bibj)2\sqrt {l_j-l_i)^2+(a_i-a_j)^2+(b_i-b_j)^2}

    空间距离dsd_s的计算方法如下:

    (xjxi)2+(yiyj)2\sqrt {(x_j-x_i)^2+(y_i-y_j)^2}

    总距离DD的计算方法如下:

    (dcm)2+(dsS)2\sqrt {(\frac{d_c}{m})^2+(\frac{d_s}{S})^2}

    其中mm为常数,取值范围在[1,40],常以10代替

    因为搜索范围在种子点的[-2S,2S]内,有些像素点会被重复搜索到,所以应该同时记录距离,最终取最小值对应的种子点作为其聚类中心

    将上述3-4过程不断迭代,一直到满足最大迭代次数或者中心种子点不再发生变化为止。

    5.增强连通性

    经过迭代之后有可能会出现过分割、多连通、单个超像素被分割成多个不连续的超像素等,需要增强连通性

    主要思路是:新建一张标记表,表内元素均为-1,按照“Z”型走向(从左到右,从上到下顺序)将不连续的超像素、尺寸过小超像素重新分配给邻近的超像素,遍历过的像素点分配给相应的标签,直到所有点遍历完毕为止

    2 实战

    import cv2
    import numpy as np
    from skimage import img_as_float
    import matplotlib.pyplot as plt
    

    1.初始化种子点

    def init_cluster(pic,n_segments):
        cluster_w,cluster_h=int(cluster_S/2),int(cluster_S/2)  #计算出每个的长和宽
        center={}
        i=0
        while cluster_h<pic.shape[0]:  #shape[0]是高度
            while cluster_w<pic.shape[1]:
                center[i]=[cluster_w,cluster_h,pic[cluster_w,cluster_h,0],pic[cluster_w,cluster_h,1],pic[cluster_w,cluster_h,2]]
                cluster_w=cluster_w+cluster_S
                i=i+1
            cluster_w=int(cluster_S/2)
            cluster_h=cluster_h+cluster_S
        return center
    

    2.计算梯度

    def caculate_grad(w,h):
        if h+1>=pic.shape[0] or w+1>=pic.shape[1]:
            w=w-2
            h=h-2
        grad=np.sum(pic[w+1,h+1,:]-pic[w,h,:])
        return grad
    

    3.在3*3邻域内根据计算得到的梯度,更新种子点

    def update_center(center):#更新中心点
        for i in range(0,len(center)):
            w,h=center[i][0],center[i][1] 
            now_grad=caculate_grad(w,h)  #计算当前的梯度
            for dw in range(-1,2): #在3*3邻域内
                for dh in range(-1,2):
                    new_grad=caculate_grad(w+dw,h+dh)  #计算新梯度
                    if new_grad<now_grad:
                        now_grad=new_grad
                        center[i]=[w+dw,h+dh,pic[w+dw,h+dh,0],pic[w+dw,h+dh,1],pic[w+dw,h+dh,2]]
        return center
    

    4.可视化种子点

    def draw_center(center)
        for i in range(0,len(center)): 
            cv2.circle(ori_pic,(center[i][0],center[i][1]),1, (255, 0, 0),4) #将初始化中心标出来
        fig=plt.figure()
        ax=fig.add_subplot(1,1,1)
        ax.imshow(ori_pic)
        plt.show()
    
    n_segments=50
    ori_pic=cv2.imread('Lenna.png')
    ori_pic=cv2.cvtColor(ori_pic,cv2.COLOR_BGR2RGB)
    pic=cv2.cvtColor(ori_pic,cv2.COLOR_BGR2LAB)
    cluster_shape=pic.shape[0]*pic.shape[1]/n_segments    #每个超像素块中包含的像素数
    cluster_S=int(np.sqrt(cluster_shape))  #超像素块的长/宽/初始种子点之间的距离(假设形状规则)
    center=init_cluster(pic,n_segments) #初始化中心
    center=update_center(center)  #更新中心,避免中心在梯度高(噪声点等)
    draw_center(center) #可视化初始中心点
    

    得到初始的种子点(已经进行了梯度更新,可以看出中心点分布不是绝对均匀)
    在这里插入图片描述

    5.初始化距离矩阵(用来存储每个像素点与其中心点间的距离)

    def init_distance():
        distance=[]
        for i in range(pic.shape[0]):
            distance_item=[np.inf for j in range(pic.shape[1])]
            distance.append(distance_item)
        return distance
    

    7.初始化像素矩阵(用来记录每个像素块中包含的具体像素位置)

    def init_pixel():
        pixel={}
        for i in range(0,len(center)):
            pixel[i]=[]
        return pixel
    

    8.计算某像素与其种子点之间的距离(这里M取10)

    def caculate_distance(w_,h_,center_):#根据颜色空间和像素位置进行更新
        color_dic=np.sqrt(np.sum(np.square(pic[w_,h_,:]-np.array(center_[2:]))))
        geo_dic=np.sqrt(np.sum(np.square(np.array([w_,h_])-np.array(center_[:2]))))
        dis=np.sqrt(np.square(color_dic/10)+np.square(geo_dic/cluster_S))
        return dis
    

    9.计算各个像素点所属的标签(即所属种子点)

    def get_cluster(center,distance,label,pixel):
        for i in range(0,len(center)):
            for dw in range(center[i][0]-2*cluster_S,center[i][0]+2*cluster_S):  #在2S范围内
                if dw<0 or dw>=pic.shape[0]:  continue 
                for dh in range(center[i][1]-2*cluster_S,center[i][1]+2*cluster_S):
                    if dh<0 or dh>=pic.shape[1]:  continue
                    dis=caculate_distance(dw,dh,center[i])#计算距离
                    if dis<distance[dw][dh]:
                        distance[dw][dh]=dis
                        label[(dw,dh)]=center[i]  #记录当前的中心点
                        for j in list(pixel.values()):
                            if(dw,dh) in j:#若该像素点之前已经隶属于某个中心,需要先将其去掉,再添加至新的中心
                                j.remove((dw,dh))
                        pixel[i].append((dw,dh))
        return label,distance,pixel
    

    10.更新各超像素的中心(所属种子点)

    def update_cluster(center,pixel):#更新中心
        for i,item in enumerate(pixel.values()): #{1:[(),()]
            w,h=0,0
            for j in item:  
                w+=j[0]
                h+=j[1]
            center_w=int(w/len(item))
            center_h=int(h/len(item))
            center[i]=[center_w,center_h,pic[center_w,center_h,0],pic[center_w,center_h,1],pic[center_w,center_h,2]]
        return center
                
    

    11.可视化超像素分割结果

    def save_cluster(center,pixel):
        image_arr = np.copy(ori_pic)
        for i,item in enumerate(pixel.values()): #{1:[(),()]
            for j in item:
                image_arr[j[0],j[1],0]=image_arr[center[i][0],center[i][1],0]
                image_arr[j[0],j[1],1]=image_arr[center[i][0],center[i][1],1]
                image_arr[j[0],j[1],2]=image_arr[center[i][0],center[i][1],2]
        fig=plt.figure()
        ax=fig.add_subplot(1,1,1)
        ax.imshow(image_arr)
        plt.show() 
    
    label={}       
    distance=init_distance()  
    pixel=init_pixel()#初始化簇内的像素点 形如:{0: [], 1: [], 2: [], 3: [], 4: [], 5: []}
    
    for epoch in range(10):#循环迭代十次
        old_label=label
        print('epoch:',epoch)
        label,distance,pixel=get_cluster(center,distance,old_label,pixel)
        center=update_cluster(center,pixel)
        save_cluster(center,pixel)
    

    最终可以得到超像素分割的结果为:
    在这里插入图片描述
    在这里插入图片描述
    调包:

    from skimage.segmentation import slic,mark_boundaries
    from skimage import img_as_float
    pic=cv2.imread('Lenna.png')
    segments = slic(img_as_float(pic), n_segments=50,sigma=2)
    marked_img=mark_boundaries(img_as_float(cv2.cvtColor(pic, cv2.COLOR_BGR2RGB)), segments)
    fig=plt.figure()
    # fig.show(marked_img)
    ax=fig.add_subplot(1,1,1)
    ax.imshow(marked_img)
    plt.axis('off')
    plt.show()
    

    在这里插入图片描述

    参考文献

    [1] Achanta,Radhakrishna, et al. “SLIC superpixels compared to state-of-the-artsuperpixel methods.” Pattern Analysis and Machine Intelligence, IEEETransactions on 34.11 (2012): 2274-2282.

    展开全文
  • SLIC超像素分割matlab代码

    热门讨论 2015-05-10 10:54:07
    SLIC超像素分割matlab代码
  • 超像素分割软件,让你快速将超像素方法应用于你的图像文件,并输出超像素分割效果,为你文章讲解和计划实验做准备。
  • 生成的超像素如同细胞一般紧凑整齐,邻域特征比较容易表达。这样基于像素的方法可以比较容易的改造为基于超像素的方法。...相比其他的超像素分割方法,SLIC在运行速度、生成超像素的紧凑度、轮廓保持方面都比较理想。
  • 分析了超像素分割领域的发展现状,以基于图论的方法和基于梯度下降的方法为视角,对现有超像素分割方法 进行归纳和论述。在此基础上,就目前常用的超像素分割算法进行了实验对比,分析各自的优势和不足。最后, 对...
  • 超像素分割算法,亲测可用,内含数据图片,不用mex,直接matlab运行
  • 超像素分割c代码

    2017-12-02 13:20:11
    超像素分割C代码,修改后不会出现warning C4244: “=”: 从“double”转换到“int”,可能丢失数据 error C2275: “mwSize”: 将此类型用作表达式非法 error C2065: “numdims”: 未声明的标识符 error C2146: 语法...
  • 基于熵率的超像素分割代码
  • MATLAB中在对图像超像素分割后如何提取超像素块,从而以超像素块为单位进行后继的操作?譬如超像素分割后以像素块为单位进行像素块的分类等等?超像素分割后以以像素块为单位进行分类等,如何提取出分类后的像素块?
  • 超像素分割与超像素合并/区域合并/多尺度分割

    万次阅读 多人点赞 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



    展开全文
  • 具有边界约束的超像素分割的简单算法
  • SLIC方法的超像素分割

    热门讨论 2014-11-01 11:00:07
    基于SLIC方法的超像素分割算法代码,纯MATLAB编写。
  • SLIC: simple linear ... 这是一个基于聚类算法的超像素分割,由LAB空间以及x、y像素坐标共5维空间来计算。不仅可以分割彩色图,也可以兼容分割灰度图,它还有一个优点就是可以人为的设置需要分割的超像素的数量。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 575
精华内容 230
关键字:

超像素分割