分水岭分割

分水岭分割利用图像形态学进行图像区域分割。它将图像灰度值看作一幅地形图,在地形图的局部极小值处与地形最低点是连通的,从最低点开始注水,水流会逐渐淹没地形较低点构成的区域,直到整个图像被淹没。在这个过程中,通过相关形态学处理,可以实现一幅图像的分水岭分割。

    以下GIF图像给出了形象说明:

    

    图像来自 https://www.cnblogs.com/mikewolf2002/p/3304118.html

    分水岭分割具体算法思想如下:

    1 设 

 为地形图上完成分割后的 r 个蓄水池,

 为完成分割后蓄水池 

 内的像数集合,

 为地形图上灰度值小于 n 的像数集合;

    2 当水面上涨到 n 时,当前蓄水池 

 被淹没的像数集合可表示为: 

 ,

       当前所有蓄水池被淹没的像数集合表示为:

    3 假设第 n 步时,

 已知, 令 Q 表示 

 集合构成的连通区域,通过考察 Q 上各个连通区域 q 与 

 连通区域关系,分别进行如下处理:

      1)

 为空时,发现一个新的蓄水池 q,将 q 加入 

      2)

 不为空,但仅包含 

 的一个连通分量,将 q 合并到 

 中构成 

,蓄水池面积扩大,但数量保持不变;

      3)

 不为空,但包含 

 的两个及两个以上连通分量,此时需要构造堤坝防止 

 中蓄水池融合;

    4 重复步骤3,直到 n = nmax + 1 时,

 表示整个图像像数,分割完成,

 各个连通区域即为分割的蓄水池区域,留下的堤坝则为分割边界。

    以上为分水岭分割基本思想,图像的每个极小值点构成一个蓄水池的中心点。由于图像中存在较多极小值点,故一般图像分水岭分割可能得到很多小的区域。可以通过手动设定蓄水池位置来避免过多极小值影响,算法仅认为设定点为蓄水池中心点,从而忽略掉任意其他极小值点。

    同时,可以首先对图像进行一阶微分处理,在图像平滑区域图像梯度值较小,在图像边缘区域梯度值较大。然后使用梯度图像作为地形图,可以分割出平滑图像块。

    在 opencv 中,函数 cv::watershed() 实现了分水岭分割,该函数将图像边缘转换为地形图上的山脊,图像平滑区域转换为地形图上的山谷,同时使用 markers 参数标记蓄水池,实现分水岭分割,具体如下:

    void cv::watershed(cv::InputArray image, cv::InputOutputArray markers);

    image: 8位3通道图像,函数对图像进行一阶微分处理,视梯度图为地形图上的山脊与山谷;

    markers: 32位有符号整数图像,使用 1,2,3... 等序号标记不同的蓄水池。当完成分割后,该图像形成最终蓄水池区域标记图像,其中,值 -1 表示区域边界。

    以下给出 cv::watershed() 分析截图:

     

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luofeiju

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值