分水岭算法源代码及其分析和注释

合集下载

分水岭分割算法原理

分水岭分割算法原理

分水岭分割算法原理
嘿,朋友!今天咱就来聊聊这神奇的分水岭分割算法原理。

你知道吗,这分水岭分割算法就像是一个超级侦探,能把复杂的图像分割得清清楚楚!比如说,咱看一张有好多物体混合在一起的图片,就像一个乱糟糟的房间。

而分水岭算法呢,就是那个能把房间里的东西一一整理清楚,区分开来的厉害角色!
它是怎么做到的呢?哎呀,就好像它在图像上慢慢行走,根据不同区域的特点来划分边界。

就拿山脉来类比吧,分水岭不就是那些把水流分开的山脊嘛!这算法也是在找那些能把图像区域分开的“山脊线”呢!
想象一下,图像中的不同区域就像是不同的群体,而分水岭算法能精准地把它们区分开,这多牛啊!比如说有张照片,里面有个红苹果和一个绿梨子,那分水岭算法就能清楚地把苹果和梨子各自归为一类,从不会搞混。

咱再想想,如果没有这个算法,那我们要处理图像得多麻烦呀!那简直就像在黑暗中摸索,不知所措。

但有了它,就像是打开了一盏明灯,一下子就把路给照亮了!
这分水岭分割算法原理啊,真的是太神奇、太有用了!它让我们能更轻松地处理图像,让图像变得更清晰、更有条理。

难道你不想更深入地了解它吗?反正我觉得它真的是超级棒的!它就是图像处理领域的一颗耀眼明星啊!。

分水岭算法(完整版)

分水岭算法(完整版)
分水岭分割算法的实现 与分析
青 衣
11053413 李小泷
• 分水岭算法实现步骤:先把图片转化为灰度梯度级图像, 在图像梯度空间内逐渐增加一个灰度阈值,每当它大于一 个局部极大值时,就把当时的二值图像(只区分陆地和水 域,即大于灰度阈值和小于灰度阈值两部分)与前一个时 刻(即灰度阈值上一个值的时刻)的二值图像进行逻辑异或 (XOR)操作,从而确定出灰度局部极大值的位置 。根据所 有灰度局部极大值的位置集合就可确定分水岭。
Lrgb = label2rgb(L, 'jet', 'w', 'shuffle');%转 化为伪彩色图像 subplot(122); imshow(Lrgb)%显示伪彩色图 像 title('分水岭伪彩色图像') 青 衣
figure; imshow(I), hold on himage = imshow(Lrgb);%在原图上显示 伪彩色图像 set(himage, 'AlphaData', 0.3); title('原图像上的Lrgb处理')
imcomplement(Iobr));%形态学重建 Iobrcbr = imcomplement(Iobrcbr);%图像求反 subplot(122); imshow(Iobrcbr), %显示重建求反后的 图像 title('重建求反后的图像(Iobrcbr)')
fgm = imregionalmax(Iobrcbr);%局部极大值 figure; imshow(fgm), %显示重建后局部极大值图像 title('重建后局部极大值图像(fgm)')
此时再进行分水岭变换并显示得到的效果。

分水岭 算法

分水岭 算法

分水岭算法1. 简介分水岭算法(Watershed algorithm)是一种图像分割算法,可以将图像中的不同区域进行分离和标记。

它基于图像的灰度值和梯度信息,将图像看作一个地形地貌,并从低处向高处逐渐充满水,直到不同区域之间的水汇聚形成分割线。

该算法最初是由Belknap和Hoggan在1979年提出的,后来被广泛应用于计算机视觉领域,特别是在医学图像处理、目标检测和图像分析等方面。

2. 原理2.1 灰度变换在进行分水岭算法之前,需要对原始图像进行灰度变换。

这可以通过将彩色图像转换为灰度图像来实现。

灰度图像中的每个像素点都代表了原始彩色图像中相应位置的亮度值。

2.2 梯度计算接下来,需要计算灰度图像中每个像素点的梯度值。

梯度表示了亮度变化的速率,可以帮助我们找到不同区域之间的边界。

常用的梯度计算方法有Sobel、Prewitt和Scharr等算子。

这些算子对图像进行卷积操作,将每个像素点的梯度计算为其周围像素点的亮度差值。

2.3 标记初始化在进行分水岭算法之前,需要为每个像素点初始化一个标记值。

通常情况下,我们可以将背景区域标记为0,前景区域标记为正整数。

2.4 梯度图像处理接下来,我们将梯度图像中的每个像素点看作一个地形地貌中的一个位置,并将其灌满水。

初始时,所有像素点的水位都是0。

2.5 水汇聚从灰度最小值开始,逐渐增加水位直到灰度最大值。

在每次增加水位时,会发生以下情况: - 当前水位高于某个位置的梯度值时,该位置被认为是不同区域之间的边界。

- 如果两个不同区域之间存在连接路径,则会发生水汇聚现象。

此时需要将这两个区域合并,并更新合并后区域的标记值。

2.6 分割结果当水位达到最大值时,分割过程结束。

此时所有不同区域之间都有了明确的边界,并且每个区域都有了唯一的标记值。

3. 算法优缺点3.1 优点•分水岭算法是一种无监督学习方法,不需要依赖任何先验知识或训练数据。

•可以对图像中的任意区域进行分割,不受形状、大小和数量的限制。

分水岭算法——MATLAB

分水岭算法——MATLAB
% These operations will create flat maxima inside each object that can be located using imregionalmax.
% 有多种方法可以应用在这里来获得前景标记,这些标记必须是前景对象内部的连接斑点像素。这个例子中,将使用形态学技术“基于开的重建”和“基于闭的重建”来清理图像。
% 接下来,通过腐蚀后重建来做基于开的重建计算。
Ie = imerode(I, se);
Iobr = imreconstruct(Ie, I);
figure('units', 'normalized', 'position', [0 0 1 1]);
subplot(1, 2, 1); imshow(I, []); title('灰度图像');
% 使用MATLAB图像处理工具箱
% 注:期间用到了很多图像处理工具箱的函数,例如fspecial、imfilter、watershed、label2rgb、imopen、
% imclose、imreconstruct、imcomplement、imregionalmax、bwareaopen、graythresh和imimposemin函数等。
% The gradient is high at the borders of the objects and low (mostly) inside the objects.
% 使用Sobel边缘算子对图像进行水平和垂直方向的滤波,然后求取模值,sobel算子滤波后的图像在边界处会显示比较大的值,在没有边界处的值会很小。
figure('units', 'normalized', 'position', [0 0 1 1]);

C++中实现OpenCV图像分割与分水岭算法

C++中实现OpenCV图像分割与分水岭算法

C++中实现OpenCV图像分割与分⽔岭算法分⽔岭算法是⼀种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从⽽将在空间位置上相近并且灰度值相近的像素点互相连接起来构成⼀个封闭的轮廓,封闭性是分⽔岭算法的⼀个重要特征。

API介绍void watershed( InputArray image, InputOutputArray markers );参数说明:image: 必须是⼀个8bit 3通道彩⾊图像矩阵序列markers: 在执⾏分⽔岭函数watershed之前,必须对第⼆个参数markers进⾏处理,它应该包含不同区域的轮廓,每个轮廓有⼀个⾃⼰唯⼀的编号,轮廓的定位可以通过Opencv中findContours⽅法实现,这个是执⾏分⽔岭之前的要求。

算法会根据markers传⼊的轮廓作为种⼦(也就是所谓的注⽔点),对图像上其他的像素点根据分⽔岭算法规则进⾏判断,并对每个像素点的区域归属进⾏划定,直到处理完图像上所有像素点。

⽽区域与区域之间的分界处的值被置为“-1”,以做区分。

我们将⼀个如何使⽤距离变换和分⽔岭分割相互接触的物体的例⼦。

考虑⼀下下⾯的硬币图像,这些硬币相互接触。

即使你去阈值化它,它也会互相碰触。

我们从找到硬币的⼤概估计值开始。

为此,我们可以利⽤⼤津的⼆值化。

#include<iostream>#include<opencv2\opencv.hpp>using namespace std;using namespace cv;int main() {Mat gray, thresh;Mat img = imread("coins.jpg");cvtColor(img, gray, COLOR_BGR2GRAY);threshold(gray, thresh, 0, 255, THRESH_BINARY_INV+CV_THRESH_OTSU);imshow("Otst阈值图像", thresh);waitKey(0);return 0;}阈值后的图像如下所⽰:现在需要去除图像中任何微⼩的⽩⾊噪声。

【谷速软件】matlab源码-标记分水岭分割算法

【谷速软件】matlab源码-标记分水岭分割算法

Step 1: Read in the Color Image and Convert it to Grayscale第一步:读入彩色图像,将其转化成灰度图像clc; clear all; close all;rgb = imread('pears.png');if ndims(rgb) == 3I = rgb2gray(rgb);elseI = rgb;endfigure('units', 'normalized', 'position', [0 0 1 1]);subplot(1, 2, 1); imshow(rgb); title('原图');subplot(1, 2, 2); imshow(I); title('灰度图');Step 2: Use the Gradient Magnitude as the Segmentation Function第2步:将梯度幅值作为分割函数Use the Sobel edge masks, imfilter, and some simple arithmetic to compute the gradient magnitude. The gradient is high at the borders of the objects and low (mostly) inside the objects.使用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', 'position', [0 0 1 1]);subplot(1, 2, 1); imshow(I,[]), title('灰度图像')subplot(1, 2, 2); imshow(gradmag,[]), title('梯度幅值图像')Can you segment the image by using the watershed transform directly on the gradient magnitude?可否直接对梯度幅值图像使用分水岭算法?L = watershed(gradmag);Lrgb = label2rgb(L);figure('units', 'normalized', 'position', [0 0 1 1]);subplot(1, 2, 1); imshow(gradmag,[]), title('梯度幅值图像')subplot(1, 2, 2); imshow(Lrgb); title('梯度幅值做分水岭变换')No. Without additional preprocessing such as the marker computations below, using the watershed transform directly often results in "oversegmentation."直接使用梯度模值图像进行分水岭算法得到的结果往往会存在过度分割的现象。

3种不同的分水岭分割方法以及三种方法的比较

3种不同的分水岭分割方法以及三种方法的比较

程序代码:(代码标记[code]...[/code] )clear,clc%三种方法进行分水岭分割%读入图像filename='Fig1021(a)(small-blobs).tif';f=imread(filename);Info=imfinfo(filename);if Info.BitDepth>8f=rgb2gray(f);endfigure,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从二值图像中取值figuresubplot(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);。

分水岭分割算法-watershed工具箱

分水岭分割算法-watershed工具箱
• 过分割现象: 对微弱边缘具有良好的响应,图像中的噪 声、物体表面细微的灰度变化,都会产生过度分割的现象;
• 为消除分水岭算法产生的过度分割,通常可以采用两种处 理方法: 一是利用先验知识去除无关边缘信息。 二是修改梯度函数使得集水盆只响应想要探测的目标。
3. Matlab演示
• 代码: • clear; close all; clc; • rgb = imread('forest.png'); • • f = rgb2gray( rgb ); • figure(1); • imshow(rgb); • title('原始图像'); • • fgm = imregionalmax(f); • D = bwdist(fgm);%¼ÆËã¾àÀë • DL = watershed(D);%·ÖË®Áë±ä»» • bgm = DL == 0;%ÇóÈ¡·Ö¸î±ß½ç • f0 = f; • f0(bgm) = 255; • • figure(2); • imshow(f0); • title('»ùÓÚ¾àÀë±ä»»µÄ·ÖË®Áë·Ö¸î');
• b. 为得到图像的边缘信息,通常把梯度图像作为输入图像 进行处理。
分水岭脊线
汇水盆地
a
b
c
1. a中红色箭头指示区域为谷底,代表低亮度像素;黄色 箭头所示为山脊,代表高亮度像素;
2. b中灰色部分表示水从谷底逐渐涨高后的状态; 3. C中表示水面到达一定程度后留下的分水岭(最高点)
3. 不足
• f1 = f;
• f1(wr) = 255;

• figure(3);
• imshow(f1);
• title('»ùÓÚÌݶȵķÖË®Áë·Ö¸î');
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档