Opencv实现用于图像分割分水岭算法实现用于图像分割分水岭算法
主要为大家详细介绍了Opencv实现用于图像分割分水岭算法,具有一定的参考价值,感兴趣的小伙伴们可以参
考一下
目标目标
• 使用分水岭算法基于掩模的图像分割
• 学习函数: cv2.watershed()
原理原理
任何一幅灰度图像都可以被看成拓扑平面,灰度值高的区域可以被看成是山峰,灰度值低的区域可以被看成是山谷。我们
向每一个山谷中灌不同颜色的水,随着水的位的升高,不同山谷的水就会相遇汇合,为了防止不同山谷的水汇合,我们需要在
水汇合的地方构建起堤坝。不停的灌水,不停的构建堤坝直到所有的山峰都被水淹没。我们构建好的堤坝就是对图像的分割。
这就是分水岭算法的背后哲理。
但是这种方法通常都会得到过度分割的结果,这是由噪声或者图像中其他不规律的因素造成的。为了减少这种影响,
OpenCV 采用了基于掩模的分水岭算法,在这种算法中我们要设置哪些山谷点会汇合,哪些不会,这是一种交互式的图像分
割。我们要做的就是给我们已知的对象打上不同的标签。如果某个
区域肯定是前景或对象,就使用某个颜色(或灰度值)标签标记它。如果某个区域肯定不是对象而是背景就使用另外一个颜色
标签标记。而剩下的不能确定是前景还是背景的区域就用 0 标记。这就是我们的标签。然后实施分水岭算法。每一次灌水,
我们的标签就会被更新,当两个不同颜色的标签相遇时就构建堤
坝,直到将所有山峰淹没,最后我们得到的边界对象(堤坝)的值为 -1。
代码代码
下面的例子中我们将就和距离变换和分水岭算法对紧挨在一起的对象进行分割。
如下图所示,这些硬币紧挨在一起。就算你使用阈值操作,它们任然是紧挨着的。
我们从找到这些硬币的近似估计值开始,我们使用Otsu's二值化。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('image/coins.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
结果图:
现在我们要去除图像中的所有的白噪声,这就需要使用形态学中的开运算。为了去除对象上小的空洞我们需要使用形态学
评论10
最新资源