经典分水岭算法的 C++ 实现
这个程序是研一下学期的计算机视觉课程大作业,完成于 2013/06/16,是对 Soille 和 Vincent(1991)提出的模拟浸没的分水岭算法的实现,详见下面的报告。
源码托管在 Github 上:点击进入链接
可执行程序及测试图片:点击进入链接
一、算法概述:
分水岭算法是一种图像分割算法,本报告是对Soille和Vincent(1991)提出的模拟浸没的分水岭算法的实现,算法包括2个部分:第一个部分是排序;第二部分为泛洪。算法描述如下:
(1)将原图像转为二值图,对各像素点的灰度值进行从小到大排序,相同的灰度值为同一个层级。
(2)处理第一个层级所有的像素点,如果其邻域已经被标识属于某一个区域,则将这个像素加入一个先进先出的队列。
(3)先进先出队列非空时,弹出第一个元素。扫描该像素的邻域像素,如果其邻域像素的灰度属于同一层(灰度值相等),则根据邻域像素的标识来刷新该像素的标识。一直循环到队列为空。
(4)再次扫描当前灰度值层级的像素,如果还有像素未被标识,说明它是一个新的极小区域,则当前区域的值(当前区域的值从0开始计数)加1后赋值给该为标识的像素。然后从该像素出发继续执行步骤(3)的泛洪直至没有新的极小区域。
(5)返回步骤(2),处理下一个灰度值层级的像素,直至所有层级的像素都被处理。
二、算法实现(C++、opencv、VS2010):
1、主要类说明(具体说明见附录源码中的注释):
(1)WatershedPixel类:根据灰度值对图像像素进行排序。
(2)WatershedStructure类:用于存储像素点WatershedPixel,并生成各像素点的邻域像素。
(3)WaterShedAlgorithm类:分水岭核心算法,包括图像预处理,泛洪和分水线绘制。
2、使用说明:
在命令提示符(cmd)中进入ws.exe(分水岭算法的可执行文件)和图片所在文件夹,
输入:ws image_name
输出:
image_name_BW.jpg ——原图像对应的二值图
image_name_Gray.jpg ——原图像对应的灰度图
image_name_Gray_WS.jpg ——在灰度图中绘制的分水线
image_name_WS.jpg ——在黑色背景中绘制的分水线
3、其他说明:
本算法实现借助开源的opencv库对图像进行读取、输出和预处理(格式转换等),ws.exe运行时需要opencv相关的动态链接库(附件中的dll文件)。
三、算法测试:
1、灰度图:
2、彩色图:
四、结果分析:
(1)该算法实现相对简单,速度快,分割效果不错。
(2)但是在噪声影响下会出现过分割,可在执行算法之前进行预处理,比如平滑降噪,以及利用梯度。
(3)对细节太多的彩色图片存在过分割。
经典分水岭算法的 C++ 实现的更多相关文章
- python数字图像处理(19):骨架提取与分水岭算法
骨架提取与分水岭算法也属于形态学处理范畴,都放在morphology子模块内. 1.骨架提取 骨架提取,也叫二值图像细化.这种算法能将一个连通区域细化成一个像素的宽度,用于特征提取和目标拓扑表示. m ...
- 【十大经典数据挖掘算法】PageRank
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 我特地把PageRank作为[十大经 ...
- 【十大经典数据挖掘算法】EM
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 极大似然 极大似然(Maxim ...
- 【十大经典数据挖掘算法】AdaBoost
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 集成学习 集成学习(ensem ...
- 【十大经典数据挖掘算法】SVM
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART SVM(Support Vector ...
- 经典排序算法 – 插入排序Insertion sort
经典排序算法 – 插入排序Insertion sort 插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种, ...
- 【十大经典数据挖掘算法】Naïve Bayes
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 朴素贝叶斯(Naïve Bayes) ...
- 【十大经典数据挖掘算法】C4.5
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 决策树模型与学习 决策树(de ...
- 【十大经典数据挖掘算法】k-means
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 引言 k-means与kNN虽 ...
随机推荐
- SQL判断字符类型是否为数字
用ISNUMERIC函数 确定表达式是否为一个有效的数字类型. 语法 ISNUMERIC ( expression ) 参数 expression 要计算的表达式. 返回类型 int 注释 当输入表达 ...
- PAT 1066. 图像过滤(15)
图像过滤是把图像中不重要的像素都染成背景色,使得重要部分被凸显出来.现给定一幅黑白图像,要求你将灰度值位于某指定区间内的所有像素颜色都用一种指定的颜色替换. 输入格式: 输入在第一行给出一幅图像的分辨 ...
- Python获取位数
import platform platform.architecture()
- 剑指offer 面试22题
面试22题: 题目:链表中倒数第k个节点 题:输入一个链表,输出该链表中倒数第k个结点. 解题思路:为了实现只遍历链表一次就能找到倒数第k个节点,我们可以定义两个指针.让第一个指针先向前走k-1步,第 ...
- Way to Git
最近在学习Git,我先后在CentOS6.4, Ubuntu12.04, Windows7上安装Git,遇到的问题比较多的是在CentOS上的安装,Ubuntu和Windows7上的安装相对比较简单, ...
- linux 后台进程管理利器supervisor
Linux的后台进程运行有好几种方法,例如nohup,screen等,但是,如果是一个服务程序,要可靠地在后台运行,我们就需要把它做成daemon,最好还能监控进程状态,在意外结束时能自动重启. ...
- 2015/7/29 (高开,V形反转,各种指标背离——可惜没买进,填补空缺图形的心理分析)
1.李大--謝先生℡:早盘决策:如今日再次出现大幅低开 或者盘中大幅下跌可逢低 3成仓位左右分散资金做短线抄底,切记是超短 绝不追高,设置5个点止损.市场有很多名家在谈论3373点即前低点,本人告诉 ...
- Android下拉快捷设置面板添加快捷开关流程
快速设定面板上快捷开关的加载流程,包括图标等的加载和点击事件等的处理过程,以及创建一个快捷开关的主要过程(以增加一个锁屏开关为例).本文所讨论的Android版本为5.1. 快捷开关的加载流程 资源模 ...
- asp.net 下载图片
public class DownLoad : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Res ...
- for语句中多重定义
"}; vector<string> vecStr(Arr, Arr + sizeof(Arr)/sizeof(string)); , sz = vecStr.size(); i ...