0042-在OpenCV下利用均值漂移(Meanshift)进行图像分割

均值漂移实现图像分割的大概原理请见网页http://www.docin.com/p-631981950.html,网页中对原理的理解已经说得比较清楚。如果你想了解详细原理,可以参考PAMI 2003的一篇文章,非常经典的哦,文章名称是 Mean Shift:A Robust Approach Toward Feature Space Analysis。

算法具点过程:
如下图所示:原点是选定的初始迭代点,将蓝色圆(其半径记为h)内所有向量相加,相加的结果如黄色向量所示,其终点指向上图所示的红色点,则下一次迭代以该红色点为圆心,h为半径画圆,然后求这个圆内以圆心为起点所有向量的和。如此迭代下去,圆的中心点为收敛于一个固定的点,也就是概率密度最大的地方。接着,在实现图像分割时,将收敛于同一极大值的所有点归为一类,将符合参数条件的类合并就得到图像分割的结果。Meanshift算法就是用于这个特点,体现了很好的边界识别特性。


OpenCV中提供了函数pyrMeanShiftFiltering()来实现色彩聚类平滑滤波,进而间接实现图像分割,其利用的原理正是均值漂移原理。注意,这个函数严格来说并不是进行图像的分割,而是图像在色彩层面的平滑滤波,它可以中和色彩分布相近的颜色,平滑色彩细节,侵蚀掉面积较小的颜色区域,所以在Opencv中它的后缀是滤波“Filter”,而不是分割“segment”。

函数原型如下:
C++: void pyrMeanShiftFiltering(InputArray src, OutputArray dst, double sp, double sr, int maxLevel=1, TermCriteria termcrit=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS,5,1) )
参数意义如下:
src:源图像
dst:输出图像
sp:空间窗口半径
sr:颜色窗口半径
maxLevel:高斯金字塔最高层数
termcrit:-均值漂移参数的终止条件

代码如下:
代码请加Q2034196302获取
代码请加Q2034196302获取
代码请加Q2034196302获取

代码中使用了floodFill函数进行图像分割的泛洪填充,这个函数的使用见下面这篇文章https://blog.csdn.net/opencv_source/article/details/83752957
代码运行结果如下图所示


 

猜你喜欢

转载自blog.csdn.net/opencv_source/article/details/83753160