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

说了这么多,可能还是有读者不知所云,这里我在下面放置了一张图,就是图像分割的一个应用,图像的前后对比,可以看到 人物 通过算法被很清晰地分割了出来,方便后续物体的识别跟踪。

这篇文章给大家介绍的就是 Opencv 中的一种图像分割方法 — 分水岭算法,先介绍一下这个算法所用到的基本原理:把图像比喻成一个平面,图像灰度值高的区域被看作山峰,灰度值低的地方被看作山谷,不同区域的山谷我们可以用不同颜色来标记,但是随着标记区域不断扩大,会出现一种现象:不同山谷的交汇处区域会出现颜色错乱现象,为了防止这一现象的出现,要做的就是把高峰变得更高(改变灰度值),然后再用颜色标记,如此反复最后完成所所有山谷的颜色分割,以上就是 涉及分水岭算法基本原理。

说的简单一点,就是根据图像相邻的像素插值,分成不同区域;分水岭算法就是将不同区域染成不同颜色;分水岭分割算法最大的特征就是 区域的封闭性;

Opencv 包中的分水岭算法利用的不是原算法,而是在原算法基础上又改进了一下,加了一步预处理(因为原算法经常会造成图像过度分割):在分割之前先要设置那些山谷会出现汇合,那些不会;如果我i们能够确定该点代表的是要分割的对象,那么就用某个颜色或者灰度值标签标记它,如果不是就利用另一种颜色去标记它。随后的过程就是分水岭算法。当所有山谷区域都分割完毕之后,得到的边界对象值设置为 -1;

​本次算法用到的图片实例

·

分水岭算法的具体使用步骤:

首先利用 cv2 读取图片,把 图片转变为灰质图,然后做阈值筛选,之前提到过的Otsu ' s 二值化 ,变成下面的二值图片(两色图),至于如何二值化的,可以参照之前写的这篇文章:zeroing:OpenCv 中的【图像阈值化处理】-- 我们经常用到的技术!​zhuanlan.zhihu.com

;代码如下:

import cv2

import numpy as np

from matplotlib import pyplot as plt

import cv2

import numpy as np

from matplotlib import pyplot as plt

img1 = cv2.imread('F:/opencv_test/1.jpg')

gray2 = cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)

gray = cv2.cvtColor(gray2,cv2.COLOR_RGB2GRAY)

# Otsu ' s 二值化;

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

plt.subplot(1,3,1),

plt.imshow(gray2),

plt.title('Original')

plt.subplot(1,3,3),

plt.imshow(thresh),

plt.title("Otsu's")

现在我们的目标就转化为提取图像中上面的白色区域:这里需要记住的是 这里硬币区域的是前景,也就是里硬币中心区域越近前景的可能性越大,离硬币区域中心越远的为背景的可能性越大 ,模糊区域就是前景与背景之间的边缘区域 ;

提取硬币区域,目前比较有效的有两种操作:腐蚀 操作和 膨胀 操作,腐蚀是用来去除边缘像素,而膨胀操作是将硬币边缘区域向外延申,对于操作之后的区域我们就能确定哪个区域一定是前景( Foreground ),哪个区域一定是背景( Background ).

代码部分:

#nosing removoal迭代两次

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)

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

ret,sure_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)

sure_fg = np.uint8(sure_fg)

unknow = cv2.subtract(sure_bg,sure_fg)

plt.subplot(1,3,1),

plt.imshow(sure_bg),

plt.title('Black region\nmust be background')

plt.subplot(1,3,3),

plt.imshow(unknow),

plt.title('Yellos region\nmust be foregroun'),

确定的背景区域减去一定确定的前景区域就是我们所要的硬币区域 ;分水岭算法在这里应用就是处理前景和背景的交界处,经过区域相减、阈值化处理之后得到肯定是硬币的区域,接下来需要我们创建标签(与源图像大小相同,数据类型为 int32 );

利用 cv2.connectedComponents() 把不同区域的颜色分为不同颜色,把背景标记为0(也就是代码中的unkbow区域),最后就是进行分水岭算法,把不同的区域赋予不同的颜色

#Marker labeling

ret,makers1 = cv2.connectedComponents(sure_fg)

#Add one to all labels so that sure background is not 0 but 1;

markers = makers1 +1

#Now mark the region of unknow with zero;

markers[unknow ==255] =0

markers3 = cv2.watershed(img1,markers)

上面提到,不同区域的边界,在进行分水岭分割算法之后都被赋值为 -1;把区域为 -1 的区域用红色表示,就能非常清楚地看到分界线了:

img1[markers3 == -1] =[255,0,0]

plt.subplot(1,3,1),

plt.imshow(makers1),

plt.title('makers1')

plt.subplot(1,3,2),

plt.imshow(markers3),

plt.title('markers3')

plt.subplot(1,3,3),

plt.imshow(img1),

plt.title('img1'),

最后的分割展示效果展示如下:

这篇文章算是 Opencv_python 系列的第二篇教程,文章种完整代码已经上传到了 Github 上面了,贴一下链接地址:GITHUB;

个人微信公众号:Z先生点记;专注于 python爬虫,数据分析、可视化;python图像处理方面,没事的话可以常来坐坐!

python图像分割算法_Opencv(二)—图像分割之分水岭算法!相关推荐

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

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

  2. 《MATLAB智能算法30个案例》:第23章 基于蚁群算法的二维路径规划算法

    <MATLAB智能算法30个案例>:第23章 基于蚁群算法的二维路径规划算法 1. 前言 2. MATLAB 仿真示例 3. 小结 1. 前言 <MATLAB智能算法30个案例分析& ...

  3. python图像质量评价_OpenCV图像质量评价的SSIM算法(图像相似度)

    添加函数体.将SSIM函数添加至命名空间后.该函数主要功能是时哟功能ssim算法对两张图像进行比较,并将图像在各通道比较的结果以scalar形式返回. Scalar getMSSIM(char * i ...

  4. opencv图像分割合成_opencv 金字塔图像分割

    我所知的opencv中分割函数:watershed(只是看看效果,不能返回每类pixel类属),cvsegmentImage,cvPyrSegmentation(返回pixel类属) 金字塔分割原理篇 ...

  5. 捷联惯导算法(二)位置更新算法的理解

    前言 文中算法公式摘自<捷联惯导算法与组合导航原理>(严恭敏.翁浚 编著).<惯性导航>(秦永元 编著),其他理解仅代表个人观点.本文是对位置更新算法,按照自己学习的思路整理得 ...

  6. 2018/8/22部分算法总结 二维几何常用算法

    1.判断点在多边形内 对于简单多边形(边不自交)有两种方法可以判断, 第一种是看该点与多边形每条边构成的三角形面积和是否等于多边形的总面积.转角法 第二种是刘汝佳<<训练指南>> ...

  7. 轻松解读仿生学最优化算法(二)——蚁群算法

    蚁群算法简单解读 1.仿生学背景 蚂蚁在寻找食物的过程中,会在经过的道路上留下信息素. 起初蚂蚁不知道食物在哪儿,于是在经过的道路上留下浓度一致的信息素.在同样的时间内,绕远路的蚂蚁和走近路的蚂蚁消耗 ...

  8. Opencv 分水岭算法 watershed的图像分割

    分水岭算法 参考博客: (1)迈克老狼2012   https://www.cnblogs.com/mikewolf2002/p/3304118.html (2)-牧野-              h ...

  9. 图像处理:分水岭算法(图像分割)

    图像处理:分水岭算法(图像分割) 分水岭算法 分水岭算法是一种图像区域分割法,分割的过程中将图片转化为灰度图,然后我会将灰度值看作是海拔,然后向较低点注水,这种基于地形学的解释,我们着重考虑三种点: ...

最新文章

  1. SCOM2012R2 (5) MONITOR WINDOWS OF WORKGROUP
  2. mac显示/隐藏文件
  3. Linux防火墙屏蔽ip6,观点|Linux 发行版们应该禁用 IPv4 映射的 IPv6 地址吗?
  4. Linux笔记-查询进程,获取其运行时输入的参数
  5. iwrite提交不了作业_“iWrite写作中心”使用全攻略
  6. 冒充“老干妈”公司工作人员行骗三人被提起公诉
  7. 本博客自排名300到264的各项数据变化
  8. keyshot场景素材导入_Keyshot环境贴图大合集 KEYSHOT CLOUD ALL ENVIRONMENTS
  9. IDEA 创建文件类型与预期文件类型不符时,如何更改
  10. python中根据视频帧生成视频,保存为mp4格式
  11. android仿QQ列表的效果实现
  12. 【转】TinyXML2 入门教程
  13. [ 2204听力 ] 一
  14. DAP数据分析平台可视化组件开发
  15. OBCA认证知识点-part3
  16. 【论文 | 复现】YOLO-landmark detection
  17. ABAQUS怎样导出部分节点的编号
  18. protobuf_name_conflict问题解决
  19. 【纯干货】Linux内存管理(最透彻的一篇)
  20. 强行往计算机上存储,存储卡常见问题及其解决方法

热门文章

  1. Windows Server vNext Technical Preview UI Build 9841
  2. Linux/Unix mii-tool command
  3. 基于服务器的AAA作业(第二次)
  4. Linux Kernel 5.0或在达成600万Git Objects时到来
  5. Python IDLE或shell中切换路径
  6. X-Content-Type-Options: nosniff
  7. 用百度地图API分析打交通大数据
  8. Linux 文件系统权限(一)
  9. Velocity魔法堂系列二:VTL语法详解
  10. 淘宝姐姐不要过滤掉js我们还是好朋友