经典分水岭算法的 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)对细节太多的彩色图片存在过分割。
最新文章
- window下,加载redis拓展
- 【转】APP的缓存文件到底应该存在哪?看完这篇文章你应该就自己清楚了
- POJ 3274 Gold Balanced Lineup 哈希,查重 难度:3
- WPF动画之路径动画(3)
- Hibernate(二)Hibernate 实例
- iOSSingleton设计模式详细的说明教程
- HTML5 进阶系列:canvas 动态图表
- http post,get,put,delete区别(收集整理)
- shell编程/字库裁剪(2)——编程过程
- 德邦总管 修改oracle数据库用户密码的方法
- javascript学习笔记_1
- volatile和不加volatile的区别
- zabbix分布式监控部署--技术流ken
- Deep Knowledge Tracing (深度知识追踪)
- MySql 5.7.20版本免安装版配置过程
- js学习(4) 函数
- 全景3d
- webpack打包优化并开启gzip
- IE11 F12工具报错
- debian下创建新用户useradd
热门文章
- fatal error C1083: 无法打开包括文件:“stdint.h”: No such file or directory
- 【转】 通过VMLibrary在client partition上安装AIX全程实录
- Oracle 提供的start with 关键字用法
- JQuery UI 入门
- GPS坐标(WGS84)转换百度坐标(BD09) python测试
- Django Rest Framework(一)
- VMware虚拟机NAT模式的具体配置
- selection createTextRange setSelectionRange
- JAVA 判断对象内容是否含有空值
- nodejs安装,配置环境,使用express建立一个新项目