写一个分水岭算法的例子
时间: 2024-05-05 11:21:53 浏览: 6
分水岭算法(Watershed Algorithm)是一种图像分割算法,用于将图像分成多个区域。它的基本思想是将图像看作地形图,将低洼点看作图像中的目标物体,将高地区域看作背景,然后将图像分成多个区域,使每个区域内的像素都流向它们各自的低洼点。
以下是一个使用分水岭算法进行图像分割的简单示例:
```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)
# 去除噪声
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] = [255,0,0]
# 显示结果
cv2.imshow('Result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
该示例首先读取一张图像,然后将其转换为灰度图像,并使用自适应阈值处理来找到图像中的目标物体。接下来,使用形态学开运算去除图像中的噪声,并使用距离变换确定背景和前景。然后,将前景区域进行分组,并使用分水岭变换将图像分割成多个区域。最后,将分割出的目标物体用红色标记出来并显示出来。