分水岭算法 c语言实现,分水岭算法的应用
上海交通大学
医学图像处理
数学形态学一个应用是分水岭算法,为了便于理解,可以将图像的灰度空间与地球表面的地形高度相类比,据此,发明了应用于图像领域的分水岭算法。
测地线距离
假设,如下图所示的一个岛屿,要从
点走到
点,虚线所表示的是最短的直线距离,也就是欧式距离,考虑到现实情况,不能穿过水面到达目标地点,所以,能够从起点到终点的实际通行路线中最短的距离成为测地线距离。
通过以上分析,给出测地线距离的定义:
给定指定连通域
,测地线距离就是
中两个像素点
和
之间的最短(可执行)路径的长度,用公式定义如下:
测地线影响域(Geodesic Influence Zone,IZ)
如下图所示,假定一个连通域
包含了若干个子区域
,用公式表示
所表示的测地线影响域为:
以上公式可以理解为,区域
中的像素点到
域的测地线距离比其他域更小的点的轨迹的集合,也就是以
域中的种子点出发,其测地线距离比其他域的种子点都要小的点集所构成的区域。如下图所示:
测地线影响域的skeleton(SKIZ)
SKIZ表示区域
中的点不属于任何一个测地线影响域,也就是域
中的点到两个测地线影响域的中测地线距离相等。区域
中构成
的SKIZ,记作
,用公式的表述如下:
注意:,
表示区域
以外的
中的所有点的集合集合
分水岭算法
如下图所示的山脉地形图,包含山谷和山峰,在水平面不断上升的过程中,会逐渐淹没掉一些较低的区域,而为了防止水溢出,需要不断在山脊上修建大坝,这个过程不断进行,最后会得到一个区域分割的效果。
在一副图像上实现分水岭算法,与上述过程相似,只不过是通过灰度值充当水平面的角色,对图像进行不断的填埋,最后得到区域分割的效果图。
如上图所示的动画中,不断用灰度值代表的水平面淹没图像中的最小值,最后得到分割后的图像。综上,分水岭算法的步骤可以总结如下:
按照图像灰度值对图像中的所有像素进行排序;
将最小的灰度值作为起始点,该灰度值也是初始阈值;
通过每次迭代加1的方式增加阈值,如果找到另外一个局部最小点,将其添加到最小点列表,然后计算和其他已存在的最小点的SKIZ,否则,计算该点和已经存在的最小点列表计算SKIZ
步骤3的过程可以理解为:以起始点为中心进行区域增长,区域增长的过程会不断接触新的邻域,而通过计算SKIZ距离的方式分配(区域增长所接触到的)邻域内的像素点,分配邻域内像素点的类别。
重复步骤3,直到所有的像素点都被分类到“盆地”(区域),或者阈值超过了最大的灰度。
如下图所示,另外一种分水岭算法的原理是,指定初始的种子点,只对种子点所在的邻域像素进行分类,而不考虑其他区域。
分水岭算法的应用实例
如下图所示的图片,以最小点开始,进行分水岭算法,会将整幅图分割成许多小区域,造成过分割的效果。为了解决这一问题,有以下三种解决方案:
通过一些平滑运算(如高斯平滑)抹掉原图中的一些较小的像素点;
增加分水岭算法的初始阈值,通过分水岭算法直接抹掉一些较小的像素点;
通过其他算法,把已经混合在一起的一些小区域进行组合,之后在通过分水岭算法分割。
最后,通过合并一些小区域再利用分水岭算法进行分割的效果如下图所示:
如下图所示,展示了通过分水岭算法分割血细胞的流程:
分水岭算法 c语言实现,分水岭算法的应用相关推荐
- 分水岭算法 c语言实现,分水岭算法MATLAB编程代码解析
close all; %% %Step 1: 彩***像->灰度图像 rgb = imread('pears.png'); I = rgb2gray(rgb); figure;subplot(1 ...
- c语言考试算法,c语言考试常用算法docx.docx
c语言考试常用算法docx 求1~100的累加和#includevoid main(){inti=1,sum=0;while (i<=100){sum+=i;i++;}printf(" ...
- c代码实现 ifft运算_fft算法c语言_matlab fft算法_ifft c语言
FFT快速算法C程序_工学_高等教育_教育专区.电子信息工程综合课程设计报告书 DSP 课程设计 报告 题学 目: 院: FFT 快速算法 C 程序 计算机与信息工程学院 09 ... fft算法代码 ...
- 函数c语言桶排算法,C语言基本排序算法之桶式排序实例
本文实例讲述了C语言基本排序算法之桶式排序.分享给大家供大家参考,具体如下: 桶式排序是对一个有n个整型元素的数组a[n],其中对任意i,0 <= a[i] <= m的特殊排序算法. 可以 ...
- 时钟页面置换算法c语言,clock置换算法例题(改进clock置换算法例题讲解)
Clock页面置换算法: 6)动态给出页面调用序列并进行调度: 7)输出置换结. C++编程要? 考试用 哪位大侠 帮帮 快点 谢谢了 这很简单啊,要打字太多了.不过网上这类算法举例很少,就看你怎么理 ...
- c语言编程实现dsa算法,C语言实现DSA算法(不包括质数生成)
1.头文件部分 #include #include #include 2.判断大数是不是0或1 参见<C语言实现RSA算法> 3.大数加减乘除幂模 参见<C语言实现RSA算法> ...
- 弗洛伊德算法c语言path,Floyd算法(弗洛伊德算法)
算法描述: Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按 ...
- 用c语言编写银行家算法,C语言实现银行家算法
<C语言实现银行家算法>由会员分享,可在线阅读,更多相关<C语言实现银行家算法(8页珍藏版)>请在人人文库网上搜索. 1.C语言实现银行家算法(源码.运行结果)一. 源码/* ...
- 最佳值换算法c语言,页面置换算法---最佳置换算法(OPT)
最佳置换算法(OPT) 什么是OPT 最佳置换算法,其所选择的被淘汰的页面将是以后永不使用的,或是在最长(未来)时间内不再被访问的页面.采用最佳置换算法通常可保证最低的缺页率.但是人们目前还无法与之, ...
- shuffle算法c语言,C#Shuffle算法(洗牌算法、抽样算法)
Fisher-Yates Shuffle算法 1.创建一个新的list 2.随机取出当前0-list.Count其中一个数 3.把老list当前随机数位置添加到新list 4.老list删除这个数 5 ...
最新文章
- 保洁阿姨看完都会了!java导出excel并下载详解
- 【牛客网多校】19-7-25-H题 Magic Line
- 不贵难得之货,使民不盗
- Altera FPGA程序固化
- php基本语法的几点备忘
- springboot maven父项目脚手架
- JDBC——Java连接关系型数据库
- 绕过tp路由器管理密码_普联(TPLink)路由器管理员密码是什么?
- mac双系统w ndows8,U盘如何安装MAC双系统
- 【转帖】mysql锁机制
- 如何免费使用jrebel 和eclipse 项目配合完成热部署功能
- 【转】qlv文件如何转换成mp4 怎样把下载好的qlv格式视频转换成MP4格式
- 人生一定要知道的十大“博弈”!
- AD域控的搭建与加入AD域
- std::partial_sort 用法
- android webview 拦截响应,android WebView拦截请求详解
- opengl光照效果的三棱锥+键盘上下左右控制旋转(学习笔记-仅供参考)
- 同元车辆模型库——TA系列
- 服务器CPU跑满了怎么办
- 【Stephen Boyd】【1994】系统与控制理论中的线性矩阵不等式