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')


    展开全文
  • matlab实现分水岭算法处理图像分割

    万次阅读 多人点赞 2011-08-08 14:06:29
    此程序为优化后的分水岭算法,避免了图像过分割 I= imread('D:\Images\pic_loc\1870405130305041503.jpg'); imshow(I); h=fspecial('sobel'); %h = fspecial(type) crea

    此程序为优化后的分水岭算法,避免了图像过分割

    I= imread('D:\Images\pic_loc\1870405130305041503.jpg');    
    imshow(I);
    h=fspecial('sobel'); %h = fspecial(type) creates a two-dimensional filter h of the specified type. fspecial returns h as
                         %a correlation kernel, which is the appropriate form to use with imfilter. type is a string having one of these values. 
    fd=double(I);%double使数据变成双精度
    g=sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2);
    figure;
    imshow(g);
    g2=imclose(imopen(g,ones(3,3)),ones(3,3));
    figure;
    imshow(g2);
    im=imextendedmin(g2,10);   %
    Lim=watershed(bwdist(im)); %watershed分水岭算法 Lim的值greater than or equal to 0,等于0是分水岭脊像素
    em=Lim==0;
    g3=imimposemin(g2,im|em);
    g4=watershed(g3);
    figure;
    imshow(g4);
    g5=I;
    g5(g4==0)=255;
    figure;
    imshow(g5);

    实验结果:


    展开全文
  • 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的三种实现方法 .

    万次阅读 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

    本文转自:

    http://blog.csdn.net/caiye917015406/article/details/7726628

    clear,clc%三种方法进行分水岭分割

    %读入图像

    filename='sar1.bmp';

    f=imread(filename);

    Info=imfinfo(filename);

    if Info.BitDepth>8   

    f=rgb2gray(f);

    end

    figure,

    mesh(double(f));%显示图像,类似集水盆地

    %方法1:一般分水岭分割,从结果可以看出存在过分割问题

    b=im2bw(f,graythresh(f));%二值化,注意应保证集水盆地的值较低(为0),否则就要对b取反

    d=bwdist(b);             %求零值到最近非零值的距离,即集水盆地到分水岭的距离  

      l=watershed(-d);         %matlab自带分水岭算法,l中的零值即为风水岭

    w=l==0;                  %取出边缘

    g=b&~w;                  %用w作为mask从二值图像中取值

    figure

    subplot(2,3,1),

    imshow(f);

    subplot(2,3,2),

    imshow(b);

    subplot(2,3,3),

    imshow(d);

    subplot(2,3,4),

    imshow(l);

    subplot(2,3,5),

    imshow(w);

    subplot(2,3,6),

    imshow(g);

    %方法2:使用梯度的两次分水岭分割,从结果可以看出还存在过分割问题(在方法1的基础上改进)

    h=fspecial('sobel');%获得纵方向的sobel算子

    fd=double(f);

    g=sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2);%使用sobel算子进行梯度运算

    l=watershed(g);%分水岭运算

    wr=l==0;      

     g2=imclose(imopen(g,ones(3,3)),ones(3,3));%进行开闭运算对图像进行平滑

    l2=watershed(g2);%再次进行分水岭运算

    wr2=l2==0;f2=f;

    f2(wr2)=255;

    figuresubplot(2,3,1),

    imshow(f);

    subplot(2,3,2),imshow(g);

    subplot(2,3,3),imshow(l);

    subplot(2,3,4),imshow(g2);

    subplot(2,3,5),imshow(l2);

    subplot(2,3,6),imshow(f2);

    %方法3:使用梯度加掩模的三次分水岭算法(在方法2的基础上改进)

    h=fspecial('sobel');%获得纵方向的sobel算子

    fd=double(f);

    g=sqrt(imfilter(fd,h,'replicate').^2+imfilter(fd,h','replicate').^2);%使用sobel算子进行梯度运算

    l=watershed(g);%分水岭运算

    wr=l==0;

     rm=imregionalmin(g);  %计算图像的区域最小值定位,该函数仅仅是用来观察为何分水岭算法产生这么多集水盆地

    im=imextendedmin(f,2);%上面仅是产生最小值点,而该函数则是得到最小值附近的区域,此处的附近是相差2的区域

    fim=f;                 

      fim(im)=175;              %将im在原图上标识出,用以观察

     lim=watershed(bwdist(im));%再次分水岭计算

    em=lim==0;

    g2=imimposemin(g,im|em);%在梯度图上标出im和em,im是集水盆地的中心,em是分水岭

    l2=watershed(g2);       %第三次分水岭计算

    f2=f;f2(l2==0)=255;          %从原图对分水岭进行观察

    figuresubplot(3,3,1),imshow(f);

    subplot(3,3,2),imshow(g);

    subplot(3,3,3),imshow(l);

    subplot(3,3,4),imshow(im);

    subplot(3,3,5),imshow(fim);

    subplot(3,3,6),imshow(lim);

    subplot(3,3,7),imshow(g2);

    subplot(3,3,8),imshow(l2);

    subplot(3,3,9),imshow(f2);

    以上是分水岭的算法,这是摘抄自百度知道的里的回复,感觉挺好,就年过来了。摘抄地址http://zhidao.baidu.com/question/254301763.html

    展开全文
  • 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...
  • 数学形态学以图像的形态特征为研究对象,用具有... 分水岭算法(Watershed)基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆
  • 代码实现: f=imread('C:\Users\lenovo\Desktop\3(1).bmp'); % 读入图像 figure,imshow(f); % 显示原始图像 title('原始图像'); bw=imbinarize(f,graythresh(f)); % 转换为黑白二值图像 figure;...
  • 本文算法思路参考了Nash的思路,图像也是采用Nash的图像,为叠加硬币,链接:http://opencv-code.com/tutorials/count-and-segment-overlapping-objects-with-watershed-and-distance-transform/ 本文涉及到的主要...
  • matlab分水岭算法做海岸线的提取

    千次阅读 2017-02-07 10:47:55
    先上原图: 下面是程序: rgb = imread('你图片文件');%读取原图像 I = rgb2gray(rgb);%转化为灰度图像 figure; subplot(121)%显示灰度图像 ...text(732,501,'Image courtesy of Corel',...  'FontSize',7,'...
  • matlab图像处理——分水岭法

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

    千次阅读 2018-06-29 14:29:17
    I= imread('road.jpg'); imshow(I); h=fspecial('sobel'); %h = fspecial(type) creates a two-dimensional filter h of the specified type. fspecial returns h as %a correlation kerne...
  • matlab学习之label2rgb

    千次阅读 2017-02-15 11:38:30
    输入:L——标记矩阵(可由labelmatrix, bwlabel, bwlabeln, watershed返回)  输出:RGB——彩色图像 注:根据L的数值对应,默认对应到colormap(jet)的色彩,返回RGB矩阵  RGB = label2rgb(L, map) ...
  • 分水岭算法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:一般分水岭分割,从结果可以
  • matlab分水岭算法

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

    千次阅读 2017-02-14 23:11:36
    数学形态学以图像的形态特征为研究...分水岭算法(Watershed)基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形
  • matlab实现分水岭算法处理图像分割1

    千次阅读 2018-11-15 19:50:24
    此程序为优化后的分水岭算法,避免了图像过分割 I= imread('D:\Images\pic_loc\1870405130305041503.jpg'); imshow(I);h=fspecial('sobel'); %h = fspecial(type) creates a two-dimensional filter h of ...
  • 分水岭算法详细步骤-matlab

    万次阅读 2013-05-11 15:14:38
    如果图像中的目标物体是连在一起的,则分割起来会更困难,分水岭算法经常用于处理这类问题,通常会取得比较好的效果。分水岭分割算法把图像看成一副“地形图”,其中亮度比较强的地区像素值较大,而比较暗的地区像素...
  • 标记符控制的分水岭算法原理及matlab实现

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

    千次阅读 2012-11-16 16:09:17
    Marker-Controlled Watershed Segmentation   Separating 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 ... 18
收藏数 345
精华内容 138
关键字:

watershed算法matlab