一、概念
分水岭算法可以类比为在一幅图像上倒水的过程。假设我们在图像中选择了一些点作为“分水点”,每个分水点代表一种颜色或标签。然后我们在这些分水点上向图像倒水,水会从高处向低处流动,直到不同颜色的水流汇聚在一起或者遇到障碍物停下来,形成分割区域的边界。这些停水的地方就是分水岭,代表着不同的分割区域。最终,我们就可以得到一张被分割成多个区域的图像。
二、实例:分割硬币
以分割硬币为例,将硬币从背景中分割出来:
(1)导入numpy、cv2、matplotlib库,加载图片
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('Image_watershed_coins.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
(2)把图像从彩色转换为灰度,并对其进行阈值化
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) # 将图像分成黑白两个区域
(3) 应用形态学去噪
形态学去噪(Morphological noise reduction)是数字图像处理中一种基于形态学操作的噪声去除技术。该技术利用形态学运算(如膨胀、腐蚀、开闭运算等)对图像进行处理,以去除噪声并改善图像质量。这里使用cv2.morphologyEx()函数,
它是 OpenCV 的图像形态学处理函数之一,它可以对图像进行膨胀、腐蚀、开运算、闭运算、梯度等形态学操作。
# Remove noise
kernel = np.noes((3, 3), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
(4)通过开变换的膨胀结果,获取图像中最确定是背景的区域
# finding the sure background region
sure_bg = cv2.dilate(opening, kernel, iterations=3)
(5)获取前景区域
# find the sure foreground region
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 = sure_fg.astype(np.uint8)
(6)中间区域,即不确定或未知区域
# find the unknown region
unknown = cv2.subtract(sure_bg, sure_fg) # 减法操作,背景减去前景
(7) 构建“屏障”,阻止“水”的合并
# label the foreground objects
ret, markers = cv2.connectedComponents(sure_fg)
(8) 给所有区域的标签加1,未知区域为0
# add one to all labels so that sure background is not 0,but 1
markers += 1
# label the unknown region as 0
markers[unknown == 255] = 0
(9)最后,打开闸门,放水
cv2.watershed()函数把标签‘-1’分配给分量之间的像素,将原始图像中的这些边涂成蓝色 :
markers = cv2.watershed(img, markers)
img[markers == -1] = [255, 0, 0]
使用matplotlib显示结果:
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
plt.show()
实验结果:
三、分水岭分割应用前景
以下是分水岭分割算法在不同领域的应用前景:
-
计算机视觉:分水岭分割算法可以用于对象检测、人脸识别、图像分析和图像搜索等任务。例如,可以将一个包含多个物体的图像分割成多个部分,然后对每个部分进行对象检测和分类,从而实现自动化识别和分类。
-
图像处理:分水岭分割算法可以用于图像去噪、图像增强和图像重建等任务。例如,可以通过对一幅图像进行分割,然后对每个区域进行不同的处理,从而实现图像去噪、增强和重建等效果。
-
医学图像分析:分水岭分割算法可以用于医学图像的分割、定量分析和可视化等任务。例如,可以将医学图像中的不同组织和器官分割出来,然后对每个区域进行定量分析和可视化,从而实现疾病诊断和治疗。
-
无人驾驶和机器人:分水岭分割算法可以用于无人驾驶车辆和机器人的环境感知和路径规划等任务。例如,可以将环境中的不同物体和障碍物分割出来,然后对每个区域进行环境感知和路径规划,从而实现安全驾驶和运动控制。
综上所述,分水岭分割算法在计算机视觉、图像处理、医学图像分析、无人驾驶和机器人等领域都有着广泛的应用前景。最后点击opencv文档:基于分水岭算法的图像分割,以获取更多知识。