一、背景

最近在学分水岭算法的opencv函数watershed()时,对函数执行完后image和marker的变化一无所知、懵懵懂懂。

于是便结合网上资料和自己现身说法,给大家分享一下【watershed函数的执行效果】。

OpenCV: Image Segmentation with Watershed Algorithm

OpenCV: Image Segmentation

首先说明一点:

传入watershed函数的marker参数可以有三种成分:背景、不确定、前景(也即object)。

比如背景像素填充1,而object1填充2,不确定像素填充0。

下文的“种子数值”代表Object成分的编号。

因此,object1的种子数值是2。

二、直接给结论

watershed函数一旦执行,就会改变marker,但是image不变。

改变A:从基点开始向外填充种子数值,直到边界。

例如下面的第2个硬币对应的种子数值是2,原marker中只有硬币最中间才是填充了2

函数执行后,整个硬币所处区域全被填充2。

改变B:向外填充时,若即将与另一个山谷的积水相涉就停止扩展,最外围便是边界线,marker中的边界线区域填充-1。

还是以第二个硬币为例,第二个硬币的边界像素点填充-1。

也就是说,最后得到的marker想比原marker是更加完善的;原marker的object像素点只需要至少填充一个种子数值,而新marker是将object的所有像素全部填充种子数值,更加精确和点对点。

三、测试(现身说法)

测试用到的图片

测试用到的代码

import cv2 as cv
import numpy as np
from matplotlib import pyplot as pltdef watershed_demo():# remove noise if anyprint(src.shape)blurred = cv.pyrMeanShiftFiltering(src, 10, 100)# gray\binary imagegray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)cv.imshow("binary-image", binary)# morphology operationkernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))mb = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel, iterations=2)sure_bg = cv.dilate(mb, kernel, iterations=3)cv.imshow("mor-opt", sure_bg)# distance transformdist = cv.distanceTransform(mb, cv.DIST_L2, 3)dist_output = cv.normalize(dist, 0, 1.0, cv.NORM_MINMAX)cv.imshow("distance-t", dist_output*50)ret, surface = cv.threshold(dist, dist.max()*0.6, 255, cv.THRESH_BINARY)surface_fg = np.uint8(surface)cv.imshow("surface-bin", surface_fg)unknown = cv.subtract(sure_bg, surface_fg)ret, markers = cv.connectedComponents(surface_fg)# watershed transformmarkers = markers + 1markers[unknown == 255] = 0print(type(markers))print(np.sum(markers==2))markers = cv.watershed(src, markers=markers)print(np.unique(markers))print(np.sum(markers==2))src[markers==-1] = [0, 0, 255]cv.imshow("result", src)markers = markers + 1plt.imshow(markers)plt.show()src = cv.imread("D:\BaiduNetdiskDownload\pycv-learning\pythonProject\images\coins.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
watershed_demo()
cv.waitKey(0)
cv.destroyAllWindows()

cv.imshow("surface-bin", surface_fg)的输出如下。

这十个白圆块的区域,对应marker填充种子数值的范围。

cv.imshow("result", src)的输出如下。

硬币的边界上绘制了一个红圈,正是利用了上文第二部分的改变B。

plt.imshow(markers)的输出如下。

我们可以看到新得到的marker真正做到对各个硬币进行像素级别的标注,不同硬币object对应不同填充色。

【OpenCV】 - 图像分割之分水岭算法,watershed()函数的输出,对marker和image的改变相关推荐

  1. OpenCV学习17_ 分水岭算法

    一.分水岭算法 在许多实际运用中,我们需要分割图像,但无法从背景图像中获得有用信息.分水岭算法(watershed algorithm)在这方面往往是非常有效的.此算法可以将图像中的边缘转化成&quo ...

  2. Python+OpenCV:基于分水岭算法的图像分割(Image Segmentation with Watershed Algorithm)

    Python+OpenCV:基于分水岭算法的图像分割(Image Segmentation with Watershed Algorithm) ############################ ...

  3. Opencv分水岭算法——watershed自动图像分割用法

    分水岭算法是一种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性是分水岭算法的一个重要特 ...

  4. OpenCV学习(二十) :分水岭算法:watershed()

    OpenCV学习(二十) :分水岭算法:watershed() 参考博客: OpenCV-分水岭算法 图像处理--分水岭算法 OpenCV学习(7) 分水岭算法(1) Opencv分水岭算法--wat ...

  5. OpenCV3学习(7.2)——图像分割之二(分水岭算法watershed)

    分水岭算法原理 分水岭算法是一种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性是分水岭 ...

  6. OpenCV 源码中分水岭算法 watershed 函数源码注解

    为了研究分水岭算法,阅读了OpenCV 2.4.9 中watershed函数的源码实现部分,代码位于 opencv\sources\modules\imgproc\src\segmentation.c ...

  7. 使用OpenCV和C++实现的分水岭算法(Watershed)

    分水岭算法(watershed)是一种比较基本的数学形态学分割算法,其基本思想是将灰度图像转换为梯度图像,将梯度值看作高低起伏的山岭,将局部极小值及其邻域看作一个"集水盆".设想一 ...

  8. OpenCV中的图像处理 —— 霍夫线 / 圈变换 + 图像分割(分水岭算法) + 交互式前景提取(GrabCut算法)

    OpenCV中的图像处理 -- 霍夫线 / 圈变换 + 图像分割(分水岭算法) + 交互式前景提取(GrabCut算法)

  9. python图像分割算法_Opencv(二)—图像分割之分水岭算法!

    做图像处理时,我们可能会遇到一个问题:我们只需要图片的一部分区域,如何把图片中的某部分区域提取出来 或者 图像想要的区域用某种颜色(与其它区域颜色不一致)标记起来 ,以上描述的问题在像处理领域称为 图 ...

  10. OpenCV4.5.5学习笔记(十七):分水岭算法watershed(),图像修补inpaint()

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.分水岭算法watershed() 二.图像修补inpaint() 总结 前言 笔者本科时候有幸接触了OpenCV3 ...

最新文章

  1. 刷题两个月,从入门到字节跳动offer,这是我的模板 | GitHub 1.2k星
  2. nn.Upsampling is deprecated. Use nn.functional.interpolate instead.
  3. Producing Open Source Software
  4. 看“意大利文艺复兴艺术展”(3)
  5. 如何在你的项目中集成 CAP【手把手视频教程】
  6. [html] html标签中的lang属性有什么作用?
  7. influxdb无法实现关联表_InfluxDb专业术语
  8. 微博:第二批共处置10106个账号 十万粉丝到一百万粉丝的账号8个
  9. flex eclipse综合spring入门
  10. 算法知识点——(5)集成算法—GBDT详解
  11. 云智能,重新定义数字化时代云的未来
  12. Flurry——统计和分析用户行为
  13. Unity3D添加天空盒
  14. 计算机常用屏幕分辨率,pc端常用电脑屏幕 ((响应式PC端媒体查询)电脑屏幕分辨率尺寸大全)...
  15. 谷歌浏览器(Chrome)最新v80版本下载
  16. android 打开ap热点
  17. 相位干涉仪测向的基础理论
  18. 2018.06.27Firing(最大权闭合子图)
  19. js输入两个数,求最小公倍数和最大公约数
  20. 【MySQL】-增删查改

热门文章

  1. 自学IT和接受IT培训两者的优缺点分析
  2. 用html怎样实现抽奖效果,html5+css3实现抽奖活动的效果
  3. c语言输出方框□怎么回事_C语言打印数据的二进制格式-原理解析与编程实现
  4. 软考中级之系统集成项目管理工程师备考
  5. 百度文库如何申请个人认证?需要什么资质?
  6. php钓鱼怎么使用方法,盘钩使用方法
  7. 基于安卓的共享单车设计与实现
  8. 手机端或PC端利用高德地图和腾讯地图获取用户当前位置信息
  9. 越南VinFast冲刺美股:不到2年亏28亿美元 要与蔚小理比高低
  10. 重新加载script