分水岭算法原理和c++实现

算法原理

关于分水岭算法的介绍和原理,大家可以去看这篇博客,上面有很多动图,十分生动有趣:https://www.cnblogs.com/mikewolf2002/p/3304118.html。我们,先来看一下opencv提供的分水岭算法的函数接口

void watershed( InputArray image, InputOutputArray markers ); 

输入图像必须是3通道的RGB图像,最为关键的是第二个参数markers,这个参数包含不同区域的轮廓,每个轮廓有一个自己唯一的编号,轮廓的定位可以通过Opencv中findContours方法实现。然后分水岭算法会根据markers传入的轮廓作为种子(也就是所谓的注水点),对图像上其他的像素点根据分水岭算法规则进行判断,并对每个像素点的区域归属进行划定,直到处理完图像上所有像素点。而区域与区域之间的分界处的值被置为“-1”,以做区分。

算法步骤

参考:https://blog.csdn.net/kakiebu/article/details/82965629

  • 将RGB图像灰度化
  • 使用大津法转为二值图,并做形态学闭合操作
  • 形态学闭操作
  • 距离变换
  • 将距离变换结果归一化到[0-1]之间
  • 将图像取值范围变为8位(0-255)
  • 再使用大津法转为二值图,并做形态学闭合操作
  • 使用findContours寻找marks
  • 对原图做形态学的腐蚀操作
  • 执行分水岭算法
  • 随机分配颜色和显示

代码实现

//分水岭算法
Mat WaterSegment(Mat src) {
	int row = src.rows;
	int col = src.cols;
	//1. 将RGB图像灰度化
	Mat grayImage =
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值