算法原理
关于分水岭算法的介绍和原理,大家可以去看这篇博客,上面有很多动图,十分生动有趣: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 =

3960

被折叠的 条评论
为什么被折叠?



