关于分水岭分割的理解可以看这篇文章图像分割之分水岭,比较形象。
分水岭变换函数:
watershed函数
下面这是matlab官方给的watershed函数例子。
clear all; clc; close all; center1 &#61; -40;%第一个圆圆心的横坐标center2 &#61; -center1;%第二个圆圆心的横坐标dist &#61; sqrt(2*(2*center1)^2);%计算两个圆心之间的距离radius &#61; dist/2 * 1.4;%圆的半径为两者距离的一半的1.4倍&#xff0c;即两个圆肯定会相交lims &#61; [floor(center1-1.2*radius) ceil(center2&#43;1.2*radius)];%floor 向下取整 ceil向上取整 为整个图像的大小[x,y] &#61; meshgrid(lims(1):lims(2));%生成一个69*69的网格平面bw1 &#61; sqrt((x-center1).^2 &#43; (y-center1).^2) <&#61; radius;%计算每个坐标的跟&#xff08;-10&#xff0c;-10&#xff09;和&#xff08;10&#xff0c;10&#xff09;的距离&#xff0c;如果小于半径则置1&#xff0c;否则置0bw2 &#61; sqrt((x-center2).^2 &#43; (y-center2).^2) <&#61; radius;bw &#61; bw1 | bw2;%两个二值图像按位相或&#xff0c;合并在一起figure, imshow(bw,&#39;InitialMagnification&#39;,&#39;fit&#39;), title(&#39;bw&#39;)%显示两个相或之后的结果D &#61; bwdist(~bw);%对bw求反&#xff0c;然后求距离变换之后的结果figure, imshow(D,[],&#39;InitialMagnification&#39;,&#39;fit&#39;)%画出距离变换之后的结果title(&#39;Distance transform of ~bw&#39;)%标题D &#61; -D;%对距离变换之后的结果求负值,因为盆地涨水过程是从低到高&#xff0c;灰度值就从小到大
% D(~bw) &#61; -Inf;%把~bw中1的部分全部置为-Inf&#xff0c;也可以在下面让L(~bw)&#61;0% 功能&#xff1a;分水岭变换% 用法&#xff1a;L &#61; watershed(A) % 输入&#xff1a;A——输入矩阵(任意维数)% 输出&#xff1a;L——分水岭标记矩阵% 注&#xff1a;L为整数(>&#61;0)&#xff0c;标记0不属于分水岭区域&#xff0c;标记1属于第1个分水岭区域&#xff0c;标记2属于第2个分水岭区域&#xff0c;以此类推。% 默认对二维矩阵使用8连通&#xff0c;三维矩阵使用26连通&#xff0c;高维矩阵使用conndef(ndims(A),&#39;maximal&#39;)来定义连通性。% % L &#61; watershed(A, conn) specifies the connectivity to be used in the watershed computation. conn can have any of the following scalar values.% 输入&#xff1a;A——输入矩阵、conn——连通性% 输出&#xff1a;L——分水岭标记矩阵 L &#61; watershed(D); %-1的位置置为0&#xff0c;其他位置分别为1&#xff0c;2&#xff0c;3L(~bw)&#61;0% 功能&#xff1a;转换标记矩阵到RGB图像% 用法&#xff1a;RGB &#61; label2rgb(L) % 输入&#xff1a;L——标记矩阵(可由labelmatrix, bwlabel, bwlabeln, watershed返回) % 输出&#xff1a;RGB——彩色图像% 注&#xff1a;根据L的数值对应&#xff0c;默认对应到colormap(jet)的色彩&#xff0c;返回RGB矩阵 % RGB &#61; label2rgb(L, map)% 输入&#xff1a;L——标记矩阵(可由labelmatrix, bwlabel, bwlabeln, watershed返回)、map——颜色映射表 % 输出&#xff1a;RGB——彩色图像% 注&#xff1a;map为n*3的矩阵&#xff0c;可以通过MATLAB的colormap函数来返回&#xff0c;比如colormap(&#39;jet&#39;)等。也可以根据要求自己定义。默认为colormap(jet)。 % RGB &#61; 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.% 输入&#xff1a;L——标记矩阵(可由labelmatrix, bwlabel, bwlabeln, watershed返回)、map——颜色映射表、zerocolor——对应于标记0的颜色 % 输出&#xff1a;RGB——彩色图像 b% 注&#xff1a;zerocolor可以取值如表1.1&#xff0c;默认为[1 1 1]&#xff0c;即白色。 % 表1.1 取值列表 % Value % Color % &#39;b&#39; % 蓝色% &#39;c&#39; % 蓝绿色% &#39;g&#39; % 绿色% &#39;k&#39; % 黑色% &#39;m&#39; % 洋红色% &#39;r&#39; % 红色% &#39;w&#39; % 白色% &#39;y&#39; % 黄色% RGB &#61; label2rgb(L, map, zerocolor, order)% 输入&#xff1a;L——标记矩阵(可由labelmatrix, bwlabel, bwlabeln, watershed返回)、map——颜色映射表、zerocolor——对应于标记0的颜色、order——标记矩阵和颜色映射表对应方式% 输出&#xff1a;RGB——彩色图像 % 注&#xff1a;order默认为noshuffle&#xff0c;即根据L的数值来对应颜色。另外可以取值为shuffle&#xff0c;说明使用伪随机方式来对应。rgb &#61; label2rgb(L,&#39;jet&#39;,[.5 .5 .5]);%label2rgb(L, map, zerocolor) ,&#64;jet彩色 &#64;gray灰色figure, imshow(rgb,&#39;InitialMagnification&#39;,&#39;fit&#39;)title(&#39;Watershed transform of D&#39;)