分水岭分割利用图像形态学进行图像区域分割。它将图像灰度值看作一幅地形图,在地形图的局部极小值处与地形最低点是连通的,从最低点开始注水,水流会逐渐淹没地形较低点构成的区域,直到整个图像被淹没。在这个过程中,通过相关形态学处理,可以实现一幅图像的分水岭分割。 以下GIF图像给出了形象说明: 图像来自 https://www.cnblogs.com/mikewolf2002/p/3304118.html
分水岭分割具体算法思想如下: 1 设 2 当水面上涨到 n 时,当前蓄水池 当前所有蓄水池被淹没的像数集合表示为: 3 假设第 n 步时, 1) 2) 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() 分析截图:
参数资料 医学图像处理与分析 罗述谦 周果宏
|
|
来自: 昵称70747151 > 《待分类》