分水岭算法简单实现

一直没看分水岭,vc图像处理的书对该算法的介绍也很少,cximage也找到相关的算法。就看了matlab何opencv。matlab对分水岭的算法是封装的也就没看源码,而opencv的写的实在太高升了,水平差在加没有过opencv,没办法看懂。网上找了几个算法的源码,一个老外用template写的,一个是国人写的。老外写的是NB,看不动,国人写的看了一些也是云里雾里的,最后么办法自己想办法写了个。

 

首先声明,这个只是简单的实现,仅仅针对一些简单的情况。效果还可以但有不足,一些地方的分割有可能将原本的单一前景给分割掉。和我一样的菜鸟,可以看看。高人路过可以指导。

 

先介绍下什么叫分水岭,

定义:

所谓图像分割是指将图像中具有特殊涵义的不同区域区分开来,这些区域是互相不交叉的,每一个区域都满足特定区域的一致性

本代码,没有完全的实现,只能满足现行对工作的需要。

分水岭的原理网上有很多,我仅仅说明下我对这个算法的简单理解:该算法可以解决针对,你可以用分割成前景,但有些干扰或者其他原因,分割出来的前景可以连成一片,无法区分那个前景是那个。这个时候,就可以用这个分水岭算法来帮忙。

(先看几张分水岭原理的图片,这个打字太麻烦,直接看图片吧)

 

算法的理解我花了半天多的时间才看明白。我的理解(可能有错误或者不足)就是M为灰度值最小(或者最大相对背景)为最低的盆地,其实也就是各个前景最为远离背景的地方(这个肯定有不足的理解,希望各位看客指导一下)。根据这个盆地我们不断的加水,使得盆地的水位不断的提升(也就是不断的靠近背景),在个提升地盘的时候,可能会出现和其他盆地相冲突的地方。这个时候我们需要本着和谐的态度来防止这种事情的发生,就是在冲突的地方建设堤坝。这个堤坝其实就是我们需要寻找的东西。

提升盆地水位的时候有三种可能

1:盆地上方实力,也就说这个区域的灰度和该盆地相邻,和其他势力没关系。这种情况,肯定是被吞并的。

2:盆地相邻实力,也就说这个区域的灰度不仅仅和该盆地相邻,也和其他的盆地有关系。这种情况,就是我们需要寻找的堤坝。

3:当水位提到一定高度的时候出现的新盆地,该地区和原始的盆地均不关。该水位点为该区域最低水位。这个时候就有新的盆地生成,也就是新的恶势力出现了。

针对上面的理解,我写了个依据图像距离变化的分水岭,适合一些小部分区域相交叉的情况。

首先我们需要对图像进行二值化,分割出感兴趣的位置区域。二值化,大家随便,只要能分割进行。

第二进行距离变换,代码来自一个vc图像算法原理和实现,大概这个书名吧

这个函数是写在一个类里面的所以,一些图像的基本参数为类的成员。对这个函数我就不再说明了。

这个分水岭有二个参数,第一是有二值得到的距离数据,第二个是这个距离数据的直方图统计。

对直方图的统计来决定循环的次数,当一个灰度被处理,如被水位吞没或者成为堤坝,均认为被处理。

说明1:首先找到直方图统计中最低的灰度做为起点水位

说明2:根据这个水位来寻找所以的盆地。此时的盆地就2中情况。一独立,二和相关的盆地相连接。由于是根据直方图统计来做的所以不知道是否连通。所以会出现如下情况,第一在8个方向能找到起始的盆地,那么我们将这个点淹没做为盆地,并将记录标记设置为真。二8方向没有盆地标记,那么其有可能是此刻盆地的势力范围,但暂时没有发展过来,或者和此刻的盆地无关。那么当标记为真的情况均处理完毕的时候,说明低水位的第一个盆地已经找完了。剩下的是这个水位下的其他盆地。此时我们增加一个盆地标记,开始寻找第二个盆地。如何循环直到所有的初始水位盆地均被找出来。

...(太晚了明天再接着写)

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值