win10+Python3.7.3+OpenCV3.4.1入门学习(十七 图像分割与提取)————17.3 分水岭算法图像分割实例i

Python版本是Python3.7.3,OpenCV版本OpenCV3.4.1,开发环境为PyCharm

17.3 分水岭算法图像分割实例

本节结合前面介绍的知识,讲解一个图像分割实例。使用分水岭算法进行图像分割时,基本的步骤为:
1.通过形态学开运算对原始图像O去噪。
2.通过腐蚀操作获取“确定背景B”。需要注意,这里得到“原始图像-确定背景”即可。
3.利用距离变换函数cv2.distanceTransform()对原始图像进行运算,并对其进行阈值处理,得到“确定前景F”。
4.计算未知区域UN(UN=O -B - F)。
5.利用函数cv2.connectedComponents()对原始图像O进行标注。
6.对函数cv2.connectedComponents()的标注结果进行修正。
7.使用分水岭函数完成对图像的分割。

eg1:使用分水岭算法对一幅图像进行分割,并观察分割的效果。
代码如下:

import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('water_coins.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
ishow=img.copy()
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_bg = cv2.dilate(opening,kernel,iterations=3)
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
ret, sure_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg,sure_fg)
ret, markers = cv2.connectedComponents(sure_fg)
markers = markers+1
markers[unknown==255] = 0
markers = cv2.watershed(img,markers)
img[markers == -1] = [0,255,0]
plt.subplot(121)
plt.imshow(ishow)
plt.axis('off')
plt.subplot(122)
plt.imshow(img)
plt.axis('off')
plt.show()

运行上述程序,得到的结果如下图所示。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值