本节介绍一下使用分水岭算法的实例。介绍分水岭算法的基本步骤,以及一个实例来观察分水岭的效果。

使用分水岭算法进行图像分割时,基本步骤为:

1、通过形态学开运算,对原始图像O去噪。

2、通过腐蚀操作获取确定背景B,需要注意,这里得到原始图像 - 确定背景即可。

3、利用距离变换函数cv2.diatanceTransform()对原始图像进行运算,并对其进行阈值处理,得到确定前景F

4、计算未知区域UN(UN = O - B - F)。

5、利用函数cv2.connectComponents()对原始图像O进行标注

6、对函数cv2.connectComponents()的标注结果进行修正

7、使用分水岭函数完成对图像的分割

关于上面的步骤中使用的相关辅助函数,可以查看上一篇博文:

[item name="OpenCV For Python入门54 分水岭算法辅助函数" link="https://www.52txr.cn/2022/OpenCV54.html" desc="函数cv2.watershed()实现分水岭算法。在具体实现过程中,还需要借助其他形态学函数来辅助。" /] [/link]

例:使用分水岭算法对一幅图像进行分割,并观察分割效果。

import cv2
import numpy as np
import matplotlib.pyplot as plt

#读取
img = cv2.imread('water_coins.png')
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
ishow = img.copy()
#二值化
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_bg = cv2.dilate(opening,kernel,iterations=3)
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
ret,sur_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)

sur_fg = np.uint8(sur_fg)
unknow = cv2.subtract(sure_bg,sur_fg)

ret, markers = cv2.connectedComponents(sur_fg)

markers = markers + 1
markers[unknow==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()

分割效果


博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/OpenCV55.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 26 日
如果觉得我的文章对你有用,请随意赞赏