本文介绍了python opencv之分水岭算法示例,分享给大家,具体如下:

目标

使用分水岭算法对基于标记的图像进行分割

使用函数cv2.watershed()

原理:

灰度图像可以被看成拓扑平面,灰度值高的区域可以看出山峰,灰度值低的区域可以看成是山谷。向每一个山谷当中灌不同颜色的水。水位升高,不同山谷的水会汇合,为防止不同山谷的水汇合,小在汇合处建立起堤坝。然后继续灌水,然后再建立堤坝,直到山峰都掩模。构建好的堤坝就是图像的分割。

此方法通常会得到过渡分割的结果,因为图像中的噪声以及其他因素。为了减少此影响,opencv使用基于标记的分水岭算法,此算法要设置哪些山谷中的汇合点,哪些不是。这是一种交互式的图像分割算法那。我们要给已知对象打上不同表情。如果某个区域肯定是前景或对象,就使用某个颜色或灰度值标签标记它。如果是背景那么使用其他颜色进行标记,其余不能确定的部分用0标记。然后使用分水岭算法,每次灌水,标签会被更新,当两个不同颜色的标签相遇就会构建堤坝,知道所有山峰掩模,最后得到的边界对象值是-1。

代码:

对挨在一起的对象进行分割。

使用Otsu's 二值化后的结果为

要出去图像中的白噪声。可以使用形态学运算,使用闭运算去除对象中的空洞。

靠近对象中心的区域是前景,离对象远的区域是背景,不确定的区域是边界。

首先提取硬币区域,使用腐蚀操作去掉边缘,剩下的就是硬币。但硬币没有接触时,此方法有效,但是由于硬币相互接触,就要使用另外一种有效的方法:距离变换加上合适的阈值。

之后,要寻找不确定是否是硬币的区域。这里需要膨胀操作。膨胀操作会将对象边界延伸到背景当中。由于边界区域被去除,现在就能知道哪些区域是前景,哪些是背景。

余下的区域不知道如何区分,那么使用分水岭算法。这些区域通常是前景与背景的交界处。从能否确认是否是背景的区域中减去确定是前景的区域就得到了边界。

(前景和背景)

(上面的图是直接使用作者的代码后生产的结果,提取到了前景,为了演示一下不确定的区域,调了一下计算前景的距离变换的参数,使得中间出现不确定的区域)

这里面使用个cv2.distanceTransform函数

该函数用于计算2值图象中所有像素离其最近的值为0像素的近似距离。

参数为

cv2.distanceTransform(src, distanceType, maskSize[, dst]) → dst

#src为输入的二值图像。distanceType为计算距离的方式,可以是如下值

DIST_USER = ⑴, //!< User defined distance

DIST_L1 = 1, //!< distance = |x1-x2| + |y1-y2|

DIST_L2 = 2, //!< the simple euclidean distance

DIST_C = 3, //!< distance = max(|x1-x2|,|y1-y2|)

DIST_L12 = 4, //!< L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1))

DIST_FAIR = 5, //!< distance = c^2(|x|/c-log(1+|x|/c)), c = 1.3998

DIST_WELSCH = 6, //!< distance = c^2/2(1-exp(-(x/c)^2)), c = 2.9846

DIST_HUBER = 7 //!< distance = |x|

#maskSize是蒙板尺寸,只有0,3,5

DIST_MASK_3 = 3, //!< mask=3

DIST_MASK_5 = 5, //!< mask=5

DIST_MASK_PRECISE = 0 //!< mask=0

import numpy as np

import cv2

from matplotlib import pyplot as plt

img = cv2.imread('21.jpg')

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

kernel = np.ones((3,3),np.uint8)

opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2)

# sure background area

sure_bg = cv2.dilate(opening,kernel,iterations=3)#膨胀

# Finding sure foreground area

dist_transform = cv2.distanceTransform(opening,1,5)

ret, sure_fg = cv2.threshold(dist_transform,0.2*dist_transform.max(),255,0)#参数改小了,出现不确定区域

# Finding unknown region

sure_fg = np.uint8(sure_fg)

unknown = cv2.subtract(sure_bg,sure_fg)#减去前景

cv2.imshow('p',sure_fg)

cv2.waitKey(0)

现在知道了那些背景是硬币,可以创建标签。(与原图像大小相同,数据类型为int32的数组)。

对于已经确定分类的区域,也就是背景和前景,使用整数标记,不确定的区域是用0标记。可以使用cv2.connectedComponents()函数来实现此功能。它会将背景标记为0,其他标记为位从1开始的正整数。

但是,如果背景标记为0,那么分水岭算法会将其当成位置区域,所以使用不同的整数进行标记,对于不确定的区域,函数标记为0.

结果使用JET颜色地图表示。深蓝色未知区域,硬币区域使用不同颜色。其余部分用浅蓝色。

使用分水岭算法

效果不错

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

python 水位_python opencv之分水岭算法示例相关推荐

  1. pythonopencv算法_python opencv之分水岭算法示例

    本文介绍了python opencv之分水岭算法示例,分享给大家,具体如下: 目标 使用分水岭算法对基于标记的图像进行分割 使用函数cv2.watershed() 原理: 灰度图像可以被看成拓扑平面, ...

  2. pythonopencv算法_python opencv之SURF算法示例

    本文介绍了python opencv之SURF算法示例,分享给大家,具体如下: 目标: SURF算法基础 opencv总SURF算法的使用 原理: 上节课使用了SIFT算法,当时这种算法效率不高,需要 ...

  3. 【python】【openCV】分水岭算法

    脑血管医学图像颅内分割尝试--分水岭算法 code 1.2 不分割颅内直接分割 code 2.0 实验版 code 3.0 批量处理版 code 3.1 加入孔洞填充 总结 本篇博客原目的同https ...

  4. opencv实现分水岭算法

    opencv实现分水岭算法 // 分水岭算法原理 // IplImage* marker_mask = 0; IplImage* markers = 0; //IplImage* img0 = 0, ...

  5. 使用OpenCV的分水岭算法

    <使用OpenCV的分水岭算法>   之前利用watershed想对相对前背景较为明显的图像进行图像语义分割的预打标,因为虽然前景明显,但是边缘打标也是很困难的,可以用该方法对大部分的边缘 ...

  6. python opencv 利用分水岭算法实现对物体的分割 图文详细注释版 以分割官网提供的硬币为例

    分水岭算法可以实现自动分割多个物体,opencv中 cv.watershed() 函数实现了分水岭算法 话不多说,上代码 # 利用分水岭算法分离多个相同硬币 import numpy as np im ...

  7. 【OpenCV】- 分水岭算法

    文章目录 什么是图像分割 分水岭算法 1.实现分水岭算法:watershed()函数 2.处理流程(视频) 3.示例程序(书中) 什么是图像分割 将图像中像素根据一定的规则分为若干个cluster集合 ...

  8. opencv之分水岭算法分割及图像修补

    1)分水岭算法 原理: 任何一幅灰度图像都可以被看成是拓扑平面,灰度值高的区域可以被看成是山峰,灰度值低的区域可以被看成是山谷,我们向每一个山谷中灌不同颜色的水,随着水位的升高,不同山谷的水就会相遇汇 ...

  9. OpenCV之分水岭算法

    分水岭算法 在许多实际的应用中,我们需要分割图像,但是无法从背景图像中获得有用信息.但是分水岭算法在这方面往往非常有效,它可以将图像中的边缘转化为"山脉",将均匀区域转化为&quo ...

  10. python爬楼梯_Python3爬楼梯算法示例

    Python3爬楼梯算法示例 本文实例讲述了Python3爬楼梯算法.分享给大家供大家参考,具体如下: 假设你正在爬楼梯.需要 n 步你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同 ...

最新文章

  1. 怎样高效阅读一篇文献?
  2. 使用 Jest 和 Enzyme 测试 React 组件
  3. elasticSearch6源码分析(4)indices模块
  4. OpenCV的projectPoints函数用法
  5. VC里的集合类、链表类、映射类
  6. php 留言板分页显示,php有分页的留言板,留言成功后怎么返回当前页?
  7. Jenkins时区设置为北京时间
  8. mysql gis空间数据库_GIS开发:使用空间数据库
  9. STM32工作笔记0022---STM32F1开发版 GPIO口工作原理
  10. 使用多线程完成Socket
  11. 数据结构之二叉树实现排序功能
  12. 计算机管理怎么看内存条,内存条,教您怎么查看内存条的型号
  13. 亲爱的朋友,您幸福吗?
  14. MySql 报错1548
  15. 春暖花开,共迎未来:开源社顾问委员会第一季度会议顺利召开~
  16. sqlmap用户手册
  17. 物联网-物联网网络安全
  18. ubuntu 12.04 下如何修改屏幕分辨率
  19. 商会协会团体网站搭建模板
  20. ITE平台开发 chapter 1-环境搭建

热门文章

  1. 计算1-1/x+1/x*x
  2. (转载)php flush()刷新不能输出缓冲的原因分析
  3. (转)图文详解手把手教你在Windows环境下下载Android源码(Launcher为例)
  4. 20200517每日一句
  5. 190726每日一句
  6. 3lcd和dlp怎么选,DLP和3LCD投影机的选择对比
  7. Atitit 头像文件上传功能实现目录1. 上传文件原理 11.1. 界面ui 11.2. 预览实现 21.3. 保存头像文件php 21.4. 保存文件nodejs java 32
  8. Atitit 避税之道 如何降低企业与项目组成本 attilax总结
  9. Atitit 游戏引擎---物理系统(1)------爆炸效果
  10. 转:java生成EXCEL表格(POI vs JXL)