分水岭算法MATLAB编程代码解析

close all;

%%

%Step 1: 彩***像->灰度图像

rgb = imread(‘pears.png‘);

I = rgb2gray(rgb);

figure;subplot(121)

imshow(I)

%Step 2: 利用梯度实现图像的分割

%使用sobel算子进行边缘检测,

text(732,501,‘Image courtesy of Corel‘,‘FontSize‘,7,‘HorizontalAlignment‘,‘right‘)

hy = fspecial(‘sobel‘);

hx = hy‘;

Iy = imfilter(double(I), hy, ‘replicate‘);%实现线性空间滤波函数,一种采用滤波处理的影像增强方法。其理论基础是空间卷积和空间相关。目的是改善影像质量,包括去除高频噪声与干扰,及影像边缘增强、线性增强以及去模糊等。

Ix = imfilter(double(I), hx, ‘replicate‘);

gradmag = sqrt(Ix.^2 + Iy.^2);%求模

subplot(122), imshow(gradmag,[]), title(‘gradmag‘)

%直接用分水岭

%L=watershed(gradmag);

%Lrgb=label2rgb(L);

%figure;imshow(Lrgb),

%title(‘Lrgb‘)

%No. 如果没有额外的预处理,如下面的标记计算,使用分水岭变换直接结果往往是“过度分割。”

% 以下是标记前景和背景物体

%各种程序可以在这里应用到找到前景标记,它必须连接内的每个前景对象的像素的斑点。在这个例子中,你将使用名为“开放由重建”及以上的图像“闭合由重建”为“干净”的形态学技术。这些操作将创建一个可以使用imregionalmax位于每个对象内部平最大值。

%Step 3:形态学开操作

se = strel(‘disk‘, 20);%圆形结构元素

Io = imopen(I, se);%形态学开操作

figure;subplot(121)

imshow(Io), title(‘Io‘)%显示执行后的图

%Step 4:腐蚀与重建

Ie = imerode(I, se);%对图像进行腐蚀

Iobr = imreconstruct(Ie, I);%对图像进行重建

subplot(122);imshow(Iobr), %显示重建后的图像

title(‘Iobr‘)

%Step 5:形态学关操作

Ioc = imclose(Io, se);%形态学关操作

figure;subplot(121)

imshow(Ioc),

title(‘Ioc‘)

%Step 6:图像膨胀与求反

Iobrd = imdilate(Iobr, se);%对图像进行膨胀

Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr));

Iobrcbr = imcomplement(Iobrcbr);%对图像求反

subplot(122);imshow(Iobrcbr),

title(‘Iobrcbr‘)

%%Step 7:获得局部最大值

fgm = imregionalmax(Iobrcbr);%获得局部最大值

figure;imshow(fgm),

title(‘fgm‘)

%Step 8:在原图上显示极大值区域

I2 = I;

I2(fgm) = 255;%局部极大值处像素值设为255

figure;imshow(I2),

title(‘fgm superimposed on original image‘)%在原图上显示极大值区域

se2 = strel(ones(5,5));%构建元素

fgm2 = imclose(fgm, se2);%关操作

fgm3 = imerode(fgm2, se2);%腐蚀

fgm4 = bwareaopen(fgm3, 20);%开操作

%Step 9:显示修改后的极大区域

I3 = I;

I3(fgm4) = 255;%前景设置为255

figure;subplot(121),

imshow(I3)%显示修改后的极大区域

title(‘fgm4 superimposed on original image‘)

%现在标记背景, 在清理后的图像,Iobrcbr,暗像素属于背景,所以你可以从一个阈值操作。

%Step 10:转化为二值图像

bw = im2bw(Iobrcbr, graythresh(Iobrcbr));

subplot(122);imshow(bw),

title(‘bw‘)

%背景像素是黑色的,但理想地,我们不希望的背景标记是太靠近我们目标对象的边缘。我们通过‘骨骼化‘进行细分,对二值图像的距离进行分水岭变换,然后寻找分水岭的界线。

%Step 11:

D = bwdist(bw);%计算距离

DL = watershed(D);%分水岭变换

bgm = DL == 0;%求取分割边界

figure; imshow(bgm), %显示分割后的边界

title(‘Watershed ridge lines (bgm)‘)

gradmag2 = imimposemin(gradmag, bgm | fgm4);%置最小值

L = watershed(gradmag2);%分水岭变换

I4 = I;

I4(imdilate(L == 0, ones(3, 3)) | bgm | fgm4) = 255;%前景及边界处置255

figure; subplot(121)

imshow(I4)%突出前景及边界

title(‘Markers and object boundaries‘)

Lrgb = label2rgb(L, ‘jet‘, ‘w‘, ‘shuffle‘);%转化为伪彩***像

subplot(122); imshow(Lrgb)%显示伪彩***像

title(‘Colored watershed label matrix‘)

figure; imshow(I),

hold on

himage = imshow(Lrgb);%在原图上显示伪彩***像

set(himage, ‘AlphaData‘, 0.3);

title(‘Lrgb superimposed transparently on original image‘)

时间: 2024-10-21 03:05:13

分水岭算法MATLAB编程代码解析的相关文章

编程算法 - 丑数 代码(C)

丑数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 我们把只包含因子2, 3 和 5的数称作丑数. 求按从小到大的顺序的第5个丑数. 可以设置一个数组包含所需要的丑数, 依次比较乘以2, 乘以3, 乘以5的最小的数, 最后返回结果. 如第5个丑数是5, 如1, 2, 3, 4(2*2), 5均是丑数. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*ecli

编程算法 - 硬币问题 代码(C)

硬币问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有1, 5, 10, 50, 100, 500元硬币各若干枚, 现在要用这些硬币来支付A元, 最少需要多少枚硬币? 假定本题至少存在一种支付方案. 使用贪心算法, 优先选用最大的硬币, 并不断的调整硬币的数量. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author: spike */ /*eclipse cdt, gcc 4.8.1

编程算法 - 区间调度问题 代码(C)

区间调度问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n项工作, 每项工作分别在s时间开始, 在t时间结束. 对于每项工作可以选择参与与否, 如果参与, 则全程参与. 参与时间段不能重叠, 包括起始结束瞬间也不能重叠. 求最多能参与多少项工作? 使用贪心法, 策略是在可选工作中, 每次都选取结束时间最早的工作. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author: spike

编程算法 - 二分图判定 代码(C)

二分图判定 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定一个具有n个顶点的图. 要给图上每个顶点染色, 并且要使相邻的顶点颜色不同.  是否能最多用2种颜色进行染色. 没有重边和闭环. 即二分图问题. 使用深度优先搜索(dfs), 把顶点染成c, 然后相邻边染成-c. 如果相邻边被染色过, 且相同, 则图不是二分图; 如果所有边都被染色, 并且互不相同, 则是二分图. 进行多次搜索, 避免非连通图. 代码: /* * CppPrim

编程算法 - 部分和问题 代码(C)

部分和问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 给定整数a1, a2, ..., an, 判断是否可以从中选出若干数, 使它们的和恰好为k. 解法很多, 最简单的解法是使用深度优先搜索, 时间复杂度O(2^n), 不是最优解法. 代码: /* * main.cpp * * Created on: 2014.7.13 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <s

编程算法 - 背包问题(递归) 代码(C)

背包问题(递归) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n个重量和价值分别为w,v的物品, 从这些物品中挑选出总重量不超过W的物品, 求所有挑选方案中价值总和的最大值. 即经典动态规划问题. 可以使用深度优先搜索, 把每个部分都遍历到, 选取最优解, 但不是最好的方法. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author: spike */ /*eclipse cdt, gc

编程算法 - 字符串相同 代码(Java)

字符串相同 代码(Java) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 实现一个算法, 确定一个字符串的所有字符是否全都不同. 假使不允许使用额外的数据结构, 又该如何处理. 解法1: 使用数据结构, 设置boolean数组, 把值(value)作为数组的索引(index), 判断数组是否重复. 解法2: 不使用数据结构, 可以通过位(bit)进行判断, 把每个字母映射2进制数的一位, 或运算("|")更新数字的位, 与运算("

抖音去水印代码解析部分代码,抖音xgorgon还有设备参数生成算法

抖音xgorgon还有设备参数生成算法 xgorgon有了他做什么用呢? 可以获取用户所有作品列表 获取抖音搜索热门列表 获取正在直播的用户购物车数据 获取抖音 粉丝列表 如果老同一个设备去请求 就会请求不到数据, 而设备算法 就是让你去频繁去请求的时候. 下面就是部分代码示例,需要算法可以在向我发送邮件.[email protected] 在分享一下抖音的去水印代码解析,当然不只是这一种写法,还有很多种,你要了解他的原理. @PostMapping("geturl") public

Matlab编程基础

平台:Win7 64 bit,Matlab R2014a(8.3) "Matlab"是"Matrix Laboratory" 的缩写,中文"矩阵实验室",是强大的数学工具.本文侧重于Matlab的编程语言侧面,讲述Matlab的基本语法,以及用Matlab语言进行程序设计.值得一提的是,Matlab从R2014a版本开始支持中文语言了! 1.基本概念 Matlab默认启动后界面: Matlab有关的文件后缀: File Extension Des