多种子的区域生长算法

博客搬家,下面图片可能显示不正常,请转到:https://imlogm.github.io/%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86/multi-seed-region-grow/


摘要:多种子的区域生长算法,基于C++编写。

关键字:图像处理, 种子生长, 区域生长

1. 题外话

最近需要找一种简单对图像进行分割的算法,作为后续算法的前处理阶段。最开始想到的是聚类,但是聚类会有分割后不保证连通性的问题。

区域生长法可以保证分割后各自区域的连通性。但网上大多数的代码都是单个种子的,用的多是matlab或旧版本的opencv。索性,我照着单种子的思路,写了一个多种子的区域生长算法分享出来。

2. 单种子的区域生长

单种子的区域生长可以看这篇文章:图像处理算法1——区域生长法-夏天的风

事实上,我就是参照这篇文章的思路写的代码。这篇文章的代码思路清晰,可惜用的旧版本的opencv,而且是单种子。

3. 多种子的区域生长

大体思路是这样的:

1、遍历全图,寻找是否还有undetermined的点,如有,作为种子

2、进行单种子的区域生长算法,生长出的区域记入矩阵mask

3、如果mask记录的区域面积足够大,把mask中的区域记录到矩阵dest中,状态为determined;如果mask记录的区域面积太小,把mask中的区域记录到矩阵dest中,状态为ignored(忽略分割出来面积过小的区域)

4、重复上述步骤,直到全图不存在undetermined的点

4. TODO

我对现在的算法还不是很满意,其一,我没有做太多优化,代码运行卡卡的;其二,我用的灰度图,以及“差值/阈值”的方式来判断是否相似,阈值不是自适应的。

对于图片尺寸越大越卡这个问题,可以在读图片的时候统一resize成256×256,大多数追求速度的图像处理算法都会有这步。

对于彩色图,用3个通道的距离来判断相似度会更好。

以上两个问题,我为了保持算法的原汁原味,就没有添加。(其实是我懒得写了~)

5. 代码

详见Github:https://github.com/imLogM/multi_seed_region_grow

6. 效果

  • 原图
  • 结果

猜你喜欢

转载自blog.csdn.net/qq_28739605/article/details/80403710