分水岭算法是图像分割比较基础也是比较简单的方法,虽然随着神经网络的盛行,这种方法已经被人淡忘,不过作为图像处理的专业人员还是有必要了解这种方法的,原理可以自行查阅资料,这里仅使用python中封装好的方法验证效果。
import cv2
import numpy as np
from scipy import ndimage as ndi
from skimage import morphology,segmentation,filters
img_path = "D://001.jpg"
img_bgr = cv2.imread(img_path) #根据指定的图片路径读取图像
img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)
img_gauss = cv2.GaussianBlur(img_gray, (3, 3), 0) #过滤噪声
#将梯度值低于10的作为开始标记点
markers = filters.rank.gradient(img_gauss, morphology.disk(5)) < 10
markers = ndi.label(markers)[0]
img_gradient = filters.rank.gradient(img_gauss, morphology.disk(2)) #计算梯度
labels = segmentation.watershed(img_gradient, markers) #基于梯度的分水岭算法
labels = labels.astype(np.uint8)
img_segment = cv2.applyColorMap(labels, cv2.COLORMAP_RAINBOW) #给标签着色,伪彩色图
cv2.imwrite("D://001_gradient.jpg", img_gradient)
cv2.imwrite("D://001_labels.jpg", img_segment)
先看效果图:
涉及的函数介绍: