精华内容
下载资源
问答
  • matlab分水岭算法

    千次阅读 2017-05-19 16:28:45
    matlab分水岭算法

    基于距离与基于梯度

    %%
    center1 = -10;
    center2 = -center1;
    dist = sqrt(2*(2*center1)^2);
    radius = dist/2 * 1.4;
    lims = [floor(center1-1.2*radius) ceil(center2+1.2*radius)];
    [x,y] = meshgrid(lims(1):lims(2));
    bw1 = sqrt((x-center1).^2 + (y-center1).^2) <= radius;
    bw2 = sqrt((x-center2).^2 + (y-center2).^2) <= radius;
    bw = bw1 | bw2;
    
    %% watershed based on dist
    close all
    D = bwdist(~bw);
    D = -D;
    D(~bw) = -Inf;
    figure
    imshow(D,[])
    L = watershed(D);
    figure
    imshow(L,[])
    res = L == 0;
    figure
    imshow( res, [] )
    %% watershed based on gradient
    [gx, gy] = gradient( double(bw) );
    gxy = sqrt( gx.^2 + gy.^2 );
    ff = watershed(gxy);
    figure
    imshow(ff,[])
    dd = ff == 0;
    figure
    imshow(dd)
    
    展开全文
  • MATLAB 分水岭算法

    2018-03-03 12:05:49
    MATLAB自己实现的分水岭算法,细节都是自己实现的,严格按照原本步骤实现,没有任何加速算法,带一张图片,可与MATLAB自带分水岭算法比较,看不出区别,中科大数字图像分析作业,自己做的,慎重下载
  • matlab 分水岭算法

    2015-12-30 10:52:48
    matlab 多个分水岭算法实现图像分割,注释详细
  • matlab分水岭算法.docx

    2021-03-19 21:14:17
    matlab分水岭算法的图像分割
  • 分水岭算法中会用到一个重要的概念——测地线距离。测地线距离(Geodesic Distance)测地线距离就是地球表面两点之间的最短路径(可执行路径)的距离,在图论中,Geodesic Distance 就是图中两节点的最短路径的距离,...

    2acacec64a31b396fd413ec52eeec0a9.png

    分水岭(Watershed)是基于地理形态的分析的图像分割算法,模仿地理结构(比如山川、沟壑,盆地)来实现对不同物体的分类。

    分水岭算法中会用到一个重要的概念——测地线距离。

    测地线距离(Geodesic Distance)

    测地线距离就是地球表面两点之间的最短路径(可执行路径)的距离,在图论中,Geodesic Distance 就是图中两节点的最短路径的距离,这与平时在几何空间通常用到的 Euclidean Distance(欧氏距离),即两点之间的最短距离有所区别。

    在下图中,两个黑点的 Euclidean Distance 是用虚线所表示的线段的长度

    ,而 Geodesic Distance 作为实际路径的最短距离,其距离应为沿途实线段距离之和的最小值,即

    d7f456b7a00319b1a082e6c380a8a6b9.png
    图1

    在三维曲面空间中两点间的测地距离就是两点间沿着三维曲面的表面走的最短路径。

    分水岭算法

    图像的灰度空间很像地球表面的整个地理结构,每个像素的灰度值代表高度。其中的灰度值较大的像素连成的线可以看做山脊,也就是分水岭。其中的水就是用于二值化的gray threshold level,二值化阈值可以理解为水平面,比水平面低的区域会被淹没,刚开始用水填充每个孤立的山谷(局部最小值)。

    当水平面上升到一定高度时,水就会溢出当前山谷,可以通过在分水岭上修大坝,从而避免两个山谷的水汇集,这样图像就被分成2个像素集,一个是被水淹没的山谷像素集,一个是分水岭线像素集。最终这些大坝形成的线就对整个图像进行了分区,实现对图像的分割。

    f5c5df638bc47948b3e35397a86bdf87.png
    图2

    在该算法中,空间上相邻并且灰度值相近的像素被划分为一个区域。

    分水岭算法的整个过程:

    1. 把梯度图像中的所有像素按照灰度值进行分类,并设定一个测地距离阈值。
    2. 找到灰度值最小的像素点(默认标记为灰度值最低点),让threshold从最小值开始增长,这些点为起始点。
    3. 水平面在增长的过程中,会碰到周围的邻域像素,测量这些像素到起始点(灰度值最低点)的测地距离,如果小于设定阈值,则将这些像素淹没,否则在这些像素上设置大坝,这样就对这些邻域像素进行了分类。

    4fcd2c7a3b2df4f254ef7e632b5df8f7.png
    图3

    4. 随着水平面越来越高,会设置更多更高的大坝,直到灰度值的最大值,所有区域都在分水岭线上相遇,这些大坝就对整个图像像素的进行了分区。

    整个过程可以查看下面这个动图:

    2b3e67849ae6e3b36d3382b12f551b71.gif
    图4

    用上面的算法对图像进行分水岭运算,由于噪声点或其它因素的干扰,可能会得到密密麻麻的小区域,即图像被分得太细(over-segmented,过度分割),这因为图像中有非常多的局部极小值点,每个点都会自成一个小区域。

    其中的解决方法:

    1. 对图像进行高斯平滑操作,抹除很多小的最小值,这些小分区就会合并。
    2. 不从最小值开始增长,可以将相对较高的灰度值像素作为起始点(需要用户手动标记),从标记处开始进行淹没,则很多小区域都会被合并为一个区域,这被称为基于图像标记(mark)的分水岭算法

    下面三个图分别是原图,分水岭过分割的图以及基于标记的分水岭算法得到的图:

    db8d7bea56b8e796b5fd24fb1eb32c5a.png
    图5

    其中标记的每个点就相当于分水岭中的注水点,从这些点开始注水使得水平面上升,但是如上图所示,图像中需要分割的区域太多了,手动标记太麻烦,我们可是使用距离转换的方法进行标记,OpenCV中就是使用的这种方法。

    OpenCV中分水岭算法

    在OpenCV中,我们需要给不同区域贴上不同的标签。用大于1的整数表示我们确定为前景或对象的区域,用1表示我们确定为背景或非对象的区域,最后用0表示我们无法确定的区域。然后应用分水岭算法,我们的标记图像将被更新,更新后的标记图像的边界像素值为-1。

    下面对相互接触的硬币应用距离变换和分水岭分割。

    5aad4bcf7bfdad80e5f519348d0a1783.png
    图6

    先使用 Otsu's 二值化对图像进行二值化。

    import 

    cdf17e086741aff9a99c1822b6962899.png
    图7

    先使用开运算去除图像中的细小白色噪点,然后通过腐蚀运算移除边界像素,得到的图像中的白色区域肯定是真实前景,即靠近硬币中心的区域(下面左边的图);膨胀运算使得一部分背景成为了物体到的边界,得到的图像中的黑色区域肯定是真实背景,即远离硬币的区域(下面中间的图)。

    剩下的区域(硬币的边界附近)还不能确定是前景还是背景。可通过膨胀图减去腐蚀图得到,下图中的白色部分为不确定区域(下面右边的图)。

    # noise removal
    

    d00cc0b65959be7277a709eac04023d6.png
    图8

    剩下的区域不确定是硬币还是背景,这些区域通常在前景和背景接触的区域(或者两个不同硬币接触的区域),我们称之为边界。通过分水岭算法应该能找到确定的边界。

    由于硬币之间彼此接触,我们使用另一个确定前景的方法,就是带阈值的距离变换

    下面左边的图为得到的距离转换图像,其中每个像素的值为其到最近的背景像素(灰度值为0)的距离,可以看到硬币的中心像素值最大(中心离背景像素最远)。对其进行二值处理就得到了分离的前景图(下面中间的图),白色区域肯定是硬币区域,而且还相互分离,下面右边的图为之前的膨胀图减去中间这个表示前景的图。

    # Perform the distance transform algorithm
    

    82fce0235a64a5ca7360038f68b88e28.png
    图9

    现在我们可以确定哪些是硬币区域,哪些是背景区域。然后创建标记(marker,它是一个与原始图像大小相同的矩阵,int32数据类型),表示其中的每个区域。分水岭算法将标记的0的区域视为不确定区域,将标记为1的区域视为背景区域,将标记大于1的正整数表示我们想得到的前景。

    我们可以使用 cv2.connectedComponents() 来实现这个功能,它是用0标记图像的背景,用大于0的整数标记其他对象。所以我们需要对其进行加一,用1来标记图像的背景。

    cv2.connectedComponents() 将传入图像中的白色区域视为组件(前景)。

    # Marker labelling
    

    注意:得到的markers矩阵的元素类型为 int32,要使用 imshow() 进行显示,需要将其转换为 uint8 类型( markers=np.uint8(markers) )。

    我们对得到的markers进行显示:

    markers_copy 

    34054790a6e055f64792f6192bcdf4f0.png
    图10

    标记图像已经完成了,最后应用分水岭算法。然后标记图像将被修改,边界区域将被标记为-1。

    # 使用分水岭算法执行基于标记的图像分割,将图像中的对象与背景分离
    

    经过分水岭算法得到的新的标记图像和分割后的图像如下图所示:

    a4de26335bdf49f54892b9b46e217c8b.png
    图11

    任何两个相邻连接的组件不一定被分水岭边界(-1的像素)分开;例如在传递给 watershed 函数的初始标记图像中的物体相互接触。

    总结

    我们通过一个例子介绍了分水岭算法的整个过程,主要分为以下几步:

    1. 对图进行灰度化和二值化得到二值图像
    2. 通过膨胀得到确定的背景区域,通过距离转换得到确定的前景区域,剩余部分为不确定区域
    3. 对确定的前景图像进行连接组件处理,得到标记图像
    4. 根据标记图像对原图像应用分水岭算法,更新标记图像

    参考:

    OpenCV Watershed Algorithm

    IMAGE SEGMENTATION AND MATHEMATICAL MORPHOLOGY

    Classic Watershed

    基于标记的分水岭分割算法/OpenCV中距离变换

    剪刀手/分水岭分割法

    The Watershed Transform

    对扑克牌应用分水岭的例子


    如果觉得有用,点个赞吧(ง •̀_•́)ง。

    展开全文
  • 分水岭算法中会用到一个重要的概念——测地线距离。测地线距离(Geodesic Distance)测地线距离就是地球表面两点之间的最短路径(可执行路径)的距离,在图论中,Geodesic Distance 就是图中两节点的最短路径的距离,...

    分水岭(Watershed)是基于地理形态的分析的图像分割算法,模仿地理结构(比如山川、沟壑,盆地)来实现对不同物体的分类。

    分水岭算法中会用到一个重要的概念——测地线距离。

    测地线距离(Geodesic Distance)

    测地线距离就是地球表面两点之间的最短路径(可执行路径)的距离,在图论中,Geodesic Distance 就是图中两节点的最短路径的距离,这与平时在几何空间通常用到的 Euclidean Distance(欧氏距离),即两点之间的最短距离有所区别。

    在下图中,两个黑点的 Euclidean Distance 是用虚线所表示的线段的长度

    ,而 Geodesic Distance 作为实际路径的最短距离,其距离应为沿途实线段距离之和的最小值,即

    5243e49c3eac21e64974226f8ba8e943.png
    图1

    在三维曲面空间中两点间的测地距离就是两点间沿着三维曲面的表面走的最短路径。

    分水岭算法

    图像的灰度空间很像地球表面的整个地理结构,每个像素的灰度值代表高度。其中的灰度值较大的像素连成的线可以看做山脊,也就是分水岭。其中的水就是用于二值化的gray threshold level,二值化阈值可以理解为水平面,比水平面低的区域会被淹没,刚开始用水填充每个孤立的山谷(局部最小值)。

    当水平面上升到一定高度时,水就会溢出当前山谷,可以通过在分水岭上修大坝,从而避免两个山谷的水汇集,这样图像就被分成2个像素集,一个是被水淹没的山谷像素集,一个是分水岭线像素集。最终这些大坝形成的线就对整个图像进行了分区,实现对图像的分割。

    c18182669d74a1f8708bb100c8d9b59d.png
    图2

    在该算法中,空间上相邻并且灰度值相近的像素被划分为一个区域。

    分水岭算法的整个过程:

    1. 把梯度图像中的所有像素按照灰度值进行分类,并设定一个测地距离阈值。
    2. 找到灰度值最小的像素点(默认标记为灰度值最低点),让threshold从最小值开始增长,这些点为起始点。
    3. 水平面在增长的过程中,会碰到周围的邻域像素,测量这些像素到起始点(灰度值最低点)的测地距离,如果小于设定阈值,则将这些像素淹没,否则在这些像素上设置大坝,这样就对这些邻域像素进行了分类。

    fb5dd94e868d27b5c1c265ee04df96dd.png
    图3

    4. 随着水平面越来越高,会设置更多更高的大坝,直到灰度值的最大值,所有区域都在分水岭线上相遇,这些大坝就对整个图像像素的进行了分区。

    整个过程可以查看下面这个动图:

    02a829b00c8ab462d6cda59564d72419.png
    图4

    用上面的算法对图像进行分水岭运算,由于噪声点或其它因素的干扰,可能会得到密密麻麻的小区域,即图像被分得太细(over-segmented,过度分割),这因为图像中有非常多的局部极小值点,每个点都会自成一个小区域。

    其中的解决方法:

    1. 对图像进行高斯平滑操作,抹除很多小的最小值,这些小分区就会合并。
    2. 不从最小值开始增长,可以将相对较高的灰度值像素作为起始点(需要用户手动标记),从标记处开始进行淹没,则很多小区域都会被合并为一个区域,这被称为基于图像标记(mark)的分水岭算法

    下面三个图分别是原图,分水岭过分割的图以及基于标记的分水岭算法得到的图:

    a9a4ea1a3a9961193e658064c62638ca.png
    图5

    其中标记的每个点就相当于分水岭中的注水点,从这些点开始注水使得水平面上升,但是如上图所示,图像中需要分割的区域太多了,手动标记太麻烦,我们可是使用距离转换的方法进行标记,OpenCV中就是使用的这种方法。

    OpenCV中分水岭算法

    在OpenCV中,我们需要给不同区域贴上不同的标签。用大于1的整数表示我们确定为前景或对象的区域,用1表示我们确定为背景或非对象的区域,最后用0表示我们无法确定的区域。然后应用分水岭算法,我们的标记图像将被更新,更新后的标记图像的边界像素值为-1。

    下面对相互接触的硬币应用距离变换和分水岭分割。

    9369e657ce25de12bc739af722ca6af5.png
    图6

    先使用 Otsu's 二值化对图像进行二值化。

    import cv2
    import numpy as np
    
    img = cv2.imread('coins.png')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

    e17a2841bba7b49373d6857de2fe337a.png
    图7

    先使用开运算去除图像中的细小白色噪点,然后通过腐蚀运算移除边界像素,得到的图像中的白色区域肯定是真实前景,即靠近硬币中心的区域(下面左边的图);膨胀运算使得一部分背景成为了物体到的边界,得到的图像中的黑色区域肯定是真实背景,即远离硬币的区域(下面中间的图)。

    剩下的区域(硬币的边界附近)还不能确定是前景还是背景。可通过膨胀图减去腐蚀图得到,下图中的白色部分为不确定区域(下面右边的图)。

    # noise removal
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
    opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
    
    sure_bg = cv2.dilate(opening, kernel, iterations=2)  # sure background area
    sure_fg = cv2.erode(opening, kernel, iterations=2)  # sure foreground area
    unknown = cv2.subtract(sure_bg, sure_fg)  # unknown area

    99023cfbc8d6639919d9cf029ce4f6cb.png
    图8

    剩下的区域不确定是硬币还是背景,这些区域通常在前景和背景接触的区域(或者两个不同硬币接触的区域),我们称之为边界。通过分水岭算法应该能找到确定的边界。

    由于硬币之间彼此接触,我们使用另一个确定前景的方法,就是带阈值的距离变换

    下面左边的图为得到的距离转换图像,其中每个像素的值为其到最近的背景像素(灰度值为0)的距离,可以看到硬币的中心像素值最大(中心离背景像素最远)。对其进行二值处理就得到了分离的前景图(下面中间的图),白色区域肯定是硬币区域,而且还相互分离,下面右边的图为之前的膨胀图减去中间这个表示前景的图。

    # Perform the distance transform algorithm
    dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5)
    # Normalize the distance image for range = {0.0, 1.0}
    cv2.normalize(dist_transform, dist_transform, 0, 1.0, cv2.NORM_MINMAX)
    
    # Finding sure foreground area
    ret, sure_fg = cv2.threshold(dist_transform, 0.5*dist_transform.max(), 255, 0)
    
    # Finding unknown region
    sure_fg = np.uint8(sure_fg)
    unknown = cv2.subtract(sure_bg,sure_fg)

    827faf8c91e1becada5d9c0579a9a6be.png
    图9

    现在我们可以确定哪些是硬币区域,哪些是背景区域。然后创建标记(marker,它是一个与原始图像大小相同的矩阵,int32数据类型),表示其中的每个区域。分水岭算法将标记的0的区域视为不确定区域,将标记为1的区域视为背景区域,将标记大于1的正整数表示我们想得到的前景。

    我们可以使用 cv2.connectedComponents() 来实现这个功能,它是用0标记图像的背景,用大于0的整数标记其他对象。所以我们需要对其进行加一,用1来标记图像的背景。

    cv2.connectedComponents() 将传入图像中的白色区域视为组件(前景)。

    # Marker labelling
    ret, markers = cv2.connectedComponents(sure_fg)
    # Add one to all labels so that sure background is not 0, but 1
    markers = markers+1
    # Now, mark the region of unknown with zero
    markers[unknown==255] = 0

    注意:得到的markers矩阵的元素类型为 int32,要使用 imshow() 进行显示,需要将其转换为 uint8 类型( markers=np.uint8(markers) )。

    我们对得到的markers进行显示:

    markers_copy = markers.copy()
    markers_copy[markers==0] = 150  # 灰色表示背景
    markers_copy[markers==1] = 0    # 黑色表示背景
    markers_copy[markers>1] = 255   # 白色表示前景
    
    markers_copy = np.uint8(markers_copy)

    4c0ed83f6ec1bfe3344cb2c306275c39.png
    图10

    标记图像已经完成了,最后应用分水岭算法。然后标记图像将被修改,边界区域将被标记为-1。

    # 使用分水岭算法执行基于标记的图像分割,将图像中的对象与背景分离
    markers = cv2.watershed(img, markers)
    img[markers==-1] = [0,0,255]  # 将边界标记为红色

    经过分水岭算法得到的新的标记图像和分割后的图像如下图所示:

    5d34333d9826d1cb28d22b4eae1d43d4.png
    图11

    任何两个相邻连接的组件不一定被分水岭边界(-1的像素)分开;例如在传递给 watershed 函数的初始标记图像中的物体相互接触。

    总结

    我们通过一个例子介绍了分水岭算法的整个过程,主要分为以下几步:

    1. 对图进行灰度化和二值化得到二值图像
    2. 通过膨胀得到确定的背景区域,通过距离转换得到确定的前景区域,剩余部分为不确定区域
    3. 对确定的前景图像进行连接组件处理,得到标记图像
    4. 根据标记图像对原图像应用分水岭算法,更新标记图像

    参考:

    OpenCV Watershed Algorithm

    IMAGE SEGMENTATION AND MATHEMATICAL MORPHOLOGY

    Classic Watershed

    基于标记的分水岭分割算法/OpenCV中距离变换

    剪刀手/分水岭分割法

    The Watershed Transform

    对扑克牌应用分水岭的例子

    展开全文
  • 分水岭算法是一种图像区域分割法,分割的过程中将图片转化为灰度图,然后我会将灰度值看作是海拔,然后向较低点注水,这种基于地形学的解释,我们着重考虑三种点: 极小值点,该点对应一个盆地的最低点,当我们在...

    一、简介

    分水岭算法是一种图像区域分割法,分割的过程中将图片转化为灰度图,然后我会将灰度值看作是海拔,然后向较低点注水,这种基于地形学的解释,我们着重考虑三种点:
    在这里插入图片描述
    极小值点,该点对应一个盆地的最低点,当我们在盆地里滴一滴水的时候,由于重力作用,水最终会汇聚到该点。注意:可能存在一个最小值面,该平面内的都是极小值点。
    盆地的其它位置点,该位置滴的水滴会汇聚到局部最小点。
    盆地的边缘点,是该盆地和其它盆地交接点,在该点滴一滴水,会等概率的流向任何一个盆地。
    在这里插入图片描述
    明白上述三种点之后,我们开始往盆地的极小值点注水,然后随着注水的深入,每一个极小值点慢慢的向外扩展,然后知道两个盆地的水汇合,汇合处就是我们需要的分水岭。

    从下图可以直观理解一下,首先这三块区域都含有极小值点
    在这里插入图片描述
    然后逐渐填充就能获得分水岭(即分界线)
    在这里插入图片描述
    得到分界线就能完成图像分割:
    在这里插入图片描述

    二、源代码

    clear, close all;
    clc;
    %1.读取图像并求取图像的边界。
    
    rgb = imread('tree.jpeg');%读取原图像
    I = rgb2gray(rgb);%转化为灰度图像
    figure; subplot(121)%显示灰度图像
    imshow(I)
    text(732,501,'Image courtesy of Corel','FontSize',7,'HorizontalAlignment','right')
    hy = fspecial('sobel');%sobel算子,应用sobel算子锐化图像
    hx = hy';
    Iy = imfilter(double(I), hy, 'replicate');%滤波求y方向边缘
    Ix = imfilter(double(I), hx, 'replicate');%滤波求x方向边缘
    gradmag = sqrt(Ix.^2 + Iy.^2);%求摸
    subplot(122); imshow(gradmag,[]), %显示梯度
    title('Gradient magnitude (gradmag)')
    
    %2. 直接使用梯度模值进行分水岭算法:(往往会存在过的分割的情况,效果不好)
    
    L = watershed(gradmag);%直接应用分水岭算法
    Lrgb = label2rgb(L);%转化为彩色图像
    figure; imshow(Lrgb), %显示分割后的图像
    title('Watershed transform of gradient magnitude (Lrgb)')%过分割现象
    
    %3.分别对前景和背景进行标记:本例中使用形态学重建技术对前景对象进行标记,首先使用开操作,开操作之后可以去掉一些很小的目标。
    %开和闭这两种运算可以除去比结构元素小的特定图像细节,同时保证不产生全局几何失真。
    %开运算可以把比结构元素小的突刺滤掉,切断细长搭接而起到分离作用;
    %闭运算可以把比结构元素小的缺口或孔填充上,搭接短的间断而起到连接作用。
    se = strel('disk', 4);%圆形结构元素,STREL('disk',R,N),R is the specified radius, When N is greater than 0, the disk-shaped structuring
                           %element is approximated by a sequence of N
    Io = imopen(I, se);%形态学开操作
    figure; subplot(121)
    imshow(Io), %显示执行开操作后的图像
    title('Opening (Io)')
    Ie = imerode(I, se);%对图像进行腐蚀,基本参数:待处理的输入图像以及结构元素对象
    Iobr = imreconstruct(Ie, I);%形态学重建
    subplot(122); imshow(Iobr), %显示重建后的图像
    title('Opening-by-reconstruction (Iobr)')
    Ioc = imclose(Io, se);%形态学关操作,首先膨胀,然后腐蚀,两个操作使用同样的结构元素
    figure; subplot(121)
    imshow(Ioc), %显示关操作后的图像
    title('Opening-closing (Ioc)')
    Iobrd = imdilate(Iobr, se);%对图像进行膨胀,基本参数:待处理的输入图像和结构元素对象。
    Iobrcbr = imreconstruct(imcomplement(Iobrd), ...
        imcomplement(Iobr));%形态学重建
    Iobrcbr = imcomplement(Iobrcbr);%图像求反
    subplot(122); imshow(Iobrcbr), %显示重建求反后的图像,figure4
    title('Opening-closing by reconstruction (Iobrcbr)')
    %As you can see by comparing Iobrcbr with Ioc, 
    %reconstruction-based opening and closing are more 
    %effective than standard opening and closing at removing 
    %small blemishes without affecting the overall 
    %shapes of the objects. Calculate the regional maxima 
    %of Iobrcbr to obtain good foreground markers. 
    fgm = imregionalmax(Iobrcbr);%局部极大值
    figure; imshow(fgm), %显示重建后局部极大值图像,figure5
    title('Regional maxima of opening-closing by reconstruction (fgm)')
    I2 = I; %前景标记图与原图叠加
    I2(fgm) = 255;%局部极大值处像素值设为255
    figure; imshow(I2), %在原图上显示极大值区域,figure6
    title('Regional maxima superimposed on original image (I2)')
    se2 = strel(ones(3,3));%结构元素
    fgm2 = imclose(fgm, se2);%关操作
    fgm3 = imerode(fgm2, se2);%腐蚀
    fgm4 = bwareaopen(fgm3, 20);%开操作
    I3 = I;
    I3(fgm4) = 255;%前景处设置为255
    figure; subplot(121)
    imshow(I3)%显示修改后的极大值区域,figure7
    title('Modified regional maxima')
    bw = im2bw(Iobrcbr, graythresh(Iobrcbr));%转化为二值图像
    subplot(122); imshow(bw), %显示二值图像,figure7
    title('Thresholded opening-closing by reconstruction')
    
    %4. 进行分水岭变换并显示:
    
    D = bwdist(bw);%计算距离
    DL = watershed(D);%分水岭变换
    bgm = DL == 0;%求取分割边界
    

    三、运行结果

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    四、备注

    版本:2014a

    展开全文
  • 分水岭算法是一种图像区域分割法,分割的过程中将图片转化为灰度图,然后我会将灰度值看作是海拔,然后向较低点注水,这种基于地形学的解释,我们着重考虑三种点: 极小值点,该点对应一个盆地的最低点,当我们在...
  • 图像分割算法有分水岭算法、斑点计数算法、霍夫圆/椭圆算法、轮廓检测算法等。在本文中,我使用了轮廓检测和分水岭算法。涉及的步骤:读取图像转换为HSV阈值模糊它删除多余/不需要的区域在原始图像上绘制轮廓使用...
  • matlab分水岭算法做海岸线的提取

    千次阅读 2017-02-07 10:47:54
    %直接应用分水岭算法 Lrgb = label2rgb(L);%转化为彩色图像 figure; imshow(Lrgb), %显示分割后的图像 title('Watershed transform of gradient magnitude (Lrgb)') se = strel('disk', 20);%圆形结构元素 ...
  • 风水岭算法常见的有三种方法:(1)基于浸泡理论的分水岭分割方法;(2)基于连通图方法;(3)基于距离变换的方法。OpenCV 中是基于距离变换的分割方法,就相当于我们的小山头(认为造成的)。 基本的步骤: 例子1 ...
  • 分水岭算法对微弱的边缘有着良好的响应,但图像中的噪声会使分水岭算法产生过分割的现象 基于图论的分割方法 参考:图像分割之(一)概述 参考链接:https://blog.csdn.net/zouxy09/article/details/8532106 此类方法...
  • 形态学分水岭算法多数的图像分割算法均是基于灰度值的不连续和相似的性质。在前者中,算法以灰度突变为基础分割一幅图像,如图像边缘分割。假设图像不同区域的边界彼此完全不同,且与背景不同,从而允许基于灰度的...
  • That said, I'm使用的图像如下: 但是,当我尝试应用其中一个分水岭算法时: imshow(RGB,[]); gray_img = rgb2gray(RGB); tophat_filter = imtophat(gray_img, strel('disk', 10)); %Read into this level = ...
  • 分水岭:Matlab分水岭算法
  • matlab 分水岭分割算法

    2017-07-28 09:57:10
    matlab分水岭分割算法实例,内涵有实测数据,亲测可用!
  • Matlab实现分水岭算法,这个算法是图像边缘检测的常用算法。
  • 分水岭算法——MATLAB(Watershed algorithm - MATLAB)分水岭算法——MATLAB(Watershed algorithm - MATLAB)% 1. The Compute a segmentation function. This is an image whose dark regions are the objects you ...
  • matlab实现分水岭算法处理图像分割

    千次阅读 2018-11-08 09:03:15
    matlab实现分水岭算法处理图像分割
  • 分水岭算法

    2017-03-10 12:20:35
    用于图像分割的matlab分水岭算法
  • 基于matlab分水岭算法分割黏连细胞程序代码。。。。。
  • matlab基于分水岭算法处理图像分割的源程序,其中有不同的方法,是我收集过来效果比较好的,有利于大家的学习交流
  • matlab实现分水岭算法

    千次阅读 2017-02-14 23:09:23
    数学形态学以图像的形态特征为研究...分水岭算法(Watershed)基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形
  • Matlab关于分水岭算法及改进的分水岭算法
  • Marker-Controlled Watershed SegmentationSeparating touching objects in an image is one of the more difficult image processing operations. The watershed transform is often applied to this problem....

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 176
精华内容 70
关键字:

matlab分水岭算法

matlab 订阅