watershed函数matlab_matlab watershed - CSDN
精华内容
参与话题
  • watershed分水岭算法的matlab例子详解

    万次阅读 2014-11-24 21:46:17
    今天本来想试试mser算法的,结果没看懂。就先看看类似的fen'shui'l

    今天本来想试试mser算法的,结果没看懂。就先看看类似的分水岭算法,用c++又有些看不懂,于是就在matlab先试试,matlab上面没有源码,就拿它的例子试了试,大概明白它的用法,就把注释给贴了上来。

     clear all; clc; close all;     
     center1 = -10;%第一个圆圆心的横坐标
     center2 = -center1;%第二个圆圆心的横坐标
     dist = sqrt(2*(2*center1)^2);%计算两个圆心之间的距离
     radius = dist/2 * 1.4;%圆的半径为两者距离的一半的1.4倍,即两个圆肯定会相交
     lims = [floor(center1-1.2*radius) ceil(center2+1.2*radius)];%floor 向下取整 ceil向上取整 为整个图像的大小
     [x,y] = meshgrid(lims(1):lims(2));%生成一个69*69的网格平面
     bw1 = sqrt((x-center1).^2 + (y-center1).^2) <= radius;%计算每个坐标的跟(-10,-10)和(10,10)的距离,如果小于半径则置1,否则置0
     bw2 = sqrt((x-center2).^2 + (y-center2).^2) <= radius;
     bw = bw1 | bw2;%两个二值图像按位相或,合并在一起
     figure, imshow(bw,'InitialMagnification','fit'), title('bw')%显示两个相或之后的结果
     D = bwdist(~bw);%对bw求反,然后求距离变换之后的结果
     figure, imshow(D,[],'InitialMagnification','fit')%画出距离变换之后的结果
     title('Distance transform of ~bw')%标题
     D = -D;%对距离变换之后的结果求负值
     D(~bw) = -Inf;%把~bw中1的部分全部置为-Inf
     % 功能:分水岭变换
     % 用法:L = watershed(A) 
     % 输入:A——输入矩阵(任意维数)
     % 输出:L——分水岭标记矩阵
     % 注:L为整数(>=0),标记0不属于分水岭区域,标记1属于第1个分水岭区域,标记2属于第2个分水岭区域,以此类推。
     % 默认对二维矩阵使用8连通,三维矩阵使用26连通,高维矩阵使用conndef(ndims(A),'maximal')来定义连通性。
     % 
     % L = watershed(A, conn) specifies the connectivity to be used in the watershed computation. conn can have any of the following scalar values.
     % 输入:A——输入矩阵、conn——连通性
     % 输出:L——分水岭标记矩阵 
     L = watershed(D); %-1的位置置为0,其他位置分别为1,2,3
     %  功能:转换标记矩阵到RGB图像
     % 用法:RGB = label2rgb(L) 
     % 输入:L——标记矩阵(可由labelmatrix, bwlabel, bwlabeln, watershed返回) 
     % 输出:RGB——彩色图像
     % 注:根据L的数值对应,默认对应到colormap(jet)的色彩,返回RGB矩阵 
     % RGB = label2rgb(L, map)
     % 输入:L——标记矩阵(可由labelmatrix, bwlabel, bwlabeln, watershed返回)、map——颜色映射表 
     % 输出:RGB——彩色图像
     % 注:map为n*3的矩阵,可以通过MATLAB的colormap函数来返回,比如colormap('jet')等。也可以根据要求自己定义。默认为colormap(jet)。 
     % RGB = label2rgb(L, map, zerocolor) defines the RGB color of the elements labeled 0 (zero) in the input label matrix L. As the value of zerocolor, specify an RGB triple or one of the strings listed in this table.
     % 输入:L——标记矩阵(可由labelmatrix, bwlabel, bwlabeln, watershed返回)、map——颜色映射表、zerocolor——对应于标记0的颜色 
     % 输出:RGB——彩色图像 b
     % 注:zerocolor可以取值如表1.1,默认为[1 1 1],即白色。 
     % 表1.1 取值列表 
     %  Value % Color 
     %  'b'   %  蓝色
     %  'c'   %  蓝绿色
     %  'g'   %  绿色
     %  'k'   %  黑色
     %  'm'   %  洋红色
     %  'r'   %  红色
     %  'w'   %  白色
     %  'y'   %  黄色
     % RGB = label2rgb(L, map, zerocolor, order)
     % 输入:L——标记矩阵(可由labelmatrix, bwlabel, bwlabeln, watershed返回)、map——颜色映射表、zerocolor——对应于标记0的颜色、order——标记矩阵和颜色映射表对应方式
     % 输出:RGB——彩色图像 
     % 注:order默认为noshuffle,即根据L的数值来对应颜色。另外可以取值为shuffle,说明使用伪随机方式来对应。
     rgb = label2rgb(L,'jet',[.5 .5 .5]);
     figure, imshow(rgb,'InitialMagnification','fit')
     title('Watershed transform of D')


    展开全文
  • watershed分水岭算法的源代码

    热门讨论 2020-07-30 23:32:58
    watershed分水岭算法的源代码,一个很实用的用于图像分割的算法
  • Matlab watershed函数学习(1)

    千次阅读 2018-06-22 19:58:23
    function L =watershed(varargin)%WATERSHED Watershedtransform.% L = WATERSHED(A) computes a label matrixidentifying the watershed% regions of the input matrix A. A can have any dimension. The e...
    

    function L =watershed(varargin)

    %WATERSHED Watershedtransform.

    %   L = WATERSHED(A) computes a label matrixidentifying the watershed

    %   regions of the input matrix A.  A can have any dimension.  The elements

    %   of L are integer values greater than orequal to 0.  The elements

    %   labeled 0 do not belong to a uniquewatershed region.  These are called

    %   "watershed pixels."  The elements labeled 1 belong to the first

    %   watershed region, the elements labeled 2belong to the second watershed

    %   region, and so on.

     

    L =WATERSHED(A) 计算一个标签矩阵, 用于识别输入矩阵A的汇水区域. A可以是任意维. L的元素均为大于等于0的整数值. 标签值为0的元素不属于任何一个汇水区域, 称它们为"分水岭". 标签值为1的元素属于第1个汇水区域, 标签值为2的元素属于第2个汇水区域, 以此类推.

     

    %   By default, WATERSHED uses 8-connectedneighborhoods for 2-D inputs

    %   and 26-connected neighborhoods for 3-Dinputs.  For higher

    %   dimensions, WATERSHED uses the connectivitygiven by

    %   CONNDEF(NDIMS(A),'maximal').

    WATERSHED默认对2维输入数据采用8邻接, 3维输入数据采用26邻接. 对于更高维数的输入, WATERSHED根据CONNDEF(NDIMS(A), 'maximal')的值来判定连通性.

     

    %   L = WATERSHED(A,CONN) computes the watershedtransform using the

    %   specified connectivity.  CONN may have the following scalar values:

    %

    %       4    two-dimensional four-connected neighborhood

    %       8    two-dimensional eight-connected neighborhood

    %       6    three-dimensional six-connected neighborhood

    %       18   three-dimensional 18-connected neighborhood

    %       26   three-dimensional 26-connected neighborhood

    L =WATERSHED(A, CONN)根据指定的连通性判定规则计算分水岭变换. CONN可以有如下取值(标量)

    4: 针对2维矩阵, 4邻接;

    8: 针对2维矩阵, 8邻接;

    6: 针对3维矩阵, 6邻接

    18: 针对3维矩阵, 18邻接

    26: 针对3维矩阵, 26邻接

     

    %   Connectivity may be defined in a moregeneral way for any dimension by

    %   using for CONN a 3-by-3-by- ... -by-3 matrixof 0s and 1s.  The 1-valued

    %   elements define neighborhood locationsrelative to the center element of

    %   CONN. If specified this way, CONN must be symmetric about its center.

    连通性判定可以用一种更通用的方式指定, 即为CONN使用一个3X3X…X3矩阵, 每个元素的值只能为01. 值为1的元素定义相对于CONN的中心元素相邻位置(即值为1的元素视为与中心元素是邻接的). 如果采用这种方法, CONN必须满足中心对称.

     

    %   Note

    %   ----

    %   The watershed transform algorithm used bythis function changed in

    %   version 5.4 (R2007a) of the Image ProcessingToolbox.  The previous

    %   algorithm occasionally produced labeledwatershed basins that were not

    %   contiguous. If you need to obtain the same results as the previous

    %   algorithm, use the function WATERSHED_OLD.

    :

    5.4(R2007)图像处理工具箱以来, 该函数(R2015a)采用的分水岭变换算法已经改变了. 之前采用的算法偶尔会生成非毗邻的汇水盆地(?不一定翻译到位). 如果需要获取与之前算法同样的结果, 请调用WATERSHED_OLD.

     

    %   Class Support

    %   -------------

    %   A can be a numeric or logical array of anydimension, and it must be

    %   nonsparse. The output array L is an unsigned integer type.

    类支持

    A可以是任意维的数值或逻辑数组, 且必须是非稀疏的. 输出数组L的类型为无符号整型.

     

    %   Example (2-D)

    %   -------------

    %   1. Make a binary image containing twooverlapping circular objects.

    %

    %       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;

    %       figure,imshow(bw,'InitialMagnification','fit'), title('bw')

     

    示例 (2)

    1. 制作一幅包含两个重叠圆形对象的二值图像

    center1 = -10; %第一个圆的中心(-10, -10)

    center2 =-center1;%第二个圆的中心(10, 10)

    dist = sqrt(2*(2*center1)^2);%两圆心距离

    radius = dist/2 * 1.4;%两圆心距离的0.7, 使得两个圆重叠

    lims= [floor(center1-1.2*radius) ceil(center2+1.2*radius)];%[-3434]

    [x,y] = meshgrid(lims(1):lims(2));%生成一个矩形网格, X: [-34, -34], Y: [-34, -34], x,y均为2维矩阵, 这两个矩阵可用于指定任何一个69X69矩阵的任何位置对应的直角坐标

    bw1 = sqrt((x-center1).^2 + (y-center1).^2) <= radius;%产生第一个圆的二值图像

    bw2 = sqrt((x-center2).^2 + (y-center2).^2) <= radius;%产生第二个圆的二值图像

    bw = bw1 | bw2;%逻辑或, 两幅图像综合

    figure,imshow(bw,'InitialMagnification','fit'), title('bw')

    展开全文
  • matlabwatershed分水岭分割算法

    千次阅读 2017-02-22 14:34:38
    Separating touching objects in an image is one of the more difficult image processing operations. The watershed transform is often applied to this problem. The watershed transform finds "catchment bas



    Separating touching objects in an image is one of the more difficult image processing operations. The watershed transform is often applied to this problem. The watershed transform finds "catchment basins"(集水盆) and "watershed ridge lines"(山脊线) in an image by treating it as a surface where light pixels are high and dark pixels are low.

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

    Segmentation using the watershed transform works better if you can identify, or "mark," foreground objects and background locations. Marker-controlled watershed segmentation follows this basic procedure:

    直接应用分水岭分割算法的效果往往并不好,如果在图像中对前景对象和背景对象进行标注区别,再应用分水岭算法会取得较好的分割效果。基于标记控制的分水岭分割方法有以下基本步骤:

    1. Compute a segmentation function. This is an image whose dark regions are the objects you are trying to segment.

    1.计算分割函数。图像中较暗的区域是要分割的对象。

    2. Compute foreground markers. These are connected blobs of pixels within each of the objects.

    2.计算前景标志。这些是每个对象内部连接的斑点像素。

    3. Compute background markers. These are pixels that are not part of any object.

    3.计算背景标志。这些是不属于任何对象的像素。

    4. Modify the segmentation function so that it only has minima at the foreground and background marker locations.

    4.修改分割函数,使其仅在前景和后景标记位置有极小值。

    5. Compute the watershed transform of the modified segmentation function.

    5.对修改后的分割函数做分水岭变换计算。

    Use by Matlab Image Processing Toolbox

    使用MATLAB图像处理工具箱

    注:期间用到了很多图像处理工具箱的函数,例如fspecial、imfilter、watershed、label2rgb、imopen、imclose、imreconstruct、imcomplement、imregionalmax、bwareaopen、graythresh和imimposemin函数等。

    转载自:http://blog.sina.com.cn/s/blog_725866260100rz7x.html


    展开全文
  • Matlab watershed函数

    2020-04-01 22:00:16
    L = watershed(A) 对输入矩阵 A 进行分水岭变换,并标记不同的分水岭区域,得到标签矩阵 L 。 A 可以是任意维度的矩阵。 L 中的元素是非负整数。 值为 0 的元素不属于一个独立的分水岭区域,这些像素被称为...

    L = watershed(A) 对输入矩阵 A 进行分水岭变换,并标记不同的分水岭区域,得到标签矩阵 L 。

    A 可以是任意维度的矩阵。

    L 中的元素是非负整数。

          值为 0 的元素不属于一个独立的分水岭区域,这些像素被称为“分水岭元素”;

          值为 1 的元素属于第一个分水岭区域;

          值为 2 的元素属于第二个分水岭区域;

          值为 3 的元素属于第三个分水岭区域;

          。。。

          以此类推。

    默认情况下,对于二维输入图像,该函数采用 8 连接邻域,

                          对于三维输入图像,该函数采用 26 连接邻域,

                         对于更高维的输入图像,邻域大小由 conndef(ndims(A), 'maximal') 给出。

     

    L =  watershed(A, CONN) 通过指定的邻域大小 CONN 对输入矩阵 A 进行分水岭变换,CONN可能有以下标量值:

    4        二维 4 连接邻域

    8        二维 8 连接邻域

    6        三维 6 连接邻域

    18      三维 18 连接邻域

    26      三维 26 连接邻域

    对于任意维度的矩阵,连接性可以用一种更一般的形式来定义,即通过一个只有 0 元素和 1 元素的 3×3×...×3 矩阵CONN来定义,其中,1 元素所在的位置就是CONN中心元素指定的邻域位置。这种情况下,CONN必须是关于中心对称的矩阵。

     

    【注】A 可以是任意维度的数值矩阵或逻辑矩阵,但它必须是非稀疏的。L 是无符号整型的

     

    例子:

    1、A 是二维的

    clear
    % (1)创建一幅包含两个重叠的圆形物体的二值图像
    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;
    figure, imshow(bw,'InitialMagnification','fit'), title('bw')
    
    % (2)对二值图像取反,并计算取反后的距离变换
    D = bwdist(~bw);
    figure, imshow(D,[],'InitialMagnification','fit')
    title('Distance transform of ~bw')
    
    % (3)对距离变换的结果取反,并强制非目标物体区域的像素值为无穷大
    D = -D;
    D(~bw) = Inf;
    
    % (4)计算分水岭变换,强制背景像素为零,并将生成的标签矩阵显示为RGB图像
    L = watershed(D); 
    L(~bw) = 0;
    rgb = label2rgb(L,'jet',[.5 .5 .5]);
    figure, imshow(rgb,'InitialMagnification','fit')
    title('Watershed transform of D')

     

     

     

     

    2、A 是三维的

    clear
    % (1)创建一幅包含两个重叠球体的三维二值图像
    center1 = -10;
    center2 = -center1;
    dist = sqrt(3*(2*center1)^2);
    radius = dist/2 * 1.4;
    lims = [floor(center1-1.2*radius) ceil(center2+1.2*radius)];
    [x,y,z] = meshgrid(lims(1):lims(2));
    bw1 = sqrt((x-center1).^2 + (y-center1).^2 + ...
               (z-center1).^2) <= radius;
    bw2 = sqrt((x-center2).^2 + (y-center2).^2 + ...
               (z-center2).^2) <= radius;
    bw = bw1 | bw2;
    figure, isosurface(x,y,z,bw,0.5), axis equal, title('BW')
    xlabel x, ylabel y, zlabel z
    xlim(lims), ylim(lims), zlim(lims)
    view(3), camlight, lighting gouraud
    
    
    % (2)计算距离变换
    D = bwdist(~bw);
    figure, isosurface(x,y,z,D,radius/2), axis equal
    title('Isosurface of distance transform')
    xlabel x, ylabel y, zlabel z
    xlim(lims), ylim(lims), zlim(lims)
    view(3), camlight, lighting gouraud
    
    % (3)对距离变换取反,强制非目标物体像素值为无穷大,然后计算分水岭变换
    D = -D;
    D(~bw) = Inf;
    L = watershed(D);
    L(~bw) = 0;
    figure
    isosurface(x,y,z,L==1,0.5)
    isosurface(x,y,z,L==2,0.5), axis equal
    title('Segmented objects')
    xlabel x, ylabel y, zlabel z
    xlim(lims), ylim(lims), zlim(lims)
    view(3), camlight, lighting gouraud

     

    展开全文
  • Matlab watershed函数学习(2)

    千次阅读 2018-06-26 20:17:20
    % 2. Compute the distance transform of thecomplement of the binary% image. %% D = bwdist(~bw);% figure,imshow(D,[],'InitialMagnification','fit')% title('Distance transform o...
  • matlab学习之label2rgb

    千次阅读 2017-02-15 11:38:30
    输入:L——标记矩阵(可由labelmatrix, bwlabel, bwlabeln, watershed返回)  输出:RGB——彩色图像 注:根据L的数值对应,默认对应到colormap(jet)的色彩,返回RGB矩阵  RGB = label2rgb(L, map) ...
  • 分水岭算法 matlab的三种实现方法 .

    万次阅读 2012-11-27 16:47:03
    本文转自: http://blog.csdn.net/caiye917015406/article/details/7726628 clear,clc%三种方法进行分水岭分割 %读入图像 filename='sar1.bmp'; f=imread(filename); Info=imfinfo(filename);...f=rgb2gray
  • Marker-Controlled Watershed Segmentation 第一步:读入图像并转为黑白图像 rgb = imread('pears.png'); I = rgb2gray(rgb); imshow(I) text(732,501,'Image courtesy of Corel(R)', 'FontSize',7,'...
  • 【图像处理】MATLAB:图像分割

    万次阅读 多人点赞 2017-12-06 08:06:36
    阈值分割、基于区域的分割、使用分水岭变换的分割
  • 查看matlab函数源代码的方法

    千次阅读 2018-11-09 08:44:03
    查看matlab函数源代码的方法
  • matlab图像处理——分水岭法

    千次阅读 2018-11-03 20:02:19
    分水岭算法(watershed)是一种借鉴了形态学理论的分割方法,在该方法中,将一幅图像看成一个拓扑地形图,其中灰度值f(x,y)对应地形高度值。高灰度值对应的山峰,低灰度值对应山谷。水总是朝地势低的地方流动,直到...
  • 使用matlab对图像轮廓进行提取

    万次阅读 热门讨论 2019-01-26 22:28:47
    首先将图片导入matlab工作区 图片将会被转换为一个二维矩阵存=存放  然后我们输入指令可以看到原图 然后转为二值图像使用bwperim()函数进行轮廓提取 同样我们可以借助edge()函数进行边界检测,算子...
  • 标记符控制的分水岭算法原理及matlab实现

    万次阅读 多人点赞 2016-11-30 21:17:56
    本文介绍了分水岭算法,以及改进的标记符控制的分水岭算法,并提供了matlab源码
  • 分水岭算法Matlab实现——三种方法

    千次阅读 2013-05-11 15:14:57
    clear,clc%三种方法进行分水岭分割 %读入图像 filename='sar1.bmp'; f=imread(filename); Info=imfinfo(filename); if Info.BitDepth>8  f=rgb2gray(f);...%方法1:一般分水岭分割,从结果可以
  • label2rgb

    千次阅读 2013-11-03 21:48:54
    功能:转换标记矩阵到RGB图像 语法: RGB = label2rgb(L) RGB = label2rgb(L, map) RGB = label2rgb(L, map, zerocolor) RGB = label2rgb(L, map, ...L为标记矩阵(可由labelmatrix, bwlabel, bwla
  • matlab | 图像处理工具箱

    千次阅读 2020-10-14 08:51:37
    自己在学习过程中查阅资料整理了MATLAB图像处理工具箱中函数的名称列表,以及MathWorks中讲解各个函数使用的链接: 1.绘图工具箱 plot 基本绘图函数 mesh 绘制三维网格曲面 fplot 绘制数学函数图 ...
  • 《CV:AMA》一书第九章强调了matlab中分水岭算法对图像的分割 更新: dalao说一般在进行分水岭前都要灰度化、滤波、边缘检测、轮廓查找然后应用库里的函数,解决过度分割的话要有预先标记的先验知识,一般是mark几...
  • 常用的二维绘图函数: line plot subplot polar(极坐标图) semilogx semilogy loglog pie stem contour contourf compass(罗盘图) feather quiver(箭头) fplot hist(概率分布图) rose(极坐标下的直方图) bar ...
  • matlab实现分水岭算法

    千次阅读 2017-02-14 23:11:36
    数学形态学用于基于区域的图像分割最典型的例子就是分水岭(Watershed)方法。  分水岭算法(Watershed)基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值...
1 2 3 4 5 ... 16
收藏数 314
精华内容 125
关键字:

watershed函数matlab