18. OpenCV--分水岭算法(前面知识总和的运用)

》》点赞,收藏+关注,理财&技术不迷路《《

分水岭算法对图像分割非常有用。这种方法是一种很完美的分割算法。分水岭是一个很重要的算法,能不能实际应用OpenCV在实际中,分水岭就是一个标准。

分水岭(Watershed)是基于地理形态的分析的图像分割算法,模仿地理结构(比如山川、沟壑,盆地)来实现对不同物体的分类。

分水岭算法中会用到一个重要的概念——测地线距离。

OpenCV中的分水岭就是基于距离变换,基于距离变换找到一些种子点(mark),从种子出发找到一些根据像素的梯度变换出发寻找到它的边缘,找到边缘后用分水岭标记出来,标记出来后图像就会标记出很多分水岭的水坝。

总结:

"""

分水岭算法原理:

  任何一副灰度图像都可以被看成拓扑平面,灰度值高的区域可以被看成是 山峰,灰度值低的区域可以被看成是山谷。

我们向每一个山谷中灌不同颜色的水。随着水的位的升高,不同山谷的水就会相遇汇合,为了防止不同山谷的水 汇合,

我们需要在水汇合的地方构建起堤坝。不停的灌水,不停的构建堤坝知 道所有的山峰都被水淹没。

我们构建好的堤坝就是对图像的分割。这就是分水岭算法的背后哲理

  但是这种方法通常都会得到过度分割的结果,这是由噪声或者图像中其他不规律的因素造成的。

为了减少这种影响,OpenCV 采用了基于掩模的分水岭算法,在这种算法中我们要设置那些山谷点会汇合,那些不会。

这是一种交互式的图像分割。我们要做的就是给我们已知的对象打上不同的标签。

如果某个区域肯定是前景或对象,就使用某个颜色(或灰度值)标签标记它。

如果某个区域肯定不是对象而是背景就使用另外一个颜色标签标记。而剩下的不能确定是前景还是背景的区域就用 0 标记。

这就是我们的标签。然后实施分水岭算法。

每一次灌水,我们的标签就会被更新,当两个不同颜色的标签相遇时就构建堤坝,直到将所有山峰淹没,

最后我们得到的边界对象(堤坝)的值为 -1。

基于距离的分水岭分割流程:

输入图像->灰度->二值->距离变换->寻找种子->生成marker->分水岭变换->输出图像

"""

前期准备:降噪,二值化,举例变换都要用到形态学。

上面二值化出来的图像不是很好,所以我们要想办法先去噪。

去噪完后里面还是有一些小点点,这个时候我们可以来一个形态学的操作。

对opening进行一个距离变换。

    # Finding sure foreground area

    # 距离变换的基本含义是计算一个图像中非零像素点到最近的零像素点的距离,

    # 也就是到零像素点的最短距离

    # 个最常见的距离变换算法就是通过连续的腐蚀操作来实现,腐蚀操作的停止条件是所有前景像素都被完全腐蚀。

    # 这样根据腐蚀的先后顺序,我们就得到各个前景像素点到前景中心像素点的距离。

    # 根据各个像素点的距离值,设置为不同的灰度值。这样就完成了二值图像的距离变换

    # cv2.distanceTransform(src, distanceType, maskSize)

    # 第二个参数 0,1,2 分别表示 CV_DIST_L1, CV_DIST_L2 , CV_DIST_C

我们现在就要来获取最亮的地方,最亮的地方就是我们要找的阈值。

上图就得到了我们最完美的结果,但是要是我们最开始不去噪声的话,效果就会差很多很多:

你可能感兴趣的:(18. OpenCV--分水岭算法(前面知识总和的运用))