Opencv分水岭算法——watershed自动图像分割用法
时间: 2023-10-23 16:14:21 浏览: 260
Opencv中的分水岭算法(watershed algorithm)是一种自动图像分割算法,常用于分离图像中的前景和背景。下面是使用Opencv中的分水岭算法进行图像分割的步骤:
1. 读入图像并进行预处理,如去噪、灰度化等。
2. 对图像进行二值化处理,得到前景和背景的二值图像。
3. 对二值图像进行距离变换(distance transform),得到每个像素离最近的背景像素的距离。
4. 对距离变换后的图像进行阈值处理,得到图像的分水岭标记(watershed markers)。
5. 对分水岭标记进行修正,确保标记不会重叠或出现空洞。
6. 对分水岭标记应用分水岭算法,得到分割后的图像。
下面是使用Opencv实现分水岭算法的示例代码:
```python
import cv2
import numpy as np
# 读取图像并进行预处理
img = cv2.imread('input.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
# 进行距离变换
dist_transform = cv2.distanceTransform(thresh,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(thresh,sure_fg)
ret, markers = cv2.connectedComponents(sure_fg)
markers = markers+1
markers[unknown==255] = 0
# 修正分水岭标记
markers = cv2.watershed(img,markers)
img[markers == -1] = [255,0,0]
# 显示分割结果
cv2.imshow('result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
这段代码中,我们首先读入一张图像并进行预处理,然后进行距离变换,得到每个像素到最近的背景像素的距离。接着使用阈值处理得到分水岭标记,修正分水岭标记并应用分水岭算法,最后显示分割结果。
阅读全文