没有合适的资源?快使用搜索试试~ 我知道了~
C++实现分水岭算法(Watershed Algorithm)
5星 · 超过95%的资源 31 下载量 161 浏览量
2020-08-28
05:01:06
上传
评论 1
收藏 72KB PDF 举报
温馨提示
试读
4页
主要为大家详细介绍了C++实现分水岭算法Watershed Algorithm,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
资源推荐
资源详情
资源评论
C++实现分水岭算法(实现分水岭算法(Watershed Algorithm))
主要为大家详细介绍了C++实现分水岭算法Watershed Algorithm,具有一定的参考价值,感兴趣的小伙伴们可
以参考一下
分水岭分割方法(Watershed Segmentation),是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是
测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水
盆的边界则形成分水岭。分水岭的概念和形成可以通过模拟浸入过程来说明。在每一个局部极小值表面,刺穿一个小孔,然后
把整个模型慢慢浸入水中,随着浸入的加深,每一个局部极小值的影响域慢慢向外扩展,在两个集水盆汇合处构筑大坝,即形
成分水岭。
分水岭的计算过程是一个迭代标注过程。分水岭比较经典的计算方法是L. Vincent提出的。在该算法中,分水岭计算分两
个步骤,一个是排序过程,一个是淹没过程。首先对每个像素的灰度级进行从低到高排序,然后在从低到高实现淹没过程中,
对每一个局部极小值在h阶高度的影响域采用先进先出(FIFO)结构进行判断及标注。
分水岭变换得到的是输入图像的集水盆图像,集水盆之间的边界点,即为分水岭。显然,分水岭表示的是输入图像极大值
点。因此,为得到图像的边缘信息,通常把梯度图像作为输入图像,即:
grad(f(x,y))=((f(x-1,y)-f(x+1,y))^2 + (f(x,y-1)-f(x,y+1))^2)^0.5
式中,f(x,y)表示原始图像,grad(.)表示梯度运算。
分水岭算法对微弱边缘具有良好的响应,图像中的噪声、物体表面细微的灰度变化,都会产生过度分割的现象。但同时应
当看出,分水岭算法对微弱边缘具有良好的响应,是得到封闭连续边缘的保证的。另外,分水岭算法所得到的封闭的集水盆,
为分析图像的区域特征提供了可能。
为消除分水岭算法产生的过度分割,通常可以采用两种处理方法,一是利用先验知识去除无关边缘信息。二是修改梯度函
数使得集水盆只响应想要探测的目标。
为降低分水岭算法产生的过度分割,通常要对梯度函数进行修改,一个简单的方法是对梯度图像进行阈值处理,以消除灰
度的微小变化产生的过度分割。即:
g(x,y)=max(grad(f(x,y)),gθ)
式中,gθ表示阈值。
程序可采用方法:用阈值限制梯度图像以达到消除灰度值的微小变化产生的过度分割,获得适量的区域,再对这些区域的
边缘点的灰度级进行从低到高排序,然后在从低到高实现淹没的过程,梯度图像用Sobel算子计算获得。对梯度图像进行阈值
处理时,选取合适的阈值对最终分割的图像有很大影响,因此阈值的选取是图像分割效果好坏的一个关键。缺点:实际图像中
可能含有微弱的边缘,灰度变化的数值差别不是特别明显,选取阈值过大可能会消去这些微弱边缘。
下面用C++实现分水岭算法:
#define _USE_MATH_DEFINES
#include <cstddef>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <cfloat>
#include <ctime>
#include <cmath>
#include <cassert>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
typedef void GVVoid;
typedef bool GVBoolean;
typedef char GVChar;
typedef unsigned char GVByte;
typedef short GVInt16;
typedef unsigned short GVUInt16;
typedef int GVInt32;
typedef unsigned int GVUInt32;
typedef long long GVInt64;
typedef unsigned long long GVUInt64;
typedef float GVFloat32;
typedef double GVFloat64;
const GVBoolean GV_TRUE = true;
const GVBoolean GV_FALSE = false;
const GVByte GV_BYTE_MAX = UCHAR_MAX;
const GVInt32 GV_INT32_MAX = INT_MAX;
const GVInt32 GV_INT32_MIX = INT_MIN;
const GVInt64 GV_INT64_MAX = LLONG_MAX;
const GVInt64 GV_INT64_MIN = LLONG_MIN;
const GVFloat32 GV_FLOAT32_MAX = FLT_MAX;
const GVFloat32 GV_FLOAT32_MIN = FLT_MIN;
const GVFloat64 GV_FLOAT64_MAX = DBL_MAX;
资源评论
- BJWcn2023-07-24这份文件提供了一些实际的代码示例,有助于读者更好地理解算法的实现原理。
- 柔粟2023-07-24对于初学者而言,这份文件是一个很好的入门资料,可以帮助他们快速上手分水岭算法。
- 查理捡钢镚2023-07-24对于想了解分水岭算法的人来说,这个文件是一个很好的指南。
- RandyRhoads2023-07-24这个文件讲解了C语言中分水岭算法的实现,内容简明扼要。
- 邢小鹏2023-07-24文档结构清晰,逻辑性强,可以很容易地理解和学习。
weixin_38689027
- 粉丝: 5
- 资源: 888
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功