图像分割 订阅
图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。现有的图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。从数学角度来看,图像分割是将数字图像划分成互不相交的区域的过程。图像分割的过程也是一个标记过程,即把属于同一区域的像素赋予相同的编号。 [1] 展开全文
图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。现有的图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。从数学角度来看,图像分割是将数字图像划分成互不相交的区域的过程。图像分割的过程也是一个标记过程,即把属于同一区域的像素赋予相同的编号。 [1]
信息
分割方法
阈值分割等
外文名
image segmentation
类    型
计算机技术
发展实践
1998
用    途
图像语义识别,图像搜索
中文名
图像分割
学    科
跨学科
图像分割引言
图像分割 图像分割 数字图像处理技术是一个跨学科的领域。随着计算机科学技术的不断发展,图像处理和分析逐渐形成了自己的科学体系,新的处理方法层出不穷,尽管其发展历史不长,但却引起各方面人士的广泛关注。首先,视觉是人类最重要的感知手段,图像又是视觉的基础,因此,数字图像成为心理学、生理学、计算机科学等诸多领域内的学者们研究视觉感知的有效工具。其次,图像处理在军事、遥感、气象等大型应用中有不断增长的需求。1998年以来,人工神经网络识别技术已经引起了广泛的关注,并且应用于图像分割。基于神经网络的分割方法的基本思想是通过训练多层感知机来得到线性决策函数,然后用决策函数对像素进行分类来达到分割的目的。这种方法需要大量的训练数据。神经网络存在巨量的连接,容易引入空间信息,能较好地解决图像中的噪声和不均匀问题。选择何种网络结构是这种方法要解决的主要问题。图像分割是图像识别和计算机视觉至关重要的预处理。没有正确的分割就不可能有正确的识别。但是,进行分割仅有的依据是图像中像素的亮度及颜色,由计算机自动处理分割时,将会遇到各种困难。例如,光照不均匀、噪声的影响、图像中存在不清晰的部分,以及阴影等,常常发生分割错误。因此图像分割是需要进一步研究的技术。人们希望引入一些人为的知识导向和人工智能的方法,用于纠正某些分割中的错误,是很有前途的方法,但是这又增加了解决问题的复杂性。在通信领域中,图像分割技术对可视电话等活动图像的传输很重要,需要把图像中活动部分与静止的背景分开,还要把活动部分中位移量不同的区域分开,对不同运动量的区域用不同的编码传输,以降低传输所需的码率。
收起全文
精华内容
参与话题
问答
  • 图像分割算法概述及常用边缘检测算法 Email:whowhoha@outlook.com 一、概述  用计算机进行数字图像处理的目的有两个,一是产生更适合人类视觉观察和识别的图像,二是希望计算机能够自动进行识别和理解图像。无论...

                                                                                  图像分割算法概述及常用边缘检测算法

    一、概述
      用计算机进行数字图像处理的目的有两个,一是产生更适合人类视觉观察和识别的图像,二是希望计算机能够自动进行识别和理解图像。无论是为了何种目的,图像处理的关键一步是对包含有大量各式各样景物信息的图像进行分解。分解的最终结果就是图像被分成一些具有各种特征的最小成分,这些成分就称为图像的基元。产生这些基元的过程就是图像分割的过程。图像分割作为图像处理领域中极为重要的内容之一,是实现图像分析与理解的基础。从概念上来说,所谓图像分割就是按照一定的原则将一幅图像或景物分为若干个部分或子集的过程。目前图像处理系统中我们只能得到二维图像信息,因此只能进行图像分割而不是景物分割(景物是三维信息);图像分割也可以理解为将图像中有意义的特征区域或者需要应用的特征区域提取出来,这些特征区域可以是像素的灰度值、物体轮廓曲线、纹理特性等,也可以是空间频谱或直方图特征等。在图像中用来表示某一物体的区域,其特征都是相近或相同的,但是不同物体的区域之间,特征就会急剧变化。目前已经提出的图像分割方法很多,从分割依据的角度来看,图像的分割方法可以分为相似性分割和非连续性分割。相似性分割就是将具有同一灰度级或相同组织结构的像素聚集在一起,形成图像的不同区域;非连续性分割就是首先检测局部不连续性,然后将它们连接在一起形成边界,这些边界将图像分成不同的区域。由于不同种类的图像,不同的应用场合,需要提取的图像特征是不同的,当然对应的图像特征提取方法也就不同,因此并不存在一种普遍适应的最优方法。
      图像分割方法又可分为结构分割方法和非结构分割方法两大类。结构分割方法是根据图像的局部区域象素的特征来实现图像分割,如阈值分割、区域生长、边缘检测、纹理分析等,这些方法假定事先知道这些区域的特性,或者在处理过程中能够求得这些特性,从而能够寻找各种形态或研究各像素群。非结构分割法包括统计模式识别、神经网络方法或其它利用景物的先验知识实现的方法等等。这些内容由于专业性很强,就不在本文讨论内容中了,有兴趣的读者可以参考图像处理的专业书籍。总之,图像分割可以分为图像的边缘提取和图像的二值化二部分内容,下面我们首先来讨论一下各种常用的图像边缘提取的方法。
    二、图像边缘检测
      数字图像的边缘检测是图像分割、目标区域的识别、区域形状提取等图像分析领域十分重要的基础,是图像识别中提取图像特征的一个重要属性,图像理解和分析的第一步往往就是边缘检测,目前它以成为机器视觉研究领域最活跃的课题之一,在工程应用中占有十分重要的地位。物体的边缘是以图像的局部特征不连续的形式出现的,也就是指图像局部亮度变化最显著的部分,例如灰度值的突变、颜色的突变、纹理结构的突变等,同时物体的边缘也是不同区域的分界处。图像边缘有方向和幅度两个特性,通常沿边缘的走向灰度变化平缓,垂直于边缘走向的像素灰度变换剧烈,根据灰度变化的特点,可分为阶跃型、房顶型和凸缘型,

      由于边缘是图像上灰度变化最剧烈的地方,传统的边缘检测就是利用了这个特点,对图像各个像素点进行微分或求二阶微分来确定边缘像素点。一阶微分图像的峰值处对应着图像的边缘点;二阶微分图像的过零点处对应着图像的边缘点。根据数字图像的特点,处理图像过程中常采用差分来代替导数运算,对于图像的简单一阶导数运算,图像边缘提取的常用梯度算子有Robert算子、Sobel算子、Prewitt算子、Krisch算子等。下面以边缘检测Sobel算子为例来讲述数字图像处理中边缘检测的实现:对于数字图像,可以用一阶差分代替一阶微分;

           △xf(x,y)=f(x,y)-f(x-1,y);

                   △yf(x,y)=f(x,y)-f(x,y-1);

      求梯度时对于平方和运算及开方运算,可以用两个分量的绝对值之和表示,Sobel梯度算子是先做成加权平均,再微分,然后求梯度,即: 

                  △xf(x,y)= f(x-1,y+1) + 2f(x,y+1) + f(x+1,y+1)-f(x-1,y-1) - 2f(x,y-1) - f(x+1,y-1);
        △yf(x,y)= f(x-1,y-1) + 2f(x-1,y) +f(x-1,y+1)- f(x+1,y-1) - 2f(x+1,y) - f(x+1,y+1);
        G[f(x,y)]=|△xf(x,y)|+|△yf(x,y)|;
      上述各式中的像素之间的关系见下图

     
          图一:Sober算子中各个像素点的关系图

    常用的检测实现公式列出如下(检测模版可以从相应的算法很容易的得到):
      Roberts算子:G[i,i]=|f[i,j]-f[i+1,j+1]|+|f[i+1,j]-f[i,j+1]|;
      Sobe算子:G[i,i]=|f[i-1,j+1]+2f[i,j+1]+f[i+1,j+1]-f[i-1,j-1]-2f[i,j-1]-f[i+1,j-1]|
               +|f[i-1,j-1]+2f[i-1,j]+f[i-1,j+1]-f[i+1,j-1]-2f[i+1,j]-f[i+1,j+1]|;
      其中G[i,j]表示处理后(i,j)点的灰度值,f[i,j]表示处理前该点的灰度值。

    在视图类中定义了响应菜单命令的边缘检测Sobel算子实现灰度图像边缘检测的函数:

    void CDibView::OnMENUSobel()
    {
     CClientDC pDC(this);
    HDC hDC=pDC.GetSafeHdc();//
    获取当前设备上下文的句柄;
    SetStretchBltMode(hDC,COLORONCOLOR);
    HANDLE data1handle;
     LPDIBHDRTMAPINFOHEADER lpDIBHdr;
     CDibDoc *pDoc=GetDocument();
     HDIB hdib;
     unsigned char *lpDIBBits;
     unsigned char *data;
     hdib=pDoc->m_hDIB;//得到图象数据;
     lpDIBHdr=(LPDIBHDRTMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);
     lpDIBBits= lpDIBHdr +* (LPDWORD)lpDIBHdr +256*sizeof(RGBQUAD);
     //得到指向位图像素值的指针;
    data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpDIBHdr->biWidth*8)*lpDIBHdr->biHeight);
     //申请存放处理后的像素值的缓冲区
    data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);
     AfxGetApp()->BeginWaitCursor();
     int i,j,buf,buf1,buf2;
     for( j=0; jbiHeight; j++)//以下循环求(x,y)位置的灰度值
      for( i=0; ibiWidth; i++)
     {
       if(((i-1)>=0)&&((i+1)biWidth)&&((j-1)>=0)&&((j+1)biHeight))
       {//对于图像四周边界处的向素点不处理
       buf1=(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1))
         +2*(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j))
         +(int)(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1));
        buf1=buf1-(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1))
         -2*(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j))
         -(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1));

        //以上是对图像进行水平(x)方向的加权微分

        buf2=(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1))
         +2*(int)(int)*(lpDIBBits+(i)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1))
         +(int)(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1)); 
        buf2=buf2-(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1))
         -2*(int)(int)*(lpDIBBits+(i)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1))
         -(int)(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1));

        //以上是对图像进行垂直(y)方向加权微分

        buf=abs(buf1)+abs(buf2);//求梯度

       if(buf>255) buf=255;
         if(buf<0)buf=0;
       *(data+i*WIDTHBYTES(lpDIBHdr->biWidth*8)+j)=(BYTE)buf;
       }
       else*(data+i*lpDIBHdr->biWidth+j)=(BYTE)0;
      }
     for( j=0; jbiHeight; j++)
     for( i=0; ibiWidth; i++)
     *(lpDIBBits+i*WIDTHBYTES(lpDIBHdr->biWidth*8)+j)=*(data+i*WIDTHBYTES(lpDIBHdr->biWidth*8)+j);      //处理后的数据写回原缓冲区
    StretchDIBits(hDC,0,0,lpDIBHdr->biWidth,lpDIBHdr->biHeight,0,0,
    lpDIBHdr->biWidth,lpDIBHdr->biHeight,
    lpDIBBits,(LPDIBHDRTMAPINFO)lpDIBHdr,
    DIB_RGB_COLORS,
    SRCCOPY);

    对于边缘检测,只要知道有若干个检测模板(既边缘检测矩阵),就可以直接实现检测功能了,常用的检测实现公式列出如下(检测模版可以从相应的算法很容易的得到):
      Roberts算子:G[i,i]=|f[i,j]-f[i+1,j+1]|+|f[i+1,j]-f[i,j+1]|;

      Sobe算子:G[i,i]=|f[i-1,j+1]+2f[i,j+1]+f[i+1,j+1]-f[i-1,j-1]-2f[i,j-1]-f[i+1,j-1]|+|f[i-1,j-1]+2f[i-1,j]+f[i-1,j+1]-f[i+1,j-1]-2f[i+1,j]-f[i+1,j+1]|;

      其中G[i,j]表示处理后(i,j)点的灰度值,f[i,j]表示处理前该点的灰度值。

    Kirsch算子实现起来相对来说稍微麻烦一些,它采用8个模板对图像上的每一个像素点进行卷积求导数,这8个模板代表8个方向,对图像上的8个特定边缘方向作出最大响应,运算中取最大值作为图像的边缘输出(上述算法中用到的8个模板在下面的实现代码中给出)。为了便于读者理解该算法的实现,这里我们给出实现该算法的函数代码,读者可以稍加改动应用到自己的项目中去。

    BOOL Kirsch(BYTE *pData,int Width,int Height)
    {//
    定义实现Kirsch算法的8个模板;
    int i,j,s,t,k,max,sum[8];
    statica[3][3]={{+5,+5,+5},{-3,0,-3},{-3,-3,-3}};
    statica1[3][3]={{-3,+5,+5},{-3,0,+5},{-3,-3,-3}};
    statica2[3][3]={{-3,-3,+5},{-3,0,+5},{-3,-3,+5}};
    statica3[3][3]={{-3,-3,-3},{-3,0,+5},{-3,+5,+5}};
    statica4[3][3]={{-3,-3,-3},{-3,0,-3},{+5,+5,+5}};
    statica5[3][3]={{-3,-3,-3},{+5,0,-3},{+5,+5,-3}};
    statica6[3][3]={{+5,-3,-3},{+5,0,-3},{+5,-3,-3}};
    statica7[3][3]={{+5,+5,-3},{+5,0,-3},{-3,-3,-3}};
    BYTE *pData1;
    if(pData==NULL)
    {
    AfxMessageBox("
    图像数据为空,请读取图像数据!");
    return FALSE;
    }
    pData1=(BYTE*)new char[Width*Height];
    if(pData1==NULL)
    {
    AfxMessageBox("
    图像缓冲数据区申请失败,请重新申请图像数据缓冲区!");
    return FALSE ;
    }
    memcpy(pData1,pData, Width*8*Height);
    //kirsch
    算子处理,对每一像素点求取八个方向的导数;;
    for(i=1;i<Height-1;i++)
    for(j=1;j<Width-1;j++)

    sum[1]=sum[2]=sum[3]=sum[4]=sum[5]=sum[6]=sum[7]=sum[8]=0;
    for(t=-1;t<2;t++)
    {
    for(s=-1;s<2;s++)
    {sum[1]+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a[1+t][1+s];
    sum[2]+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a1[1+t][1+s];sum[3]+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a2[1+t][1+s];sum[4]+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a3[1+t][1+s];sum[5]+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a4[1+t][1+s];sum[6]+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a5[1+t][1+s]; sum[7]+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a6[1+t][1+s];sum[8]+=*(pData+WIDTHBYTES(Width*8)*(i+t)+j+s)*a7[1+t][1+s];
    }
    }
    //取最大方向的导数;
    for(k=0;k<8;k++)

    max=0; 
    if(max<sum[k])
    max=sum[k];
    }
    if(max<0)
    max=0;
    if(max>255)
    max=255;
    *(pData1+ Width*8*i+j)=max;
    }
    memcpy(pData,pData1, Width*8*Height);
    delete pData1;
    return TRUE;

      另外还有一种称为拉普拉斯的算子是不依赖于边缘方向的二阶微分算子,对于数字图像来说拉普拉斯算子可以简单表示为:G[I,j]=|f[i+1,j]+f[i-1,j]+f(i,j+1)+f[i,j-1]-4f[i,j]|;它是一个标量而不是向量,具有旋转不变,既各向同性的性质,它常常用在图像处理的过程中。梯度算子和拉普拉斯算子对噪声敏感,它们都使噪声成份加强,因此在处理含有较大噪声的图像时,常常先对图像进行平滑操作,然后再进行二阶微分,这就产生了所谓的LOG(又称为Marr方法)边缘检测方法。它先用高斯函数对图像进行平滑,然后再用拉普拉斯算子进行运算。总的来说,传统的边缘检测算子的噪声平滑能力和边缘定位能力是矛盾的,为了克服这个不足,正确地得到图像的边缘信息,人们提出了很多方法,如多尺度空间滤波、Facet模型检测边缘、模板匹配、Hough变换、小波变换、人工神经网络、模糊推理等算法。但这些方法绝大多数没有经典的算法精简,要么难以获得合理的计算复杂度,要么需要人为的调节各种参数,有时甚至难以实时运行。因为传统边缘的定义为图像中灰度的突变,所以这样定义边缘既失去了边缘的部分信息,又把噪声的影响包含在了边缘中。其实,边缘往往具有以下特征:

    1)灰度突变;

    2)是不同区域的边界;

    3)具有方向性;

      根据边缘的这三个特征,可以判断所关心的区域其特征是否存在差异来判断是否存在边缘的可能性。如果特征没有差异,则认为是平滑区;如果特征有差异,则判断为边缘点。

    展开全文
  • matlab图像分割算法源码

    千次阅读 多人点赞 2019-03-09 17:37:37
    1.图像反转 MATLAB程序实现如下: I=imread(‘xian.bmp’); J=double(I); J=-J+(256-1); %图像反转线性变换 H=uint8(J); subplot(1,2,1),imshow(I); subplot(1,2,2),imshow(H); 2.灰度线性变换 MATLAB程序...

    MATLAB图像处理的一些算法,前期掌握这些处理简单的图像。。算是分割算法合集

    1.图像反转
    MATLAB程序实现如下:
    I=imread(‘xian.bmp’);
    J=double(I);
    J=-J+(256-1); %图像反转线性变换
    H=uint8(J);
    subplot(1,2,1),imshow(I);
    subplot(1,2,2),imshow(H);

    2.灰度线性变换
    MATLAB程序实现如下:
    I=imread(‘xian.bmp’);
    subplot(2,2,1),imshow(I);
    title(‘原始图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系
    I1=rgb2gray(I);
    subplot(2,2,2),imshow(I1);
    title(‘灰度图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系
    J=imadjust(I1,[0.1 0.5],[]); %局部拉伸,把[0.1 0.5]内的灰度拉伸为[0 1]
    subplot(2,2,3),imshow(J);
    title(‘线性变换图像[0.1 0.5]’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    K=imadjust(I1,[0.3 0.7],[]); %局部拉伸,把[0.3 0.7]内的灰度拉伸为[0 1]
    subplot(2,2,4),imshow(K);
    title(‘线性变换图像[0.3 0.7]’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系

    3.非线性变换
    MATLAB程序实现如下:
    I=imread(‘xian.bmp’);
    I1=rgb2gray(I);
    subplot(1,2,1),imshow(I1);
    title(‘灰度图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    J=double(I1);
    J=40*(log(J+1));
    H=uint8(J);
    subplot(1,2,2),imshow(H);
    title(‘对数变换图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系

    4.直方图均衡化
    MATLAB程序实现如下:
    I=imread(‘xian.bmp’);
    I=rgb2gray(I);
    figure;
    subplot(2,2,1);
    imshow(I);
    subplot(2,2,2);
    imhist(I);
    I1=histeq(I);
    figure;
    subplot(2,2,1);
    imshow(I1);
    subplot(2,2,2);
    imhist(I1);

    5.线性平滑滤波器
    用MATLAB实现领域平均法抑制噪声程序:
    I=imread(‘xian.bmp’);
    subplot(231)
    imshow(I)
    title(‘原始图像’)
    I=rgb2gray(I);
    I1=imnoise(I,‘salt & pepper’,0.02);
    subplot(232)
    imshow(I1)
    title(‘添加椒盐噪声的图像’)
    k1=filter2(fspecial(‘average’,3),I1)/255; %进行33模板平滑滤波
    k2=filter2(fspecial(‘average’,5),I1)/255; %进行5
    5模板平滑滤波k3=filter2(fspecial(‘average’,7),I1)/255; %进行77模板平滑滤波
    k4=filter2(fspecial(‘average’,9),I1)/255; %进行9
    9模板平滑滤波
    subplot(233),imshow(k1);title(‘33模板平滑滤波’);
    subplot(234),imshow(k2);title('5
    5模板平滑滤波’);
    subplot(235),imshow(k3);title(‘77模板平滑滤波’);
    subplot(236),imshow(k4);title('9
    9模板平滑滤波’);

    6.中值滤波器
    用MATLAB实现中值滤波程序如下:
    I=imread(‘xian.bmp’);
    I=rgb2gray(I);
    J=imnoise(I,‘salt&pepper’,0.02);
    subplot(231),imshow(I);title(‘原图像’);
    subplot(232),imshow(J);title(‘添加椒盐噪声图像’);
    k1=medfilt2(J); %进行33模板中值滤波
    k2=medfilt2(J,[5,5]); %进行5
    5模板中值滤波
    k3=medfilt2(J,[7,7]); %进行77模板中值滤波
    k4=medfilt2(J,[9,9]); %进行9
    9模板中值滤波
    subplot(233),imshow(k1);title(‘33模板中值滤波’);
    subplot(234),imshow(k2);title('5
    5模板中值滤波’);
    subplot(235),imshow(k3);title(‘77模板中值滤波’);
    subplot(236),imshow(k4);title('9
    9模板中值滤波’);

    7.用Sobel算子和拉普拉斯对图像锐化:
    I=imread(‘xian.bmp’);
    subplot(2,2,1),imshow(I);
    title(‘原始图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    I1=im2bw(I);
    subplot(2,2,2),imshow(I1);
    title(‘二值图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    H=fspecial(‘sobel’); %选择sobel算子
    J=filter2(H,I1); %卷积运算
    subplot(2,2,3),imshow(J);
    title(‘sobel算子锐化图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    h=[0 1 0,1 -4 1,0 1 0]; %拉普拉斯算子
    J1=conv2(I1,h,‘same’); %卷积运算
    subplot(2,2,4),imshow(J1);
    title(‘拉普拉斯算子锐化图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系

    8.梯度算子检测边缘
    用MATLAB实现如下:
    I=imread(‘xian.bmp’);
    subplot(2,3,1);
    imshow(I);
    title(‘原始图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    I1=im2bw(I);
    subplot(2,3,2);
    imshow(I1);
    title(‘二值图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    I2=edge(I1,‘roberts’);
    figure;
    subplot(2,3,3);
    imshow(I2);
    title(‘roberts算子分割结果’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    I3=edge(I1,‘sobel’);
    subplot(2,3,4);
    imshow(I3);
    title(‘sobel算子分割结果’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    I4=edge(I1,‘Prewitt’);
    subplot(2,3,5);
    imshow(I4);
    title(‘Prewitt算子分割结果’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系

    9.LOG算子检测边缘
    用MATLAB程序实现如下:
    I=imread(‘xian.bmp’);
    subplot(2,2,1);
    imshow(I);
    title(‘原始图像’);
    I1=rgb2gray(I);
    subplot(2,2,2);
    imshow(I1);
    title(‘灰度图像’);
    I2=edge(I1,‘log’);
    subplot(2,2,3);
    imshow(I2);
    title(‘log算子分割结果’);

    10.Canny算子检测边缘
    用MATLAB程序实现如下:
    I=imread(‘xian.bmp’);
    subplot(2,2,1);
    imshow(I);
    title(‘原始图像’)
    I1=rgb2gray(I);
    subplot(2,2,2);
    imshow(I1);
    title(‘灰度图像’);
    I2=edge(I1,‘canny’);
    subplot(2,2,3);
    imshow(I2);
    title(‘canny算子分割结果’);

    11.边界跟踪(bwtraceboundary函数)
    clc
    clear all
    I=imread(‘xian.bmp’);
    figure
    imshow(I);
    title(‘原始图像’);
    I1=rgb2gray(I); %将彩色图像转化灰度图像
    threshold=graythresh(I1); %计算将灰度图像转化为二值图像所需的门限
    BW=im2bw(I1, threshold); %将灰度图像转化为二值图像
    figure
    imshow(BW);
    title(‘二值图像’);
    dim=size(BW);
    col=round(dim(2)/2)-90; %计算起始点列坐标
    row=find(BW(:,col),1); %计算起始点行坐标
    connectivity=8;
    num_points=180;
    contour=bwtraceboundary(BW,[row,col],‘N’,connectivity,num_points);
    %提取边界
    figure
    imshow(I1);
    hold on;
    plot(contour(:,2),contour(:,1), ‘g’,‘LineWidth’ ,2);
    title(‘边界跟踪图像’);

    12.Hough变换
    I= imread(‘xian.bmp’);
    rotI=rgb2gray(I);
    subplot(2,2,1);
    imshow(rotI);
    title(‘灰度图像’);
    axis([50,250,50,200]);
    grid on;
    axis on;
    BW=edge(rotI,‘prewitt’);
    subplot(2,2,2);
    imshow(BW);
    title(‘prewitt算子边缘检测后图像’);
    axis([50,250,50,200]);
    grid on;
    axis on;
    [H,T,R]=hough(BW);
    subplot(2,2,3);
    imshow(H,[],‘XData’,T,‘YData’,R,‘InitialMagnification’,‘fit’);
    title(‘霍夫变换图’);
    xlabel(’\theta’),ylabel(’\rho’);
    axis on , axis normal, hold on;
    P=houghpeaks(H,5,‘threshold’,ceil(0.3*max(H(?)));
    x=T(P(:,2));y=R(P(:,1));
    plot(x,y,‘s’,‘color’,‘white’);
    lines=houghlines(BW,T,R,P,‘FillGap’,5,‘MinLength’,7);
    subplot(2,2,4);,imshow(rotI);
    title(‘霍夫变换图像检测’);
    axis([50,250,50,200]);
    grid on;
    axis on;
    hold on;
    max_len=0;
    for k=1:length(lines)
    xy=[lines(k).point1;lines(k).point2];
    plot(xy(:,1),xy(:,2),‘LineWidth’,2,‘Color’,‘green’);
    plot(xy(1,1),xy(1,2),‘x’,‘LineWidth’,2,‘Color’,‘yellow’);
    plot(xy(2,1),xy(2,2),‘x’,‘LineWidth’,2,‘Color’,‘red’);
    len=norm(lines(k).point1-lines(k).point2);
    if(len>max_len)
    max_len=len;
    xy_long=xy;
    end
    end
    plot(xy_long(:,1),xy_long(:,2),‘LineWidth’,2,‘Color’,‘cyan’);

    13.直方图阈值法
    用MATLAB实现直方图阈值法:
    I=imread(‘xian.bmp’);
    I1=rgb2gray(I);
    figure;
    subplot(2,2,1);
    imshow(I1);
    title(‘灰度图像’)
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    [m,n]=size(I1); %测量图像尺寸参数
    GP=zeros(1,256); %预创建存放灰度出现概率的向量
    for k=0:255
    GP(k+1)=length(find(I1==k))/(m*n); %计算每级灰度出现的概率,将其存入GP中相应位置
    end
    subplot(2,2,2),bar(0:255,GP,‘g’) %绘制直方图
    title(‘灰度直方图’)
    xlabel(‘灰度值’)
    ylabel(‘出现概率’)
    I2=im2bw(I,150/255);
    subplot(2,2,3),imshow(I2);
    title(‘阈值150的分割图像’)
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    I3=im2bw(I,200/255); %
    subplot(2,2,4),imshow(I3);
    title(‘阈值200的分割图像’)
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系

    1. 自动阈值法:Otsu法
      用MATLAB实现Otsu算法:
      clc
      clear all
      I=imread(‘xian.bmp’);
      subplot(1,2,1),imshow(I);
      title(‘原始图像’)
      axis([50,250,50,200]);
      grid on; %显示网格线
      axis on; %显示坐标系
      level=graythresh(I); %确定灰度阈值
      BW=im2bw(I,level);
      subplot(1,2,2),imshow(BW);
      title(‘Otsu法阈值分割图像’)
      axis([50,250,50,200]);
      grid on; %显示网格线
      axis on; %显示坐标系

    15.膨胀操作
    I=imread(‘xian.bmp’); %载入图像
    I1=rgb2gray(I);
    subplot(1,2,1);
    imshow(I1);
    title(‘灰度图像’)
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    se=strel(‘disk’,1); %生成圆形结构元素
    I2=imdilate(I1,se); %用生成的结构元素对图像进行膨胀
    subplot(1,2,2);
    imshow(I2);
    title(‘膨胀后图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系

    16.腐蚀操作
    MATLAB实现腐蚀操作
    I=imread(‘xian.bmp’); %载入图像
    I1=rgb2gray(I);
    subplot(1,2,1);
    imshow(I1);
    title(‘灰度图像’)
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    se=strel(‘disk’,1); %生成圆形结构元素
    I2=imerode(I1,se); %用生成的结构元素对图像进行腐蚀
    subplot(1,2,2);
    imshow(I2);
    title(‘腐蚀后图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系

    17.开启和闭合操作
    用MATLAB实现开启和闭合操作
    I=imread(‘xian.bmp’); %载入图像
    subplot(2,2,1),imshow(I);
    title(‘原始图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系
    I1=rgb2gray(I);
    subplot(2,2,2),imshow(I1);
    title(‘灰度图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系
    se=strel(‘disk’,1); %采用半径为1的圆作为结构元素
    I2=imopen(I1,se); %开启操作
    I3=imclose(I1,se); %闭合操作
    subplot(2,2,3),imshow(I2);
    title(‘开启运算后图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系
    subplot(2,2,4),imshow(I3);
    title(‘闭合运算后图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系

    18.开启和闭合组合操作
    I=imread(‘xian.bmp’); %载入图像
    subplot(3,2,1),imshow(I);
    title(‘原始图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系
    I1=rgb2gray(I);
    subplot(3,2,2),imshow(I1);
    title(‘灰度图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系
    se=strel(‘disk’,1);
    I2=imopen(I1,se); %开启操作
    I3=imclose(I1,se); %闭合操作
    subplot(3,2,3),imshow(I2);
    title(‘开启运算后图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系
    subplot(3,2,4),imshow(I3);
    title(‘闭合运算后图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系
    se=strel(‘disk’,1);
    I4=imopen(I1,se);
    I5=imclose(I4,se);
    subplot(3,2,5),imshow(I5); %开—闭运算图像
    title(‘开—闭运算图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系
    I6=imclose(I1,se);
    I7=imopen(I6,se);
    subplot(3,2,6),imshow(I7); %闭—开运算图像
    title(‘闭—开运算图像’);
    axis([50,250,50,200]);
    axis on; %显示坐标系

    19.形态学边界提取
    利用MATLAB实现如下:
    I=imread(‘xian.bmp’); %载入图像
    subplot(1,3,1),imshow(I);
    title(‘原始图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    I1=im2bw(I);
    subplot(1,3,2),imshow(I1);
    title(‘二值化图像’);
    axis([50,250,50,200]);
    grid on; %显示网格线
    axis on; %显示坐标系
    I2=bwperim(I1); %获取区域的周长
    subplot(1,3,3),imshow(I2);
    title(‘边界周长的二值图像’);
    axis([50,250,50,200]);
    grid on;
    axis on;

    20.形态学骨架提取
    利用MATLAB实现如下:
    I=imread(‘xian.bmp’);
    subplot(2,2,1),imshow(I);
    title(‘原始图像’);
    axis([50,250,50,200]);
    axis on;
    I1=im2bw(I);
    subplot(2,2,2),imshow(I1);
    title(‘二值图像’);
    axis([50,250,50,200]);
    axis on;
    I2=bwmorph(I1,‘skel’,1);
    subplot(2,2,3),imshow(I2);
    title(‘1次骨架提取’);
    axis([50,250,50,200]);
    axis on;
    I3=bwmorph(I1,‘skel’,2);
    subplot(2,2,4),imshow(I3);
    title(‘2次骨架提取’);
    axis([50,250,50,200]);
    axis on;

    21.直接提取四个顶点坐标
    I = imread(‘xian.bmp’);
    I = I(:,:,1);
    BW=im2bw(I);
    figure
    imshow(~BW)
    [x,y]=getpts

    展开全文
  • Matlab实现图像阈值分割

    万次阅读 多人点赞 2017-11-13 15:40:22
    使用matlab实现阈值分割,实现两种方法,一是人工选择阈值进行分割,而是自动选择阈值进行分割。... 根据直方图显示,此图像符合双峰分布的基本特征,峰谷大概在120左右,所以人工选择分割的阈值为120,在自动分割上采

    使用matlab实现阈值分割,实现两种方法,一是人工选择阈值进行分割,而是自动选择阈值进行分割。

    操作步骤
    1、 打开Matlab内容自带的coins.png图像。
    2、 观察它的直方图。
    3、 人工选定一个阈值,并进行分割。
    4、 使用自动化阈值选定方法,进行分割。

    根据直方图显示,此图像符合双峰分布的基本特征,峰谷大概在120左右,所以人工选择分割的阈值为120,在自动分割上采用Otsu的方法进行自动的图像阈值分割。

    clc,clear
    I=imread('coins.png');
    imshow(I);
    %输出直方图
    figure;imhist(I);
    %人工选定阈值进行分割,选择阈值为120
    [width,height]=size(I);
    T1=120;
    for i=1:width
        for j=1:height
            if(I(i,j)<T1)
                BW1(i,j)=0;
            else 
                BW1(i,j)=1;
            end
        end
    end
    figure;imshow(BW1),title('人工阈值进行分割');
    %自动选择阈值
    T2=graythresh(I);
    BW2=im2bw(I,T2);%Otus阈值进行分割
    figure;imshow(BW2),title('Otus阈值进行分割');
    
    

    这里写图片描述

    展开全文
  • 图像分割综述

    万次阅读 多人点赞 2019-07-09 22:03:48
    图像分割是计算机视觉研究中的一个经典难题,已经成为图像理解领域关注的一个热点,图像分割是图像分析的第一步,是计算机视觉的基础,是图像理解的重要组成部分,同时也是图像处理中最困难的问题之一。所谓图像分割...

    本文作者净浩泽,公众号:计算机视觉life,编辑成员

    图像分割是计算机视觉研究中的一个经典难题,已经成为图像理解领域关注的一个热点,图像分割是图像分析的第一步,是计算机视觉的基础,是图像理解的重要组成部分,同时也是图像处理中最困难的问题之一。所谓图像分割是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分成若干个互不相交的区域,使得这些特征在同一区域内表现出一致性或相似性,而在不同区域间表现出明显的不同。简单的说就是在一副图像中,把目标从背景中分离出来。对于灰度图像来说,区域内部的像素一般具有灰度相似性,而在区域的边界上一般具有灰度不连续性。 关于图像分割技术,由于问题本身的重要性和困难性,从20世纪70年代起图像分割问题就吸引了很多研究人员为之付出了巨大的努力。虽然到目前为止,还不存在一个通用的完美的图像分割的方法,但是对于图像分割的一般性规律则基本上已经达成的共识,已经产生了相当多的研究成果和方法。

    本文对于目前正在使用的各种图像分割方法进行了一定的归纳总结,由于笔者对于图像分割的了解也是初窥门径,所以难免会有一些错误,还望各位读者多多指正,共同学习进步。

    传统分割方法

    这一大部分我们将要介绍的是深度学习大火之前人们利用数字图像处理、拓扑学、数学等方面的只是来进行图像分割的方法。当然现在随着算力的增加以及深度学习的不断发展,一些传统的分割方法在效果上已经不能与基于深度学习的分割方法相比较了,但是有些天才的思想还是非常值得我们去学习的。
    1.基于阈值的分割方法
    阈值法的基本思想是基于图像的灰度特征来计算一个或多个灰度阈值,并将图像中每个像素的灰度值与阈值作比较,最后将像素根据比较结果分到合适的类别中。因此,该方法最为关键的一步就是按照某个准则函数来求解最佳灰度阈值。
    阈值法特别适用于目标和背景占据不同灰度级范围的图。
    图像若只有目标和背景两大类,那么只需要选取一个阈值进行分割,此方法成为单阈值分割;但是如果图像中有多个目标需要提取,单一阈值的分割就会出现作物,在这种情况下就需要选取多个阈值将每个目标分隔开,这种分割方法相应的成为多阈值分割。

    如图所示即为对数字的一种阈值分割方法。
    阀值分割方法的优缺点:

    • 计算简单,效率较高;
    • 只考虑像素点灰度值本身的特征,一般不考虑空间特征,因此对噪声比较敏感,鲁棒性不高。
      从前面的介绍里我们可以看出,阈值分割方法的最关键就在于阈值的选择。若将智能遗传算法应用在阀值筛选上,选取能最优分割图像的阀值,这可能是基于阀值分割的图像分割法的发展趋势。
      2.基于区域的图像分割方法
      基于区域的分割方法是以直接寻找区域为基础的分割技术,基于区域提取方法有两种基本形式:一种是区域生长,从单个像素出发,逐步合并以形成所需要的分割区域;另一种是从全局出发,逐步切割至所需的分割区域。
      区域生长
      区域生长是从一组代表不同生长区域的种子像素开始,接下来将种子像素邻域里符合条件的像素合并到种子像素所代表的生长区域中,并将新添加的像素作为新的种子像素继续合并过程,知道找不到符合条件的新像素为止(小编研一第一学期的机器学习期末考试就是手写该算法 T.T),该方法的关键是选择合适的初始种子像素以及合理的生长准则。
      区域生长算法需要解决的三个问题:
      (1)选择或确定一组能正确代表所需区域的种子像素;
      (2)确定在生长过程中能将相邻像素包括进来的准则;
      (3)指定让生长过程停止的条件或规则。
      区域分裂合并
      区域生长是从某个或者某些像素点出发,最终得到整个区域,进而实现目标的提取。而分裂合并可以说是区域生长的逆过程,从整幅图像出发,不断的分裂得到各个子区域,然后再把前景区域合并,得到需要分割的前景目标,进而实现目标的提取。其实如果理解了上面的区域生长算法这个区域分裂合并算法就比较好理解啦。
      四叉树分解法就是一种典型的区域分裂合并法,基本算法如下:
      (1)对于任一区域,如果H(Ri)=FALSE就将其分裂成不重叠的四等分;
      (2)对相邻的两个区域Ri和Rj,它们也可以大小不同(即不在同一层),如果条件H(RiURj)=TURE满足,就将它们合并起来;
      (3)如果进一步的分裂或合并都不可能,则结束。
      其中R代表整个正方形图像区域,P代表逻辑词。
      区域分裂合并算法优缺点:
      (1)对复杂图像分割效果好;
      (2)算法复杂,计算量大;
      (3)分裂有可能破怪区域的边界。
      在实际应用当中通常将区域生长算法和区域分裂合并算法结合使用,该类算法对某些复杂物体定义的复杂场景的分割或者对某些自然景物的分割等类似先验知识不足的图像分割效果较为理想。
      分水岭算法
      分水岭算法是一个非常好理解的算法,它根据分水岭的构成来考虑图像的分割,现实中我们可以想象成有山和湖的景象,那么一定是如下图的,水绕山山围水的景象。
      分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形成分水岭。分水岭的概念和形成可以通过模拟浸入过程来说明。在每一个局部极小值表面,刺穿一个小孔,然后把整个模型慢慢浸入水中,随着浸入的加深,每一个局部极小值的影响域慢慢向外扩展,在两个集水盆汇合处构筑大坝,即形成分水岭。
      分水岭对微弱边缘具有良好的响应,图像中的噪声、物体表面细微的灰度变化都有可能产生过度分割的现象,但是这也同时能够保证得到封闭连续边缘。同时,分水岭算法得到的封闭的集水盆也为分析图像的区域特征提供了可能。

    3.基于边缘检测的分割方法

    基于边缘检测的图像分割算法试图通过检测包含不同区域的边缘来解决分割问题。它可以说是人们最先想到也是研究最多的方法之一。通常不同区域的边界上像素的灰度值变化比较剧烈,如果将图片从空间域通过傅里叶变换到频率域,边缘就对应着高频部分,这是一种非常简单的边缘检测算法。
    边缘检测技术通常可以按照处理的技术分为串行边缘检测和并行边缘检测。串行边缘检测是要想确定当前像素点是否属于检测边缘上的一点,取决于先前像素的验证结果。并行边缘检测是一个像素点是否属于检测边缘高尚的一点取决于当前正在检测的像素点以及与该像素点的一些临近像素点。
    最简单的边缘检测方法是并行微分算子法,它利用相邻区域的像素值不连续的性质,采用一阶或者二阶导数来检测边缘点。近年来还提出了基于曲面拟合的方法、基于边界曲线拟合的方法、基于反应-扩散方程的方法、串行边界查找、基于变形模型的方法。

    边缘检测的优缺点:
    (1)边缘定位准确;
    (2)速度快;
    (3)不能保证边缘的连续性和封闭性;
    (4)在高细节区域存在大量的碎边缘,难以形成一个大区域,但是又不宜将高细节区域分成小碎片;
    由于上述的(3)(4)两个难点,边缘检测只能产生边缘点,而非完整意义上的图像分割过程。这也就是说,在边缘点信息获取到之后还需要后续的处理或者其他相关算法相结合才能完成分割任务。
    在以后的研究当中,用于提取初始边缘点的自适应阈值选取、用于图像的层次分割的更大区域的选取以及如何确认重要边缘以去除假边缘将变得非常重要。

    结合特定工具的图像分割算法

    基于小波分析和小波变换的图像分割方法

    小波变换是近年来得到的广泛应用的数学工具,也是现在数字图像处理必学部分,它在时间域和频率域上都有量高的局部化性质,能将时域和频域统一于一体来研究信号。而且小波变换具有多尺度特性,能够在不同尺度上对信号进行分析,因此在图像分割方面的得到了应用,
    二进小波变换具有检测二元函数的局部突变能力,因此可作为图像边缘检测工具。图像的边缘出现在图像局部灰度不连续处,对应于二进小波变换的模极大值点。通过检测小波变换模极大值点可以确定图像的边缘小波变换位于各个尺度上,而每个尺度上的小波变换都能提供一定的边缘信息,因此可进行多尺度边缘检测来得到比较理想的图像边缘。

    上图左图是传统的阈值分割方法,右边的图像就是利用小波变换的图像分割。可以看出右图分割得到的边缘更加准确和清晰
    另外,将小波和其他方法结合起来处理图像分割的问题也得到了广泛研究,比如一种局部自适应阈值法就是将Hilbert图像扫描和小波相结合,从而获得了连续光滑的阈值曲线。

    基于遗传算法的图像分割

    ​ 遗传算法(Genetic Algorithms,简称GA)是1973年由美国教授Holland提出的,是一种借鉴生物界自然选择和自然遗传机制的随机化搜索算法。是仿生学在数学领域的应用。其基本思想是,模拟由一些基因串控制的生物群体的进化过程,把该过程的原理应用到搜索算法中,以提高寻优的速度和质量。此算法的搜索过程不直接作用在变量上,而是在参数集进行了编码的个体,这使得遗传算法可直接对结构对象(图像)进行操作。整个搜索过程是从一组解迭代到另一组解,采用同时处理群体中多个个体的方法,降低了陷入局部最优解的可能性,并易于并行化。搜索过程采用概率的变迁规则来指导搜索方向,而不采用确定性搜索规则,而且对搜索空间没有任何特殊要求(如连通性、凸性等),只利用适应性信息,不需要导数等其他辅助信息,适应范围广。
    ​ 遗传算法擅长于全局搜索,但局部搜索能力不足,所以常把遗传算法和其他算法结合起来应用。将遗传算法运用到图像处理主要是考虑到遗传算法具有与问题领域无关且快速随机的搜索能力。其搜索从群体出发,具有潜在的并行性,可以进行多个个体的同时比较,能有效的加快图像处理的速度。但是遗传算法也有其缺点:搜索所使用的评价函数的设计、初始种群的选择有一定的依赖性等。要是能够结合一些启发算法进行改进且遗传算法的并行机制的潜力得到充分的利用,这是当前遗传算法在图像处理中的一个研究热点。

    基于主动轮廓模型的分割方法

    ​ 主动轮廓模型(active contours)是图像分割的一种重要方法,具有统一的开放式的描述形式,为图像分割技术的研究和创新提供了理想的框架。在实现主动轮廓模型时,可以灵活的选择约束力、初始轮廓和作用域等,以得到更佳的分割效果,所以主动轮廓模型方法受到越来越多的关注。
    ​ 该方法是在给定图像中利用曲线演化来检测目标的一类方法,基于此可以得到精确的边缘信息。其基本思想是,先定义初始曲线C,然后根据图像数据得到能量函数,通过最小化能量函数来引发曲线变化,使其向目标边缘逐渐逼近,最终找到目标边缘。这种动态逼近方法所求得的边缘曲线具有封闭、光滑等优点。

    ​ 传统的主动轮廓模型大致分为参数主动轮廓模型和几何主动轮廓模型。参数主动轮廓模型将曲线或曲面的形变以参数化形式表达,Kass等人提出了经典的参数活动轮廓模型即“Snake”模型,其中Snake定义为能量极小化的样条曲线,它在来自曲线自身的内力和来自图像数据的外力的共同作用下移动到感兴趣的边缘,内力用于约束曲线形状,而外力则引导曲线到特征此边缘。参数主动轮廓模型的特点是将初始曲线置于目标区域附近,无需人为设定曲线的的演化是收缩或膨胀,其优点是能够与模型直接进行交互,且模型表达紧凑,实现速度快;其缺点是难以处理模型拓扑结构的变化。比如曲线的合并或分裂等。而使用水平集(level set)的几何活动轮廓方法恰好解决了这一问题。

    基于深度学习的分割

    1.基于特征编码(feature encoder based)

    在特征提取领域中VGGnet和ResNet是两个非常有统治力的方法,接下来的一些篇幅会对这两个方法进行简短的介绍

    a.VGGNet

    ​ 由牛津大学计算机视觉组合和Google DeepMind公司研究员一起研发的深度卷积神经网络。它探索了卷积神经网络的深度和其性能之间的关系,通过反复的堆叠33的小型卷积核和22的最大池化层,成功的构建了16~19层深的卷积神经网络。VGGNet获得了ILSVRC 2014年比赛的亚军和定位项目的冠军,在top5上的错误率为7.5%。目前为止,VGGNet依然被用来提取图像的特征。

    ​ VGGNet的优缺点

    1. 由于参数量主要集中在最后的三个FC当中,所以网络加深并不会带来参数爆炸的问题;
    2. 多个小核卷积层的感受野等同于一个大核卷积层(三个3x3等同于一个7x7)但是参数量远少于大核卷积层而且非线性操作也多于后者,使得其学习能力较强
    3. VGG由于层数多而且最后的三个全连接层参数众多,导致其占用了更多的内存(140M)
    b.ResNet

    ​ 随着深度学习的应用,各种深度学习模型随之出现,虽然在每年都会出现性能更好的新模型,但是对于前人工作的提升却不是那么明显,其中有重要问题就是深度学习网络在堆叠到一定深度的时候会出现梯度消失的现象,导致误差升高效果变差,后向传播时无法将梯度反馈到前面的网络层,使得前方的网络层的参数难以更新,训练效果变差。这个时候ResNet恰好站出来,成为深度学习发展历程中一个重要的转折点。
    ​ ResNet是由微软研究院的Kaiming He等四名华人提出,他们通过自己提出的ResNet Unit成功训练出来152层的神经网络并在ILSVRC2015比赛中斩获冠军。ResNet语义分割领域最受欢迎且最广泛运用的神经网络.ResNet的核心思想就是在网络中引入恒等映射,允许原始输入信息直接传到后面的层中,在学习过程中可以只学习上一个网络输出的残差(F(x)),因此ResNet又叫做残差网络。、

    使用到ResNet的分割模型:

    • Efficient Neural Network(ENet):该网络类似于ResNet的bottleNeck方法;
    • ResNet-38:该网络在训练or测试阶段增加并移除了一些层,是一种浅层网络,它的结构是ResNet+FCN;
    • full-resolution residual network(FRRN):FRRN网络具有和ResNet相同优越的训练特性,它由残差流和池化流两个处理流组成;
    • AdapNey:根据ResNet-50的网络进行改进,让原本的ResNet网络能够在更短的时间内学习到更多高分辨率的特征;
      ……
      ResNet的优缺点:
      1)引入了全新的网络结构(残差学习模块),形成了新的网络结构,可以使网络尽可能地加深;
      2)使得前馈/反馈传播算法能够顺利进行,结构更加简单;
      3)恒等映射地增加基本上不会降低网络的性能;
      4)建设性地解决了网络训练的越深,误差升高,梯度消失越明显的问题;
      5)由于ResNet搭建的层数众多,所以需要的训练时间也比平常网络要长。

    2.基于区域选择(regional proposal based)

    Regional proposal 在计算机视觉领域是一个非常常用的算法,尤其是在目标检测领域。其核心思想就是检测颜色空间和相似矩阵,根据这些来检测待检测的区域。然后根据检测结果可以进行分类预测。
    在语义分割领域,基于区域选择的几个算法主要是由前人的有关于目标检测的工作渐渐延伸到语义分割的领域的,接下来小编将逐步介绍其个中关系。

    Stage Ⅰ: R-CNN

    伯克利大学的Girshick教授等人共同提出了首个在目标检测方向应用的深度学习模型:Region-based Convolutional Neural Network(R-CNN)。该网络模型如下图所示,其主要流程为:先使用selective search算法提取2000个候选框,然后通过卷积网络对候选框进行串行的特征提取,再根据提取的特征使用SVM对候选框进行分类预测,最后使用回归方法对区域框进行修正。

    R-CNN的优缺点:

    • 是首个开创性地将深度神经网络应用到目标检测的算法;
    • 使用Bounding Box Regression对目标检测的框进行调整;
    • 由于进行特征提取时是串行,处理耗时过长;
    • Selective search算法在提取每一个region时需要2s的时间,浪费大量时间
    Stage Ⅱ:Fast R-CNN

    ​ 由于R-CNN的效率太低,2015年由Ross等学者提出了它的改进版本:Fast R-CNN。其网络结构图如下图所示(从提取特征开始,略掉了region的选择)Fast R-CNN在传统的R-CNN模型上有所改进的地方是它是直接使用一个神经网络对整个图像进行特征提取,就省去了串行提取特征的时间;接着使用一个RoI Pooling Layer在全图的特征图上摘取每一个RoI对应的特征,再通过FC进行分类和包围框的修正。

    Fast R-CNN的优缺点

    • 节省了串行提取特征的时间;
    • 除了selective search以外的其它所有模块都可以合在一起训练;
    • 最耗时间的selective search算法依然存在。
    Stage Ⅲ:Faster R-CNN

    2016年提出的Faster R-CNN可以说有了突破性的进展(虽然还是目标检测哈哈哈),因为它改变了它的前辈们最耗时最致命的部位:selective search算法。它将selective search算法替换成为RPN,使用RPN网络进行region的选取,将2s的时间降低到10ms,其网络结构如下图所示:

    Faster R-CNN优缺点:

    • 使用RPN替换了耗时的selective search算法,对整个网络结构有了突破性的优化;
    • Faster R-CNN中使用的RPN和selective search比起来虽然速度更快,但是精度和selective search相比稍有不及,如果更注重速度而不是精度的话完全可以只使用RPN;
    Stage Ⅳ:Mask R-CNN

    Mask R-CNN(终于到分割了!)是何恺明大神团队提出的一个基于Faster R-CNN模型的一种新型的分割模型,此论文斩获ICCV 2017的最佳论文,在Mask R-CNN的工作中,它主要完成了三件事情:目标检测,目标分类,像素级分割。
    恺明大神是在Faster R-CNN的结构基础上加上了Mask预测分支,并且改良了ROI Pooling,提出了ROI Align。其网络结构真容就如下图所示啦:

    Mask R-CNN的优缺点:

    • 引入了预测用的Mask-Head,以像素到像素的方式来预测分割掩膜,并且效果很好;
    • 用ROI Align替代了ROI Pooling,去除了RoI Pooling的粗量化,使得提取的特征与输入良好对齐;
    • 分类框与预测掩膜共享评价函数,虽然大多数时间影响不大,但是有的时候会对分割结果有所干扰。
    Stage Ⅴ:Mask Scoring R-CNN

    最后要提出的是2019年CVPR的oral,来自华中科技大学的研究生黄钊金同学提出的
    MS R-CNN,这篇文章的提出主要是对上文所说的Mask R-CNN的一点点缺点进行了修正。他的网络结构也是在Mask R-CNN的网络基础上做了一点小小的改进,添加了Mask-IoU。
    黄同学在文章中提到:恺明大神的Mask R-CNN已经很好啦!但是有个小毛病,就是评价函数只对目标检测的候选框进行打分,而不是分割模板(就是上文提到的优缺点中最后一点),所以会出现分割模板效果很差但是打分很高的情况。所以黄同学增加了对模板进行打分的MaskIoU Head,并且最终的分割结果在COCO数据集上超越了恺明大神,下面就是MS R-CNN的网络结构啦~

    MS R-CNN的优缺点:

    • 优化了Mask R-CNN中的信息传播,提高了生成预测模板的质量;
    • 未经大批量训练的情况下,就拿下了COCO 2017挑战赛实例分割任务冠军;
    • 要说缺点的话。。应该就是整个网络有些庞大,一方面需要ResNet当作主干网络,另一方面需要其它各种Head共同承担各种任务。

    3.基于RNN的图像分割

    Recurrent neural networks(RNNs)除了在手写和语音识别上表现出色外,在解决计算机视觉的任务上也表现不俗,在本篇文章中我们就将要介绍RNN在2D图像处理上的一些应用,其中也包括介绍使用到它的结构或者思想的一些模型。
    RNN是由Long-Short-Term Memory(LSTM)块组成的网络,RNN来自序列数据的长期学习的能力以及随着序列保存记忆的能力使其在许多计算机视觉的任务中游刃有余,其中也包括语义分割以及数据标注的任务。接下来的部分我们将介绍几个使用到RNN结构的用于分割的网络结构模型:

    1.ReSeg模型

    ReSeg可能不被许多人所熟知,在百度上搜索出的相关说明与解析也不多,但是这是一个很有效的语义分割方法。众所周知,FCN可谓是图像分割领域的开山作,而RegNet的作者则在自己的文章中大胆的提出了FCN的不足:没有考虑到局部或者全局的上下文依赖关系,而在语义分割中这种依赖关系是非常有用的。所以在ReSeg中作者使用RNN去检索上下文信息,以此作为分割的一部分依据。

    该结构的核心就是Recurrent Layer,它由多个RNN组合在一起,捕获输入数据的局部和全局空间结构。
    优缺点:

    • 充分考虑了上下文信息关系;
    • 使用了中值频率平衡,它通过类的中位数(在训练集上计算)和每个类的频率之间的比值来重新加权类的预测。这就增加了低频率类的分数,这是一个更有噪声的分割掩码的代价,因为被低估的类的概率被高估了,并且可能导致在输出分割掩码中错误分类的像素增加。
    2.MDRNNs(Multi-Dimensional Recurrent Neural Networks)模型

    传统的RNN在一维序列学习问题上有着很好的表现,比如演讲(speech)和在线手写识别。但是 在多为问题中应用却并不到位。MDRNNs在一定程度上将RNN拓展到多维空间领域,使之在图像处理、视频处理等领域上也能有所表现。
    该论文的基本思想是:将单个递归连接替换为多个递归连接,相应可以在一定程度上解决时间随数据样本的增加呈指数增长的问题。以下就是该论文提出的两个前向反馈和反向反馈的算法。

    4.基于上采样/反卷积的分割方法

    卷积神经网络在进行采样的时候会丢失部分细节信息,这样的目的是得到更具特征的价值。但是这个过程是不可逆的,有的时候会导致后面进行操作的时候图像的分辨率太低,出现细节丢失等问题。因此我们通过上采样在一定程度上可以不全一些丢失的信息,从而得到更加准确的分割边界。
    接下来介绍几个非常著名的分割模型:

    a.FCN(Fully Convolutional Network)

    是的!讲来讲去终于讲到这位大佬了,FCN!在图像分割领域已然成为一个业界标杆,大多数的分割方法多多少少都会利用到FCN或者其中的一部分,比如前面我们讲过的Mask R-CNN。
    在FCN当中的反卷积-升采样结构中,图片会先进性上采样(扩大像素);再进行卷积——通过学习获得权值。FCN的网络结构如下图所示:

    当然最后我们还是需要分析一下FCN,不能无脑吹啦~
    优缺点:

    • FCN对图像进行了像素级的分类,从而解决了语义级别的图像分割问题;
    • FCN可以接受任意尺寸的输入图像,可以保留下原始输入图像中的空间信息;
    • 得到的结果由于上采样的原因比较模糊和平滑,对图像中的细节不敏感;
    • 对各个像素分别进行分类,没有充分考虑像素与像素的关系,缺乏空间一致性。
    2.SetNet

    SegNet是剑桥提出的旨在解决自动驾驶或者智能机器人的图像语义分割深度网络,SegNet基于FCN,与FCN的思路十分相似,只是其编码-解码器和FCN的稍有不同,其解码器中使用去池化对特征图进行上采样,并在分各种保持高频细节的完整性;而编码器不使用全连接层,因此是拥有较少参数的轻量级网络:

    图像分割是计算机视觉研究中的一个经典难题,已经成为图像理解领域关注的一个热点,图像分割是图像分析的第一步,是计算机视觉的基础,是图像理解的重要组成部分,同时也是图像处理中最困难的问题之一。所谓图像分割是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分成若干个互不相交的区域,使得这些特征在同一区域内表现出一致性或相似性,而在不同区域间表现出明显的不同。简单的说就是在一副图像中,把目标从背景中分离出来。对于灰度图像来说,区域内部的像素一般具有灰度相似性,而在区域的边界上一般具有灰度不连续性。 关于图像分割技术,由于问题本身的重要性和困难性,从20世纪70年代起图像分割问题就吸引了很多研究人员为之付出了巨大的努力。虽然到目前为止,还不存在一个通用的完美的图像分割的方法,但是对于图像分割的一般性规律则基本上已经达成的共识,已经产生了相当多的研究成果和方法。

    本文对于目前正在使用的各种图像分割方法进行了一定的归纳总结,由于笔者对于图像分割的了解也是初窥门径,所以难免会有一些错误,还望各位读者多多指正,共同学习进步。

    SetNet的优缺点:

    • 保存了高频部分的完整性;
    • 网络不笨重,参数少,较为轻便;
    • 对于分类的边界位置置信度较低;
    • 对于难以分辨的类别,例如人与自行车,两者如果有相互重叠,不确定性会增加。
      以上两种网络结构就是基于反卷积/上采样的分割方法,当然其中最最最重要的就是FCN了,哪怕是后面大名鼎鼎的SegNet也是基于FCN架构的,而且FCN可谓是语义分割领域中开创级别的网络结构,所以虽然这个部分虽然只有两个网络结构,但是这两位可都是重量级嘉宾,希望各位能够深刻理解~

    5.基于提高特征分辨率的分割方法

    在这一个模块中我们主要给大家介绍一下基于提升特征分辨率的图像分割的方法。换一种说法其实可以说是恢复在深度卷积神经网络中下降的分辨率,从而获取更多的上下文信息。这一系列我将给大家介绍的是Google提出的DeepLab 。
    DeepLab是结合了深度卷积神经网络和概率图模型的方法,应用在语义分割的任务上,目的是做逐像素分类,其先进性体现在DenseCRFs(概率图模型)和DCNN的结合。是将每个像素视为CRF节点,利用远程依赖关系并使用CRF推理直接优化DCNN的损失函数。
    在图像分割领域,FCN的一个众所周知的操作就是平滑以后再填充,就是先进行卷积再进行pooling,这样在降低图像尺寸的同时增大感受野,但是在先减小图片尺寸(卷积)再增大尺寸(上采样)的过程中一定有一些信息损失掉了,所以这里就有可以提高的空间。
    接下来我要介绍的是DeepLab网络的一大亮点:Dilated/Atrous Convolution,它使用的采样方式是带有空洞的采样。在VGG16中使用不同采样率的空洞卷积,可以明确控制网络的感受野。

    图a对应3x3的1-dilated conv,它和普通的卷积操作是相同的;图b对应3x3的2-dilated conv,事迹卷积核的尺寸还是3x3(红点),但是空洞为1,其感受野能够达到7x7;图c对应3x3的4-dilated conv,其感受野已经达到了15x15.写到这里相信大家已经明白,在使用空洞卷积的情况下,加大了感受野,使每个卷积输出都包含了较大范围的信息。
    这样就解决了DCNN的几个关于分辨率的问题:
    1)内部数据结构丢失;空间曾计划信息丢失;
    2)小物体信息无法重建;
    当然空洞卷积也存在一定的问题,它的问题主要体现在以下两方面:
    1)网格效应
    加入我们仅仅多次叠加dilation rate 2的 3x3 的卷积核则会出现以下问题

    我们发现卷积核并不连续,也就是说并不是所有的像素都用来计算了,这样会丧失信息的连续性;
    2)小物体信息处理不当
    我们从空洞卷积的设计背景来看可以推测出它是设计来获取long-ranged information。然而空洞步频选取得大获取只有利于大物体得分割,而对于小物体的分割可能并没有好处。所以如何处理好不同大小物体之间的关系也是设计好空洞卷积网络的关键。

    6.基于特征增强的分割方法

    基于特征增强的分割方法包括:提取多尺度特征或者从一系列嵌套的区域中提取特征。在图像分割的深度网络中,CNN经常应用在图像的小方块上,通常称为以每个像素为中心的固定大小的卷积核,通过观察其周围的小区域来标记每个像素的分类。在图像分割领域,能够覆盖到更大部分的上下文信息的深度网络通常在分割的结果上更加出色,当然这也伴随着更高的计算代价。多尺度特征提取的方法就由此引进。
    在这一模块中我先给大家介绍一个叫做SLIC,全称为simple linear iterative cluster的生成超像素的算法。
    首先我们要明确一个概念:啥是超像素?其实这个比较容易理解,就像上面说的“小方块”一样,我们平常处理图像的最小单位就是像素了,这就是像素级(pixel-level);而把像素级的图像划分成为区域级(district-level)的图像,把区域当成是最基本的处理单元,这就是超像素啦。
    算法大致思想是这样的,将图像从RGB颜色空间转换到CIE-Lab颜色空间,对应每个像素的(L,a,b)颜色值和(x,y)坐标组成一个5维向量V[l, a, b, x, y],两个像素的相似性即可由它们的向量距离来度量,距离越大,相似性越小。
    算法首先生成K个种子点,然后在每个种子点的周围空间里搜索距离该种子点最近的若干像素,将他们归为与该种子点一类,直到所有像素点都归类完毕。然后计算这K个超像素里所有像素点的平均向量值,重新得到K个聚类中心,然后再以这K个中心去搜索其周围与其最为相似的若干像素,所有像素都归类完后重新得到K个超像素,更新聚类中心,再次迭代,如此反复直到收敛。
    有点像聚类的K-Means算法,最终会得到K个超像素。
    Mostahabi等人提出的一种前向传播的分类方法叫做Zoom-Out就使用了SLIC的算法,它从多个不同的级别提取特征:局部级别:超像素本身;远距离级别:能够包好整个目标的区域;全局级别:整个场景。这样综合考虑多尺度的特征对于像素或者超像素的分类以及分割来说都是很有意义的。
    接下来的部分我将给大家介绍另一种完整的分割网络:PSPNet:Pyramid Scene Parsing Network
    论文提出在场景分割是,大多数的模型会使用FCN的架构,但是FCN在场景之间的关系和全局信息的处理能力存在问题,其典型问题有:1.上下文推断能力不强;2.标签之间的关系处理不好;3.模型可能会忽略小的东西。
    本文提出了一个具有层次全局优先级,包含不同子区域时间的不同尺度的信息,称之为金字塔池化模块。
    该模块融合了4种不同金字塔尺度的特征,第一行红色是最粗糙的特征–全局池化生成单个bin输出,后面三行是不同尺度的池化特征。为了保证全局特征的权重,如果金字塔共有N个级别,则在每个级别后使用1×1 1×11×1的卷积将对于级别通道降为原本的1/N。再通过双线性插值获得未池化前的大小,最终concat到一起。其结构如下图:

    最终结果就是,在融合不同尺度的feature后,达到了语义和细节的融合,模型的性能表现提升很大,作者在很多数据集上都做过训练,最终结果是在MS-COCO数据集上预训练过的效果最好。

    为了捕捉多尺度特征,高层特征包含了更多的语义和更少的位置信息。结合多分辨率图像和多尺度特征描述符的优点,在不丢失分辨率的情况下提取图像中的全局和局部信息,这样就能在一定程度上提升网络的性能。

    7.使用CRF/MRF的方法

    首先让我们熟悉熟悉到底啥是MRF的CRF的。
    MRF全称是Marcov Random Field,马尔可夫随机场,其实说起来笔者在刚读硕士的时候有一次就有同学在汇报中提到了隐马尔可夫、马尔可夫链啥的,当时还啥都不懂,小白一枚(现在是准小白hiahia),觉得马尔可夫这个名字贼帅,后来才慢慢了解什么马尔科夫链呀,马尔可夫随机场,并且在接触到图像分割了以后就对马尔科夫随机场有了更多的了解。
    MRF其实是一种基于统计的图像分割算法,马尔可夫模型是指一组事件的集合,在这个集合中,事件逐个发生,并且下一刻事件的发生只由当前发生的事件决定,而与再之前的状态没有关系。而马尔可夫随机场,就是具有马尔可夫模型特性的随机场,就是场中任何区域都只与其临近区域相关,与其他地方的区域无关,那么这些区域里元素(图像中可以是像素)的集合就是一个马尔可夫随机场。
    CRF的全称是Conditional Random Field,条件随机场其实是一种特殊的马尔可夫随机场,只不过是它是一种给定了一组输入随机变量X的条件下另一组输出随机变量Y的马尔可夫随机场,它的特点是埃及设输出随机变量构成马尔可夫随机场,可以看作是最大熵马尔可夫模型在标注问题上的推广。
    在图像分割领域,运用CRF比较出名的一个模型就是全连接条件随机场(DenseCRF),接下来我们将花费一些篇幅来简单介绍一下。
    CRF在运行中会有一个问题就是它只对相邻节点进行操作,这样会损失一些上下文信息,而全连接条件随机场是对所有节点进行操作,这样就能获取尽可能多的临近点信息,从而获得更加精准的分割结果。
    在Fully connected CRF中,吉布斯能量可以写作:

    我们重点关注二元部分:

    其中k(m)为高斯核,写作:

    该模型的一元势能包含了图像的形状,纹理,颜色和位置,二元势能使用了对比度敏感的的双核势能,CRF的二元势函数一般是描述像素点与像素点之间的关系,鼓励相似像素分配相同的标签,而相差较大的像素分配不同标签,而这个“距离”的定义与颜色值和实际相对距离有关,这样CRF能够使图像尽量在边界处分割。全连接CRF模型的不同就在于其二元势函数描述的是每一个像素与其他所有像素的关系,使用该模型在图像中的所有像素对上建立点对势能从而实现极大地细化和分割。
    在分割结果上我们可以看看如下的结果图:

    可以看到它在精细边缘的分割比平常的分割方法要出色得多,而且文章中使用了另一种优化算法,使得本来需要及其大量运算的全连接条件随机场也能在很短的时间里给出不错的分割结果。
    至于其优缺点,我觉得可以总结为以下几方面:

    • 在精细部位的分割非常优秀;
    • 充分考虑了像素点或者图片区域之间的上下文关系;
    • 在粗略的分割中可能会消耗不必要的算力;
    • 可以用来恢复细致的局部结构,但是相应的需要较高的代价。
      OK,那么本次的推送就到这里结束啦,本文的主要内容是对图像分割的算法进行一个简单的分类和介绍。综述对于各位想要深入研究的看官是非常非常重要的资源:大佬们经常看综述一方面可以了解算法的不足并在此基础上做出改进;萌新们可以通过阅读一篇好的综述入门某一个学科,比如今天的内容就是图像分割。
      谢谢各位朋友们的观看!

    推荐阅读

    如何从零开始系统化学习视觉SLAM?
    从零开始一起学习SLAM | 为什么要学SLAM?
    从零开始一起学习SLAM | 学习SLAM到底需要学什么?
    从零开始一起学习SLAM | SLAM有什么用?
    从零开始一起学习SLAM | C++新特性要不要学?
    从零开始一起学习SLAM | 为什么要用齐次坐标?
    从零开始一起学习SLAM | 三维空间刚体的旋转
    从零开始一起学习SLAM | 为啥需要李群与李代数?
    从零开始一起学习SLAM | 相机成像模型
    从零开始一起学习SLAM | 不推公式,如何真正理解对极约束?
    从零开始一起学习SLAM | 神奇的单应矩阵
    从零开始一起学习SLAM | 你好,点云
    从零开始一起学习SLAM | 给点云加个滤网
    从零开始一起学习SLAM | 点云平滑法线估计
    从零开始一起学习SLAM | 点云到网格的进化
    从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码
    从零开始一起学习SLAM | 掌握g2o顶点编程套路
    从零开始一起学习SLAM | 掌握g2o边的代码套路
    零基础小白,如何入门计算机视觉?
    SLAM领域牛人、牛实验室、牛研究成果梳理
    我用MATLAB撸了一个2D LiDAR SLAM
    可视化理解四元数,愿你不再掉头发
    最近一年语义SLAM有哪些代表性工作?
    视觉SLAM技术综述
    汇总 | VIO、激光SLAM相关论文分类集锦
    研究SLAM,对编程的要求有多高?
    2018年SLAM、三维视觉方向求职经验分享
    2018年SLAM、三维视觉方向求职经验分享
    深度学习遇到SLAM | 如何评价基于深度学习的DeepVO,VINet,VidLoc?
    视觉SLAM关键方法总结
    SLAM方向公众号、知乎、博客上有哪些大V可以关注?
    SLAM实验室
    SLAM方向国内有哪些优秀公司?
    SLAM面试常见问题
    SLAM相关领域数据集调研
    从零开始一起学习SALM-ICP原理及应用
    解放双手——相机与IMU外参的在线标定
    目标检测

    展开全文
  • 图像分割简介

    千次阅读 2019-09-17 16:34:45
    图像分割需要将图像中不同的像素点进行分类,与物体检测相比,图像分割更加细致,难度更大,之前我分析过FCN,它是利用机器学习的方法进行图像分割,但是图像分割还有其他不同的方法,这也是我在这篇博客里头要提到...
  • 图像分割方法

    千次阅读 2013-09-15 23:42:28
    今天看了几篇图像分割的综述,特进行总结 首先还是说下图像识别的三个境界吧,图像处理->图像分析->图像理解 清华大学章老师分的,他的三本书据说不错~得到了清华同学的强烈推荐,明天去图书馆借一下 图像分割:...
  • 遗传算法实现图像分割(MATLAB)

    千次阅读 热门讨论 2018-11-24 20:13:49
    本文是对于Omar Banimelhem and Yahya Ahmed Yahya 发表论文《Multi-Thresholding Image ...用遗传算法图像进行多阈值分割(Multi-Thresholding Image Segmentation Using Genetic Algorithm) 摘要:...
  • OpenCV—Python 分水岭算法图像分割

    千次阅读 2019-08-28 14:33:53
    文章目录一、前言二、cv2.distanceTransform(src, distanceType, maskSize)三、基于标记的分水岭分割功能四、示例代码 一、前言 分水岭算法是一种图像区域分割法,在分割的过程中,它会把...其他图像分割方法,如阈...
  • Matlab图像处理新手——图像分割和画框显示篇 **前言:**许多人说Matlab对未来的工作没什么用,就目前了解的情况而言并非如此。如:现版本已有matlab转化成C语音的功能;matlab与DSP(API协议技术)、FPGA、西门子...
  • 图像分割算法

    千次阅读 2014-05-16 09:30:11
    参考文献:《基于直方图统计模型的自适应多阈值图像分割算法的研究》-罗群艳-硕士学位论文-模式识别与智能系统-南京理工大学-2012 1. 图像分割算法分为:  1)基于阈值的图像分割方法:  2)基于...
  • 图像分割算法的优缺点比较

    万次阅读 多人点赞 2019-06-11 14:44:14
    数字图像处理常用的图像分割算法有: 基于阀值的分割方法。 基于边缘的分割方法。 基于区域的分割方法。 基于聚类分析的图像分割方法。 基于小波变换的分割方法。 基于数学形态学方法。 基于人工神经网络的方法。 ...
  • 题目: 基于MATLAB的图像分割算法研究 作者姓名 XXX 学号 指导教师 XX教授 学科专业 计算机科学与技术 所在学院 计算机学院 提交日期 引言 数字图像处理技术是一个跨学科的领域。随着计算机科学技术的不断发展...
  • 图像分割方法总结
  • 经典图像分割方法总结

    千次阅读 2019-04-26 09:09:21
    刚看到一个图像分割的视频,讲的很粗略,但对于了解这方面知识的基础,还是很有不错的。。 图像分割应用 分割的常用的三个数据集 传统的图像分割方法 深度学习做图像分割 算法一:全卷积网络(FNC) ...
  • 图像语义分割

    万次阅读 2016-09-15 17:28:17
    从特斯拉到计算机视觉之「图像语义分割」 关于图像语义分割的总结和感悟 FCNN: Fully Convolutional Networks for Semantic SegmentationDeeplab: Semantic Image Segmentation with Deep ...
  • 本篇文章主要讲解基于理论的图像分割方法,通过K-Means聚类算法实现图像分割或颜色分层处理。基础性文章,希望对你有所帮助。 1.K-Means原理 2.K-Means聚类分割灰度图像 3.K-Means聚类对比分割彩色图像
  • matlab图像分割

    万次阅读 2017-03-29 18:06:43
    (1)基于阈值的分割方法:在阈值分割中,最常用的分割方法是直方图阈值分割法。直方图阈值法必须假设每个峰值对应的...(2)基于边缘的分割方法:边缘检测广泛引用于灰度图像分割。它通过灰度的不连续性来确定图像中的边
  • 图像分割算法综述

    千次阅读 2019-07-02 20:07:25
    图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。现有的图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割...
  • 学习DIP第60天 转载请标明本文出处:... 更多图像处理机器学习内容请访问最新网站www.tony4ai.com 开篇废话 今天已经是第60篇博客了,这六十篇每一篇平均要两天左右,...
  • MeanShift图像分割算法

    2015-10-16 10:46:00
    MeanShift图像分割算法
  • 常见图像分割算法实现源代码

    热门讨论 2014-09-30 16:31:01
    常见图像分割算法实现源代码,对于在选择合适的分割算法,可以做分析对比,减少开发时间,包括边界分割,阈值分割,区域分割等
  • 图像分割算法总结

    万次阅读 2015-03-31 10:20:56
    图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。现有的图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于...
  • 分水岭图像分割算法

    千次阅读 2014-05-19 22:01:29
    基于形态学分水岭的分割 到现在为止,已经讨论了基于3种主要概念的分割方法:(a)间断的检测;(b)门限处理和(c)区域处理。每种方法各有优点(例如,全局门限处理的速度优势)和缺点(如,以灰度级的间断检测为基础的...
  • 如下:两块材料一样,颜色一样的布料,如何用算法分割开?,canny算法和一些一般梯度算法都不能的到好的结果。 ![图片说明](https://img-ask.csdn.net/upload/201507/19/1437296456_364543.jpg)
  • 代码实现:import matplotlib.pyplot as plt from scipy import ndimage as ndi from skimage import morphology,color,data,filters import cv2 # image =color.rgb2gray(data.camera()) image =cv2.imread('./...

空空如也

1 2 3 4 5 ... 20
收藏数 20,998
精华内容 8,399
关键字:

图像分割