摘要:多种子的区域生长算法,基于C++编写。
关键字:图像处理, 种子生长, 区域生长
1. 题外话
最近需要找一种简单对图像进行分割的算法,作为后续算法的前处理阶段。最开始想到的是聚类,但是聚类会有分割后不保证连通性的问题。
区域生长法可以保证分割后各自区域的连通性。但网上大多数的代码都是单个种子的,用的多是matlab或旧版本的opencv。索性,我照着单种子的思路,写了一个多种子的区域生长算法分享出来。
2. 单种子的区域生长
事实上,我就是参照这篇文章的思路写的代码。这篇文章的代码思路清晰,可惜用的旧版本的opencv,而且是单种子。
3. 多种子的区域生长
大体思路是这样的:
1、遍历全图,寻找是否还有undetermined的点,如有,作为种子
2、进行单种子的区域生长算法,生长出的区域记入矩阵mask
3、如果mask记录的区域面积足够大,把mask中的区域记录到矩阵dest中,状态为determined;如果mask记录的区域面积太小,把mask中的区域记录到矩阵dest中,状态为ignored(忽略分割出来面积过小的区域)
4、重复上述步骤,直到全图不存在undetermined的点
4. TODO
我对现在的算法还不是很满意,其一,我没有做太多优化,代码运行卡卡的;其二,我用的灰度图,以及“差值/阈值”的方式来判断是否相似,阈值不是自适应的。
注:新版本添加了自动寻找阈值的demo&#