分水岭 订阅
分水岭,拼音是fēn shuǐ lǐnɡ,是指分隔相邻两个流域的山岭或高地;也比喻不同事物的主要分界。在自然界中,分水岭较多的是山岭、高原。分水岭的脊线叫分水线,是相邻流域的界线,一般为分水岭最高点的连线。按形态分为两类:对称和不对称分水岭。对称分水岭的分水线位于分水岭中央,两侧斜坡的坡踩、长度一致。不对称分水岭的分水线偏于分水岭的一侧,两侧斜坡不对称。在自然界中,对称分水岭极为罕见,广泛发育的是不对称分水岭。 展开全文
分水岭,拼音是fēn shuǐ lǐnɡ,是指分隔相邻两个流域的山岭或高地;也比喻不同事物的主要分界。在自然界中,分水岭较多的是山岭、高原。分水岭的脊线叫分水线,是相邻流域的界线,一般为分水岭最高点的连线。按形态分为两类:对称和不对称分水岭。对称分水岭的分水线位于分水岭中央,两侧斜坡的坡踩、长度一致。不对称分水岭的分水线偏于分水岭的一侧,两侧斜坡不对称。在自然界中,对称分水岭极为罕见,广泛发育的是不对称分水岭。
信息
外文名
drainage divide
形成因素
地质构造和岩性因素
拼    音
fēn shuǐ lǐnɡ
中文名
分水岭
实    例
大分水岭
分水岭解释
分水岭 :①两个流域分界的山脊或高原。也叫分水线。②比喻不同事物的主要分界。
收起全文
精华内容
参与话题
问答
  • 分水岭

    2006-05-17 09:16:00
    2006年5月16日,冷静心态的形成,善恶分水岭。。。这一天的挫折,是将来成功的必经之路,感谢神,感谢佛,感谢心经。。。

    2006年5月16日,

    冷静心态的形成,善恶分水岭。。。

    这一天的挫折,是将来成功的必经之路,感谢神,感谢佛,感谢心经。。。

    展开全文
  • 分水岭算法及案例

    万次阅读 多人点赞 2017-11-29 13:04:32
    分水岭算法Watershed Algorithm(分水岭算法),顾名思义,就是根据分水岭的构成来考虑图像的分割。现实中我们可以或者说可以想象有山有湖的景象,那么那一定是水绕 山,山围水的情形。当然在需要的时候,要人工构筑...

    分水岭算法

    Watershed Algorithm(分水岭算法),顾名思义,就是根据分水岭的构成来考虑图像的分割。现实中我们可以或者说可以想象有山有湖的景象,那么那一定是水绕 山,山围水的情形。当然在需要的时候,要人工构筑分水岭,以防集水盆之间的互相穿透。而区分高山(plateaus)与水的界线,以及湖与湖之间的间隔或 都是连通的关系,就是我们可爱的分水岭(watershed)。

    如果图像中的目标物体是连接在一起的,则分割起来会更困难,分水岭分割算法经常用于处理这类问题,
    通常会取得比较好的效果。分水岭分割算法把图像看成一幅“地形图”,
    其中亮度比较强的区域像素值较大,而比较暗的区域像素值较小,通过寻找“汇水盆地”和“分水岭界限”,对图像进行分割。

    案例

    案例参考matlab官网案例,添加了详细注释,做出一定的调整,更容易让读者理解和接受。
    实现功能
    将明显的梨从一堆梨子中分离出来

    最终结果
    这里写图片描述

    文末将回答一下几个问题
    (1) 如果采用最大类间方差阈值分割方法进行分割,效果如何?为什么?
    (2) 直接用分水岭分割把“pears.png”分割好么?为什么?
    (3) 如何获得前景标记?
    (4) Imregionalmax是什么作用,请举例说明。
    (5) bwareaopen是什么作用,请举例说明。它是不是用数学形态学算法实现?
    (6) 如何获得背景标记?
    (7) 最终如何用前景标记和背景标记实现标记分水岭分割?

    第一步:读入彩色图像,将其转化成灰度图像

    clc; clear ; close ;
    rgb = imread('pears.png');
    if ndims(rgb) == 3
    I = rgb2gray(rgb);
    else
    I = rgb;
    end
    figure('units', 'normalized','Name','图像读取:原图及灰度图比较');
    subplot(1, 2, 1); imshow(rgb); title('原图');
    subplot(1, 2, 2); imshow(I); title('灰度图');

    这里写图片描述

    第2步:方法1:将梯度幅值作为分割函数

    使用Sobel边缘算子对图像进行水平和垂直方向的滤波,然后求取模值, sobel算子滤波后的图像在边界处会显示比较大的值,在没有边界处的值会很小。
    第一种方法是直接对梯度幅值图像使用分水岭算法

    hy = fspecial('sobel');
    hx = hy';
    Iy = imfilter(double(I), hy, 'replicate');
    Ix = imfilter(double(I), hx, 'replicate');
    gradmag = sqrt(Ix.^2 + Iy.^2);
    figure('units', 'normalized','Name','直接计算梯度幅值作为分割函数的结果');
    subplot(1, 3, 1); imshow(I,[]), title('灰度图像')
    subplot(1, 3, 2); imshow(gradmag,[]), title('梯度幅值图像')
    L = watershed(gradmag);
    Lrgb = label2rgb(L);
    subplot(1, 3, 3); imshow(Lrgb); title('梯度幅值做分水岭变换')

    这里写图片描述
    直接使用梯度模值图像进行分水岭算法得到的结果往往会存在过度分割的现象。因此通常需要分别对前景对象和背景对象进行标记,以获得更好的分割效果。

    第3步:使用形态学技术“基于开的重建”和“基于闭的重建”来清理图像。

    se = strel('disk', 20);
    Io = imopen(I, se);
    % 通过腐蚀后重建来做基于开的重建计算。
    Ie = imerode(I, se);
    Iobr = imreconstruct(Ie, I);
    % 开操作后,接着进行闭操作,可以移除较暗的斑点和枝干标记。对比常规的形态学闭操作和基于闭的重建操作。
    Ioc = imclose(Io, se);
    Ic = imclose(I, se);
    % 现在使用imdilate,然后使用imreconstruct。注意必须对输入图像求补,对imreconstruct输出图像求补。
    % IM2 = imcomplement(IM)计算图像IM的补集。IM可以是二值图像,或者RGB图像。IM2与IM有着相同的数据类型和大小。
    Iobrd = imdilate(Iobr, se);
    Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr));
    Iobrcbr = imcomplement(Iobrcbr);
    
    figure('units', 'normalized','Name','比较各种形态学运算后的重建结果');
    subplot(2, 3, 1); imshow(I, []); title('灰度图像');
    subplot(2, 3, 2); imshow(Io, []); title('开操作图像');
    subplot(2, 3, 3); imshow(Ic, []); title('闭操作图像');
    subplot(2, 3, 4); imshow(Ioc, []), title('开闭操作');
    subplot(2, 3, 5); imshow(Iobr, []); title('基于开的重建图像-腐蚀原图作为Marker');
    subplot(2, 3, 6); imshow(Iobrcbr, []), title('基于闭的重建图像-膨胀开重建(取反)作为Marker');
    % 通过比较Iobrcbr和loc可以看到,在移除小污点同时不影响对象全局形状的应用下,
    % 基于重建的开闭操作要比标准的开闭重建更加有效。计算Iobrcbr的局部极大来得到更好的前景标记。
    

    这里写图片描述
    处理结果发现:基于重建的开闭操作要比标准的开闭重建更加有效。所以计算Iobrcbr的局部极大来得到更好的前景标记。

    第4步:标记前景对象

    有多种方法可以应用在这里来获得前景标记,这些标记必须是前景对象内部的连接斑点像素。 这些操作将会在每个对象内部创建单位极大值,使得可以使用imregionalmax来定位。

    fgm = imregionalmax(Iobrcbr);
    % 为了帮助理解这个结果,叠加前景标记到原图上。
    It1 = rgb(:, :, 1);
    It2 = rgb(:, :, 2);
    It3 = rgb(:, :, 3);
    It1(fgm) = 255; It2(fgm) = 0; It3(fgm) = 0;
    I2 = cat(3, It1, It2, It3);
    
    figure('units', 'normalized','Name','前景标记及调整');
    subplot(3, 3, 1); imshow(I, []); title('灰度图像');
    subplot(3, 3, 2); imshow(Iobrcbr, []); title('基于开闭的重建操作');
    subplot(3, 3, 3); imshow(fgm, []); title('局部极大图像');
    subplot(3, 3, 4); imshow(rgb, []); title('原图像');
    subplot(3, 3, 5); imshow(I2); title('局部极大叠加到原图像');
    % 注意到大多闭塞处和阴影对象没有被标记,这就意味着这些对象在结果中将不会得到合理的分割。
    % 而且,一些对象的前景标记会一直到对象的边缘。
    % 这就意味着应该清理标记斑点的边缘,然后收缩它们。可以通过闭操作和腐蚀操作来完成。
    se2 = strel(ones(5,5));
    fgm2 = imclose(fgm, se2);
    fgm3 = imerode(fgm2, se2);
    subplot(3, 3, 6); imshow(fgm2, []); title('闭操作后-局部极大图像');
    subplot(3, 3, 7); imshow(fgm3, []); title('腐蚀操作后-局部极大图像');
    % 这个过程将会留下一些偏离的孤立像素,应该移除它们。可以使用bwareaopen,用来移除少于特定像素个数的斑点。
    % BW2 = bwareaopen(BW,P)从二值图像中移除所以少于P像素值的连通块,得到另外的二值图像BW2。
    fgm4 = bwareaopen(fgm3, 20);
    It1 = rgb(:, :, 1);
    It2 = rgb(:, :, 2);
    It3 = rgb(:, :, 3);
    It1(fgm4) = 255; It2(fgm4) = 0; It3(fgm4) = 0;
    I3 = cat(3, It1, It2, It3);
    subplot(3, 3, 8); imshow(fgm4, []); title('进一步去除小斑点操作');
    subplot(3, 3, 9); imshow(I3, []); title('修改后局部极大叠加到原图像');

    这里写图片描述

    第5步:计算背景标记

    % 现在,需要标记背景。在清理后的图像Iobrcbr中,暗像素属于背景,所以可以从阈值操作开始。
    bw =  imbinarize(Iobrcbr);
    % 背景像素在黑色区域,但是理想情形下,不必要求背景标记太接近于要分割的对象边缘。
    % 通过计算“骨架影响范围”来“细化”背景,或者SKIZ,bw的前景。这个可以通过计算bw的距离变换的分水岭变换来实现,
    % 然后寻找结果的分水岭脊线(DL==0)。D = bwdist(BW)计算二值图像BW的欧几里得矩阵。对BW的每一个像素,
    % 距离变换指定像素和最近的BW非零像素的距离。bwdist默认使用欧几里得距离公式。BW可以由任意维数,D与BW有同样的大小。
    D = bwdist(bw);
    DL = watershed(D);
    bgm = DL == 0;
    figure('units', 'normalized','Name','背景标记');
    subplot(2, 2, 1); imshow(Iobrcbr, []); title('基于开闭的重建操作');
    subplot(2, 2, 2); imshow(bw, []); title('阈值分割');
    subplot(2, 2, 3); imshow(label2rgb(DL), []); title('分水岭变换示意图');
    subplot(2, 2, 4); imshow(bgm, []); title('分水岭变换脊线图');

    这里写图片描述

    第6步:计算分割函数的分水岭变换

    % 函数imimposemin可以用来修改图像,使其只是在特定的要求位置有局部极小。
    % 这里可以使用imimposemin来修改梯度幅值图像,使其只在前景和后景标记像素有局部极小。
    gradmag2 = imimposemin(gradmag, bgm | fgm4);
    figure('units', 'normalized','Name','分割函数的分水岭变换对比');
    subplot(2, 2, 1); imshow(bgm, []); title('分水岭变换脊线图-背景');
    subplot(2, 2, 2); imshow(fgm4, []); title('前景标记');
    subplot(2, 2, 3); imshow(gradmag, []); title('第一次梯度幅值图像');
    subplot(2, 2, 4); imshow(gradmag2, []); title('修改后梯度幅值图像');

    这里写图片描述

    第7步:查看结果

    % 一个可视化技术是叠加前景标记、背景标记、分割对象边界到初始图像。可
    % 以使用膨胀来实现某些要求,比如对象边界,更加清晰可见。对象边界定位于L==0的位置。
    L = watershed(gradmag2);
    It1 = rgb(:,:, 1);
    It2 = rgb(:, :, 2);
    It3 = rgb(:, :, 3);
    fgm5 = imdilate(L == 0, ones(3, 3)) | bgm | fgm4;
    It1(fgm5) = 255; It2(fgm5) = 0; It3(fgm5) = 0;
    I4 = cat(3, It1, It2, It3);
    figure('units', 'normalized','Name','分割结果');
    subplot(2, 2, 1); imshow(rgb, []); title('原图像');
    subplot(2, 2, 2); imshow(I4, []); title('标记和对象边缘叠加到原图像');
    % 另外一个有用的可视化技术是将标记矩阵作为彩色图像进行显示。标记矩阵,
    % 比如通过watershed和bwlabel得到的,可以使用label2rgb转换到真彩图像来显示。
    Lrgb = label2rgb(L, 'jet', 'w', 'shuffle');
    subplot(2, 2, 3); imshow(Lrgb); title('彩色分水岭标记矩阵');
    % 可以使用透明度来叠加这个伪彩色标记矩阵在原亮度图像上进行显示。
    subplot(2, 2, 4); imshow(rgb, []); hold on;
    himage = imshow(Lrgb);
    set(himage, 'AlphaData', 0.3);
    title('标记矩阵叠加到原图像');

    这里写图片描述

    问题解答:
    (1) 如果采用最大类间方差阈值分割方法进行分割,效果如何?为什么?
    最大类间方差阈值分割方法实际上是当做双峰分布,分割结果不理想。不适合做背景比较复杂的图像的分割

    clc,clear
    rgb=imread('pears.png');
    I = rgb2gray(rgb);
    imshow(I)
    
    T=graythresh(I);%通过graythresh选择阈值
    BW=im2bw(I,T);%用Otus阈值对图像进行分割
    figure,imshow(BW);

    (2) 直接用分水岭分割把“pears.png”分割好么?为什么?
    直接分割会出现分割过度
    (3) 如何获得前景标记?
    1.首先使用形态学技术“基于开的重建”和“基于闭的重建”来清理图像。发现基于开+闭的重建效果最好
    2.对重建后的图像在每个对象内部创建单位极大值,使得可以使用imregionalmax来定位
    3.这个过程将会留下一些偏离的孤立像素,应该移除它们。可以使用bwareaopen,用来移除少于特定像素个数的斑点。
    (4) Imregionalmax是什么作用,请举例说明。
    使得可以使用imregionalmax来定位极大值和极小值

    A = 10*ones(10,10);
    A(2:4,2:4) = 22; 
    A(6:8,6:8) = 33; 
    A(2,7) = 44;
    A(3,8) = 45;
    A(4,9) = 44

    这里写图片描述

    regmax = imregionalmax(A)

    这里写图片描述
    (5) bwareaopen是什么作用,请举例说明。它是不是用数学形态学算法实现?
    BW2 = bwareaopen(BW,P)从二值图像中移除所以少于P像素值的连通块,得到另外的二值图像BW2。
    感觉是形态学的方法
    官方Example
    (6) 如何获得背景标记?

    % 现在,需要标记背景。在清理后的图像Iobrcbr中,暗像素属于背景,所以可以从阈值操作开始。
    bw = im2bw(Iobrcbr, graythresh(Iobrcbr));
    % 背景像素在黑色区域,但是理想情形下,不必要求背景标记太接近于要分割的对象边缘。
    % 通过计算“骨架影响范围”来“细化”背景,或者SKIZ,bw的前景。这个可以通过计算bw的距离变换的分水岭变换来实现,
    % 然后寻找结果的分水岭脊线(DL==0)。D = bwdist(BW)计算二值图像BW的欧几里得矩阵。对BW的每一个像素,
    % 距离变换指定像素和最近的BW非零像素的距离。bwdist默认使用欧几里得距离公式。BW可以由任意维数,D与BW有同样的大小。
    D = bwdist(bw);
    DL = watershed(D);
    bgm = DL == 0;
    figure('units', 'normalized','Name','背景标记');
    subplot(2, 2, 1); imshow(Iobrcbr, []); title('基于重建的开闭操作');
    subplot(2, 2, 2); imshow(bw, []); title('阈值分割');
    subplot(2, 2, 3); imshow(label2rgb(DL), []); title('分水岭变换示意图');
    subplot(2, 2, 4); imshow(bgm, []); title('分水岭变换脊线图');

    (7) 最终如何用前景标记和背景标记实现标记分水岭分割?
    函数imimposemin可以用来修改图像,使其只是在特定的要求位置有局部极小。
    这里可以使用imimposemin来修改梯度幅值图像,使其只在前景和后景标记像素有局部极小。

    gradmag2 = imimposemin(gradmag, bgm | fgm4);
    L = watershed(gradmag2);

    完整的代码:https://code.csdn.net/snippets/2603174

    参考
    http://blog.sina.cn/dpool/blog/s/blog_725866260100rz7x.html

    展开全文
  • 分水岭算法

    2018-12-25 09:00:31
    如果图像中的目标物体是连接在一起的,则分割起来会更困难,分水岭分割算法经常用于处理这类问题,通常会取得比较好的效果。分水岭分割算法把图像看成一幅“地形图”,其中亮度比较强的区域像素值较大,而比较暗的...
  • 分水岭算法matlab实现

    热门讨论 2009-12-30 20:15:54
    分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界...
  • 分水岭算法(Watershed)基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形成分水岭分水岭的概念和形成可以...
  • OpenCV—Python 分水岭算法图像分割

    千次阅读 2019-08-28 14:33:53
    文章目录一、前言二、cv2.distanceTransform(src, distanceType, maskSize)三、基于标记的分水岭分割功能四、示例代码 一、前言 分水岭算法是一种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为...

    一、功能与函数介绍

    分水岭算法是一种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性是分水岭算法的一个重要特征
    其他图像分割方法,如阈值,边缘检测等都不会考虑像素在空间关系上的相似性和封闭性这一概念,彼此像素间互相独立,没有统一性。分水岭算法较其他分割方法更具有思想性,更符合人眼对图像的印象。
    在这里插入图片描述
    任意的灰度图像可以被看做是地质学表面,高亮度的地方是山峰,低亮度的地方是山谷。给每个孤立的山谷(局部最小值)不同颜色的水(标签),当水涨起来,根据周围的山峰(梯度),不同的山谷也就是不同的颜色会开始合并,要避免这个,你可以在水要合并的地方建立障碍,直到所有山峰都被淹没。你所创建的障碍就是分割结果,这个就是分水岭的原理,但是这个方法会分割过度,因为有噪点,或者其他图像上的错误。所以OpenCV实现了一个基于掩模的分水岭算法,你可以指定哪些是要合并的点,哪些不是,这是一个交互式的图像分割,我们要做的是给不同的标签。给我们知道是前景或者是目标用一种颜色加上标签,给我们知道是背景或者非目标加上另一个颜色,最后不知道是什么的区域标记为0. 然后使用分水岭算法。

    1.1 cv2.distanceTransform(src, distanceType, maskSize)

    距离变换的基本含义是计算一个图像中非零像素点到最近的零像素点的距离,也就是到零像素点的最短距离个最常见的距离变换算法就是通过连续的腐蚀操作来实现,腐蚀操作的停止条件是所有前景像素都被完全腐蚀。这样根据腐蚀的先后顺序,我们就得到各个前景像素点到前景中心呗Ⅵ像素点的距离。根据各个像素点的距离值,设置为不同的灰度值。这样就完成了二值图像的距离变换

    参数:

    distanceType – 距离类型:cv2.DIST_L1, cv2.DIST_L2 , cv2.DIST_C

    maskSize – 距离变换蒙版的大小:取值3,5 或 CV_DIST_MASK_PRECISE(后一个选项仅由第一个函数支持)。在CV_DIST_L1或CV_DIST_C距离类型的情况下,参数被强制为3。

    cv2.distanceTransformWithLabels()额外参数

    labels – 可选输出2D标签数组(离散Voronoi图): 它的类型为CV_32SC1,大小与src相同

    labelType – 构建标签数组的类型:
    若为 DIST_LABEL_CCOMP,则src中每个连接的零组件(以及最接近连接组件的所有非零像素)将被分配相同的标签。
    若为DIST_LABEL_PIXEL,那么每个零像素(以及最接近它的所有非零像素)都会获得自己的标签。

    1.2 基于标记的分水岭分割功能
    img = np.zeros((400, 400), np.uint8)
    cv2.circle(img, (150, 150), 100, 255, -1)
    cv2.circle(img, (250, 250), 100, 255, -1)
    
    dist = cv2.distanceTransform(img, cv2.cv.CV_DIST_L2, cv2.cv.CV_DIST_MASK_PRECISE)
    dist3 = np.zeros((dist.shape[0], dist.shape[1], 3), dtype = np.uint8)
    dist3[:, :, 0] = dist
    dist3[:, :, 1] = dist
    dist3[:, :, 2] = dist
    
    markers = np.zeros(img.shape, np.int32)
    markers[150,150] = 1  # seed for circle one
    markers[250, 250] = 2 # seed for circle two
    markers[50,50] =  3   # seeds for background
    
    cv2.watershed(dist3, markers)
    
    1.3 示例代码
    import numpy as np
    import cv2
    
    
    def watershed(imgpath):
        img = cv2.imread(imgpath)
        gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        ret0, thresh0 = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
    
        kernel = np.ones((3,3),np.uint8)
        opening = cv2.morphologyEx(thresh0,cv2.MORPH_OPEN,kernel, iterations = 2)
    
        # 确定背景区域
        sure_bg = cv2.dilate(opening,kernel,iterations=3)
    
        # 确定前景区域
        dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
        ret1, sure_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)
    
        # 查找未知区域
        sure_fg = np.uint8(sure_fg)
        unknown = cv2.subtract(sure_bg,sure_fg)
    
        # 标记标签
        ret2, markers1 = cv2.connectedComponents(sure_fg)
        markers = markers1+1
        markers[unknown==255] = 0
    
        markers3 = cv2.watershed(img,markers)
        img[markers3 == -1] = [0,255,0]
        return thresh0,sure_bg,sure_fg,img
    
    if __name__ == '__main__':
        imgpath = './gggg/fenshuiling.png'
        thresh0, sure_bg, sure_fg, img = watershed(imgpath)
    
        cv2.imshow('thresh0',thresh0)
        cv2.imshow('sure_bg', sure_bg)
        cv2.imshow('sure_fg', sure_fg)
        cv2.imshow('result_img', img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    在这里插入图片描述

    二、分水岭方法

    在下面的例子中,需要将两个重叠的圆分开。我们先计算圆上的这些白色像素点到黑色背景像素点的距离变换,选出距离变换中的最大值作为初始标记点(如果是反色的话,则是取最小值),从这些标记点开始的两个汇水盆越集越大,最后相交于分山岭。从分山岭处断开,我们就得到了两个分离的圆。

    示例:基于距离变换的分山岭图像分割

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy import ndimage as ndi
    from skimage import morphology,feature
    
    #创建两个带有重叠圆的图像
    x, y = np.indices((80, 80))
    x1, y1, x2, y2 = 28, 28, 44, 52
    r1, r2 = 16, 20
    mask_circle1 = (x - x1)**2 + (y - y1)**2 < r1**2
    mask_circle2 = (x - x2)**2 + (y - y2)**2 < r2**2
    image = np.logical_or(mask_circle1, mask_circle2)
    
    #现在我们用分水岭算法分离两个圆
    distance = ndi.distance_transform_edt(image) #距离变换
    local_maxi =feature.peak_local_max(distance, indices=False, footprint=np.ones((3, 3)),labels=image)   #寻找峰值
    markers = ndi.label(local_maxi)[0]           #初始标记点
    labels =morphology.watershed(-distance, markers, mask=image) #基于距离变换的分水岭算法
    # kimage.segmentation.watershed
    
    fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(8, 8))
    axes = axes.ravel()
    ax0, ax1, ax2, ax3 = axes
    
    ax0.imshow(image, cmap=plt.cm.gray, interpolation='nearest')
    ax0.set_title("Original")
    ax1.imshow(-distance, cmap=plt.cm.jet, interpolation='nearest')
    ax1.set_title("Distance")
    ax2.imshow(markers, cmap=plt.cm.gray, interpolation='nearest')
    ax2.set_title("Markers")
    ax3.imshow(labels, cmap=plt.cm.gray, interpolation='nearest')
    ax3.set_title("Segmented")
    
    for ax in axes:
        ax.axis('off')
    
    fig.tight_layout()
    plt.show()
    

    在这里插入图片描述
    分水岭算法也可以和梯度相结合,来实现图像分割。一般梯度图像在边缘处有较高的像素值,而在其它地方则有较低的像素值,理想情况 下,分山岭恰好在边缘。因此,我们可以根据梯度来寻找分山岭。

    基于梯度的分水岭图像分割

    import matplotlib.pyplot as plt
    from scipy import ndimage as ndi
    from skimage import morphology,color,data,filters
    
    image =color.rgb2gray(data.camera())
    denoised = filters.rank.median(image, morphology.disk(2)) #过滤噪声
    
    #将梯度值低于10的作为开始标记点
    markers = filters.rank.gradient(denoised, morphology.disk(5)) <10
    markers = ndi.label(markers)[0]
    
    gradient = filters.rank.gradient(denoised, morphology.disk(2)) #计算梯度
    labels =morphology.watershed(gradient, markers, mask=image) #基于梯度的分水岭算法
    
    fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(6, 6))
    axes = axes.ravel()
    ax0, ax1, ax2, ax3 = axes
    
    ax0.imshow(image, cmap=plt.cm.gray, interpolation='nearest')
    ax0.set_title("Original")
    ax1.imshow(gradient, cmap=plt.cm.gray, interpolation='nearest')
    ax1.set_title("Gradient")
    ax2.imshow(markers, cmap=plt.cm.gray, interpolation='nearest')
    ax2.set_title("Markers")
    ax3.imshow(labels, cmap=plt.cm.gray, interpolation='nearest')
    ax3.set_title("Segmented")
    
    for ax in axes:
        ax.axis('off')
    
    fig.tight_layout()
    plt.show()
    

    在这里插入图片描述

    展开全文
  • matlab分水岭

    2014-06-04 19:36:16
    改程序使用matlab做的分水岭算法,程序功能比较全,而且还每一步骤都分的很清楚
  • 对于图像分割,分水岭法就是在灰度图像中找出不同的吸水盆地和分水岭,不同的吸水盆地代表性质不同的区域,分水岭代表边缘,分割的主要目标是找到分水线。 分水岭分割的源程序,在CWaterShedDoc类里的OnWaterShed()...
  • 分水岭源码

    2014-11-18 08:08:59
    图像分割分水岭算法第一版,详见我的相关博文
  • 北美东西部大陆分水岭环绕博尔德河流域的西半部,山区分水岭与杰斐逊河和密苏里州的河流围绕着流域的东半部。 在这些排水沟中划出了超过25个深山passes口,为当今的博尔德河排水系统之前的区域排水系统提供了证据。...
  • 分水岭法统计小麦

    2012-05-25 13:56:55
    本文首先研究了图像分割算法...重点研究了基于小波变换的分水岭算法和阈值分割算法在小麦图像分割中的应用,并借助MATLAB工具软件对选定图像进行处理,实现了对小麦粘连籽粒的分离。最后本文对图像分割技术进行了展望。
  • watershed分水岭算法

    2017-09-19 16:17:46
    所谓分水岭算法有好多种实现算法,拓扑学,形态学,浸水模拟和降水模拟等方式。要搞懂就不容易了。Watershed Algorithm(分水岭算法),顾名思义,就是根据分水岭的构成来考虑图像的分割。
  • MATLAB 分水岭算法

    2018-03-03 12:05:49
    MATLAB自己实现的分水岭算法,细节都是自己实现的,严格按照原本步骤实现,没有任何加速算法,带一张图片,可与MATLAB自带分水岭算法比较,看不出区别,中科大数字图像分析作业,自己做的,慎重下载
  • 传统分水岭算法常常会因阈值选择不当而导致图像分割出现各种各样的问题,尤其是过分割问题。在传统分水岭算法的基础上,以灵武长枣图像为研究对象,运用遗传算法对随机选取的阈值进行优化选择;对自然光照环境下的20...
  • java源码分水岭算法

    2014-12-04 13:35:40
    java实现的分水岭算法,这一版实现了分割后的区域合并,效果还不错。博客地址http://blog.csdn.net/abcd_d_/article/details/41722525 PS: 本应继续开源精神,但是考虑到最近积分紧张,所以收1个分,不算多吧
  • matlab分水岭分割

    2014-06-04 19:46:56
    该程序使用matlab完成的分水岭算法,很具有代表性,程序很好,很实用
  • 鉴于传统分水岭算法存在过分割的缺点,并且考虑到反射亮光对图像的干扰,提出一种基于新颜色空间的改进分水岭彩色图像分割算法。该方法通过计算得到彩色图像在新颜色空间下不受反射亮光干扰的分量梯度,接着叠加融合...
  • 这项研究的目的是在分水岭规模上评估大气和农业氮负荷对溪流水质的影响。 在一个6642 km2的忠州大坝流域,对SWAT进行了为期4年(2003-2006年)的校准,并使用每日人为N数据(污水排放污染物和肥料)和每月测得的NO3...
  • 由于心脏舒张、收缩以及血液的流动,CT心脏图像易出现弱边界、伪影,传统分水岭算法易产生过分割,为此,提出一种双边滤波和标记分水岭相融合的CT心脏图像分割方法(BF-WS)。采用双边滤波算法对心脏图像进行平滑...
  • matlab分水岭代码

    2009-09-26 11:44:14
    包含了分水岭算法及其改进算法的matlab代码
  • 针对分水岭算法过分割问题,提出一种基于自适应提取标记的改进算法。该算法结合极小值深度和汇水盆地尺度信息提取与物体 相关的极小值标记,根据梯度图像中极值点的统计信息自适应设定标记提取的阈值。提取到的...
  • matlab 分水岭算法

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

    2013-03-15 15:42:37
    matlab图像分水岭分割,图像形态学经典示例。
  • 针对脑部核磁共振成像(magnetic resonance imaging,MRI)图像中因噪声、灰度不均匀及边界模糊不连续等造成肿瘤难以准确分割的问题,提出一种基于形态学重建和梯度分层多尺度修正的分水岭分割方法。首先对原始图像...
  • ArcGIS教程:分水岭

    2015-05-12 11:07:04
    各个分水岭的值将取自输入栅格中源的值或者要素倾泻点数据。如果倾泻点为栅格数据集,则使用像元值。如果倾泻点为点要素数据集,则从指定的字段中获取值。
  • 分水岭图像分割

    2012-03-09 20:09:08
    MATLAB基于分水岭的图像分割系统设计
  • 分水岭程序 Matlab

    2015-04-07 17:18:04
    分水岭程序,可用于图像分割等
  • 分水岭算法及其应用

    千次阅读 2013-12-01 21:31:17
    在作物的农业生产中,病害是影响作物产量的重要因素。因此,农作物生长过程中病害的防治就成了一个关键问题。近些年来,计算机图像处理以及模式识别...近年来,分水岭图像分割方法因其在处理图像分割问题时表现出的良好

    在作物的农业生产中,病害是影响作物产量的重要因素。因此,农作物生长过程中病害的防治就成了一个关键问题。近些年来,计算机图像处理以及模式识别理论有了很大的发展,使得在计算机上对作物病害进行智能化诊断成为了可能。图像分割作为一个关键的阶段,其效果直接影响着后期的特征提取和病害识别,因此,准确无误地分割出病害叶片上的病斑是至关重要的。

    近年来,分水岭图像分割方法因其在处理图像分割问题时表现出的良好性能而成为图像分割领域的研究热点之一。分水岭算法分割精度高,算法简单易实现,并且能产生单像素宽度的连续边界,使得分水岭算法得到了极其广泛的应用。由于分水岭算法的这种特点,和其他分割算法相比,它的分割结果通常更加稳定。

    但是,分水岭算法也有其不足的地方。由于其精确性,容易对噪声敏感从而产生“过分割”现象,即分割区域被划分的太细,使得分割结果失去了实用价值。针对这个问题,可以通过预处理来降低图像的噪声,这在一定程度上可以减少过分割的区域。目前常见的消除过分割的方法有两种:标记控制和区域合并。区域合并由于其计算量较大,需要对过分割的结果按照合并规则进行扫描合并,因此并不可取。标记控制的方法在图像上提取前景标记和背景标记,前景标记标识着目标,背景标识则表示背景区域。通过这种方法,一副图像被划分为若干幅小图像,每一副小图像由背景区域表示,其内部含有唯一的一个前景标识。然后针对每个小区域采用分水岭算法,最终得到分割的结果。

    本文采用黄瓜病害叶片为例,探讨基于标记的分水岭算法在作物病害叶片图像分割中的应用。研究发现,直接采用基于标记的分水岭算法对黄瓜叶片进行分割,无法得到满意的结果。为了提高黄瓜病害叶片图像分割的准确性,采用了一种改进的基于标记的分水岭图像分割算法。标记选取的准确性,直接影响到分水岭算法的分割效果,本文对前景标记和背景标记的提取方法进行改进。针对前景标记,对其进行过滤从而消除伪标记;针对背景标记,为了保证图像边缘信息的完整性,直接在原图上进行背景标记的提取。采用改进后的方法对黄瓜叶片进行图像分割,能够取得满意的结果。考虑到日光条件下拍摄的黄瓜病害叶片都具有复杂的背景,这些复杂背景往往会使得常见的分割方法失效。为了解决这个问题,本文进一步提出了一种针对复杂背景的方案。该方案通过多重形态学变换来消除大部分背景,然后消除图像的边缘部分,最后再采用基于标记的分水岭算法进行图像分割。采用该方法对具有复杂背景的黄瓜病害叶片图像进行分割,也取得了良好的效果。

    展开全文
  • 使用ArcMap 10 GIS和1弧第二DEM完成了Ras Gharib地区的分水岭划界和流线,演示了研究区域中的三个盆地。 从TRMM数据中提取的研究区域附近的降雨数据点已用作Log-Pearson III分布的输入,以便计算不同返回期(100、...

空空如也

1 2 3 4 5 ... 20
收藏数 2,872
精华内容 1,148
关键字:

分水岭