官网的语句说明
https://docs.opencv.org/3.4/d7/d1b/group__imgproc__misc.html#ga3267243e4d3f95165d55a618c65ac6e1

官网的例子
https://docs.opencv.org/3.4/d4/d40/samples_2cpp_2watershed_8cpp-example.html#a36

void cv::watershed ( InputArray image,
InputOutputArray markers
)

其中,inputArray是8bit单通道或者三通道原图。markers是32bit的初始标记图和输出图

作为输入markers图,存储了每个像素的初始label。给每个确定了分类的像素点,标记上1,2,3,4,……。对于不确定的像素,标记0。watershed会把每个标记为0的像素,计算出一个标记值。

作为输出markers图,每个点都标记了所属分类区域,-1的点是边界。

在官方例子samples/cpp/watershed.cpp中,让用户在界面上用鼠标点出了初始分类定义。由 onMouse记录。直到用户输入if( c == ‘w’ || c == ’ ’ )开始进行分水岭算法。我没有用这部分,所有初始类标记由代码完成,没有用户交互。

步骤一:
我自己的实用中,分水岭算法之前做了prepareWatershed();函数,为分水岭做预处理。标记了黑色背景为3,物体2,分割目标物体1,待分割0。
Mat labelImage(m_srcBGRImg.size(), CV_32S);
Mat labelDisp(m_srcBGRImg.size(), CV_8UC1);
int nrow = m_blackBinary.rows;
int ncol = m_blackBinary.cols*m_blackBinary.channels();
for (int i = 0; i < nrow; i++)
{
for (int j = 0; j < ncol; j++)
{
if m_blackBinary.at(i, j)==0
{
labelDisp.at(i, j)=255;
labelImage.at(i, j)=3;
}/等等 每个点标好0123
}
}
//imshow(“label”,labelDisp);
m_preLable = labelImage.clone();

步骤二:

watershed( srcImage, m_preLable );

步骤三:

提取分水岭的结果,一个是三通道的原图加上分类的半透明颜色标记,一个是单通道的二值化分割结果

Mat wshed(m_preLable.size(), CV_8UC3);
m_ResultImg =Mat::zeros(m_HueBinary.rows, m_HueBinary.cols, CV_8UC1);vector<Vec3b> colorTab;
for(int  i = 0; i < 3; i++ )
{int b = theRNG().uniform(0, 255);int g = theRNG().uniform(0, 255);int r = theRNG().uniform(0, 255);colorTab.push_back(Vec3b((uchar)b, (uchar)g, (uchar)r));
}//给每个类生成随机颜色

for(int i = 0; i < m_preLable.rows; i++ )
{
for( int j = 0; j < m_preLable.cols; j++ )
{
int index = m_preLable.at(i,j);
if ///index是某一类
{
wshed.at(i,j) = Vec3b(255,255,255);
m_ResultImg.at(i, j)=255;
}
}
}

wshed = wshed0.5 + m_srcBGRImg0.5;//给原图加上半透明色
drawContoursFormBinaImg(&m_srcBGRImg,&m_ResultImg);

openCV中watershed的使用相关推荐

  1. OpenCV库中watershed函数(分水岭算法)的详细使用例程

    # 声明:如果有写的不对的地方欢迎指正! 一.分水岭算法 关于分水岭算法的具体原理我就不说了,网上搜一下很多.OpenCV中的watershed函数实现的分水岭算法是基于"标记"的 ...

  2. 第四章:OpenCV中的图像处理

    第四章:OpenCV中的图像处理 本章节你将学习图像的改变色彩空间.提取对象.图像的几何变换.图像的阈值.平滑图像等OpenCV图像处理的基本内容. 更多内容请关注我的GitHub库:TonyStar ...

  3. OpenCV学习笔记(12)——OpenCV中的轮廓

    什么是轮廓 找轮廓.绘制轮廓等 1.什么是轮廓 轮廓可看做将连续的点(连着边界)连在一起的曲线,具有相同的颜色和灰度.轮廓在形态分析和物体的检测和识别中很有用. 为了更加准确,要使用二值化图像.在寻找 ...

  4. OpenCV中的光流及视频特征点追踪

    OpenCV中的光流及视频特征点追踪 1. 效果图 2. 原理 2.1 什么是光流?光流追踪的前提.原理 2.2 光流的应用 2.3 光流的2种方法 3. 源码 3.2 稀疏光流追踪 3.2 优化版稀 ...

  5. Python,OpenCV中的图像修复——cv2.inpaint()

    Python,OpenCV中的图像修复--cv2.inpaint 1. 效果图 2. 原理 3. 源码 参考 image inpainting 图像修改 这篇博客将介绍如何通过OpenCV中图像修复的 ...

  6. Python,OpenCV中的K均值聚类——K-Means Cluster

    Python,OpenCV中的K均值聚类 1. 效果图 2. 原理 2.1 什么是K均值聚类? 2.2 K均值聚类过程 2.3 cv2.kmeans(z, 2, None, criteria, 10, ...

  7. OpenCV中的SURF(Speeded-Up Robust Features 加速鲁棒特征)

    OpenCV中的SURF(加速健壮功能) 1. 效果图 2. 原理 2.1 为什么SURF比SIFT快? 2.3 怎样获取SIFT与SURF? 3. 源码 参考 上一篇博客介绍了用于关键点检测和描述的 ...

  8. Python,OpenCV中的霍夫圆变换——cv2.HoughCircles()

    Python,OpenCV中的霍夫圆变换 1. 效果图 2. 源码 参考 这篇博客将学习如何使用霍夫圆变换在图像中找到圆圈,OpenCV使用cv2.HoughCircles()实现霍夫圆变换. cir ...

  9. OpenCV中的霍夫线变换、概率霍夫线变换

    OpenCV中的霍夫线变换.概率霍夫线变换 1. 效果图 2. 原理 2.1 什么是霍夫变换? 2.2 什么是概率霍夫变换? 3. 源码 3.1 霍夫变换 3.2 概率霍夫变换 参考 这篇博客将介绍P ...

最新文章

  1. MySQL-主从架构探索
  2. mysql 普通索引使用方法,Mysql索引类型与基本用法实例分析
  3. gitlab常规维护命令
  4. 大一新生开发的小工具火了!不一样的 Python 编程体验,还是可视化的那种
  5. 瑞斯康达nms_瑞斯康达iTN产品资料
  6. 漫画TCP——一个悲伤的故事
  7. [转载] 中国象棋软件-引擎实现(一)概述
  8. 4g网络什么时候淘汰_你的4G手机 什么时候淘汰
  9. PyQt5 电报实时聊天软件 BB-Telegram Pt.0
  10. 苹果Mac删除windows后无法合并分区的简单解决方法
  11. 工作篇-错误的代价及反思
  12. 细胞制备流程图_体细胞核移植过程中,注入“供体细胞”还是“供体细胞核”?...
  13. 知物由学 | 用案例起底黑灰产的各种“骚”操作
  14. 网络安全从零开始(基础知识)
  15. Linux操纵细碎以太网卡的装配及设置-2
  16. 任务卡_05-数据库_数据库基础
  17. matlab从excel第二行写,matlab从某行读excel
  18. 新浪微博基于Docker的混合云架构与应用实践
  19. AI Earth ——开发者模式案例7:植被覆盖度提取
  20. Unity学习笔记:Animator和Animation

热门文章

  1. Dell G15新机测评
  2. Linux - systemd 依赖
  3. 学习torchvision.models._dict_
  4. 周鸿祎力荐|纽约客16000字重磅刊文:区块链是回归互联网本质的唯一希望
  5. NB-IOT MT2625平台驱动开发工具包介绍
  6. VMwar虚拟机安装winXP教程
  7. 错误:没有注册类别 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))
  8. ARC122E Increasing LCMs
  9. [转]写给所有的IT民工们
  10. ubuntu18.04分辨率只有1024*768,解决方案和踩坑梳理(应该适用其他ubuntu版本)