最近需要基于opencv做一下图像分割的东西,之前接触图像处理也比较浅显,很多概念也不是很清楚,只能慢慢自己体会了
1. 分水岭算法
原理与例子:http://blog.csdn.net/h_wlyfw/article/details/38564537
http://www.javashuo.com/content/p-6555513.html
http://docs.opencv.org/3.2.0/d3/db4/tutorial_py_watershed.html
源码:http://blog.csdn.net/ttransposition/article/details/9007197
基本思路是:先找到marker的边缘,然后往4领域扩散,不同的2部分扩散相交就形成山脊,扩散的节点加到一个按照梯度降序排列的优先队列中
按照opencv的写法,最后调用watershed方法得到的marker中背景是连在一块的,但是项目需要画出这些label pixel(不知道怎么形容。。。Matlab的watershed函数返回值就是这个,在doc里面是这样称呼的,但是opencv返回值不是这个啊。。。)来,以此分割图像成若干块不相交的部分,
仔细分析源码发现:一旦扩散到背景像素就会一直扩散背景,因为背景的梯度一般比较小,这样背景就一直处在优先队列的头部,这样就会导致背景一直在扩散,别的区域根本扩不出去,导致最后以实际物体的边界为山脊
想来下,可以先对图像进行连通区域分割,然后得到label matrix,然后对label mat