关闭

opencv中的meanshift图像分割

标签: MeanShift均值漂移图像分割opencv
6062人阅读 评论(3) 收藏 举报
分类:

 Meanshift(均值漂移)是一种在一组数据的密度分布中寻找局部极值的稳定的方法。Meanshift不仅可以用于图像滤波,视频跟踪,还可以用于图像分割。

     通过给出一组多维数据点,其维数是(x,y,r,g,b),均值漂移可以用一个窗口扫描空间来找到数据密度最大的区域,可以理解为数据分布最集中的区域。

     在这里需要注意,由于空间位置(也就是上面的xy)的变化范围与颜色的变化范围(上面的r,g,b)有极大的不同,所以,meanshift对这两个维数要采用不同的窗口半径。在opencv自带的meanshift分割函数cvPyrMeanShiftFiltering()中,就专门有2个半径参数,分别是spatialRadiuscolorRadius,这两个参数分别代表的是空间半径(x,y)和颜色(r,g,b)半径。

     当均值漂移窗口移动时,经过窗口变换后收敛到数据峰值的所有点都会连通起来,并且属于该峰值。这种所属关系从密集的尖峰辐射,形成了图像的分割。opencv中的meanshift分割实际上是由比例金字塔(cvPyrUP(),cvPyrDown())完成的,相关的介绍大家可以看年learning opencv中关于图像金字塔的介绍。

     下面的代码是我自己写的,大家可以参考一下。PS:我运行的时候发现实际上cvPyrMeanShiftFiltering的运行效率并不是很高,特别是把spatialRadius的值增大以后迭代时感觉很费时。

#include"highgui.h"
#include"cv.h"

#include <iostream>

using namespace cv;
using namespace std;


IplImage* src;  //source image
IplImage* dst;  //the dst image after meanshift
int spatialRad=10,colorRad=20,maxPryLevel=1;


void on_Meanshift(int )  //the callback function
{

	//cout<<"spatialRad="<<spatialRad<<endl;   //for test
	//cout<<"   colorRad="<<colorRad<<endl;
	//cout<<"        maxPryLevel="<<maxPryLevel<<endl;
	cvPyrMeanShiftFiltering(src,dst,spatialRad,colorRad,maxPryLevel);  //segmentation use meanshift
	cvShowImage("dst",dst);   //show the segmented image

}
void main()
{
	src = cvLoadImage("1.png");   //load the picture
	CvSize size;
	size.width = src->width;
	size.height = src->height;
	dst = cvCreateImage(size,src->depth,3);  //set the size of the dst image
	cvNamedWindow("src",CV_WINDOW_AUTOSIZE);
	cvNamedWindow("dst",CV_WINDOW_AUTOSIZE);
	cvShowImage("src",src);
	cvPyrMeanShiftFiltering(src,dst,spatialRad,colorRad,maxPryLevel);

	//create the trackbar
	cvCreateTrackbar("spatialRad","dst",&spatialRad,50,on_Meanshift); 
	cvCreateTrackbar("colorRad","dst",&colorRad,60,on_Meanshift);
	cvCreateTrackbar("maxPryLevel","dst",&maxPryLevel,5,on_Meanshift);

	cvShowImage("dst",dst);

	cvWaitKey(0);
}

   在代码中使用了trackbar,因此可以自己 改变spatialRad,colorRad,maxPryLevel的值,以便观察不同参数下的效果。截图如下



下面图是源图片



**************************************************************************************************************************

关注IT行业发展,关注互联网时代创业趋势,就来我们的公众号吧~~
微信公众号ID: chuangye_beginner   欢迎在公众号里与我互动
博主微博:IT修道者 
**************************************************************************************************************************
0
0
查看评论

学习OpenCV2——MeanShift之图形分割

本文介绍了在opencv中用meanshift进行图像分割。
  • GDFSG
  • GDFSG
  • 2016-03-24 21:40
  • 5480

使用Opencv中均值漂移meanShift跟踪移动目标

Mean Shift均值漂移算法是无参密度估计理论的一种,无参密度估计不需要事先知道对象的任何先验知识,完全依靠训练数据进行估计,并且可以用于任意形状的密度估计,在某一连续点处的密度函数值可由该点邻域中的若干样本点估计得出。 Mean shift将特征空间视为先验概率密度函数,那么输入就被视为是一组...
  • dcrmg
  • dcrmg
  • 2016-09-28 23:02
  • 4217

OpenCV—Mean Shift算法:直方图反向投影查找目标

本文为学习《OpenCV计算机视觉编程攻略(第二版)》4.6节,均值漂算法查找目标的内容笔记。直方图反向投影的结果实质是一个概率分布图,表示一个指定图像片段出现在特定位置的概率。假设我们已经知道图像中某个物体的大致位置,就可以用概率分布图找到物体的准确位置。最可能出现的位置就是窗口中概率最大的位置。...
  • iracer
  • iracer
  • 2015-10-07 22:08
  • 2770

学习OpenCV2——MeanShift之目标跟踪

前面学习了MeanShift用于目标检测,现在来看看MeanShift如何用于目标跟踪。
  • GDFSG
  • GDFSG
  • 2016-03-30 16:30
  • 5145

图像分割—mean shift(OpenCV源码注解)

不得不说,这个OpenCV实现实在不咋地 main.cpp
  • soidnhp
  • soidnhp
  • 2014-08-09 21:15
  • 6098

OpenCV之均值漂移(Mean Shift)算法

Mean Shift向量Mean Shift向量:偏移的均值向量。 Mean Shift算法:指一个迭代的步骤,即先算出当前点的偏移均值,移动该点到其偏移均值,然后以此为新的起始点,继续移动,直到满足一定的条件结束。
  • qq_23968185
  • qq_23968185
  • 2016-07-18 00:13
  • 5446

基于MeanShift的Camshift算法原理详解(opencv实现,有源码)

基于MeanShift的Camshift算法原理详解(整理) 第一篇MeanShift原理和实现 1  MeanShift原理 如下图所示:矩形窗口中的红色点代表特征数据点,矩形中的圆圈代表选取窗口。meanshift算法的目的是找到含有最多特征的窗口区域,即使圆心与概率密度函数的局...
  • tiandijun
  • tiandijun
  • 2014-06-18 21:15
  • 6615

OpenCV meanshift目标跟踪总结

转自:http://www.cnblogs.com/cfantaisie/archive/2011/06/10/2077190.html meanshift算法思想其实很简单:利用概率密度的梯度爬升来寻找局部最优。它要做的就是输入一个在图像的范围,然后一直迭代(朝着重心迭代)直到满足你的要求为止。...
  • sinat_31135199
  • sinat_31135199
  • 2016-11-15 09:51
  • 1260

转:基于Opencv的MeanShift跟踪算法实现

 基于Opencv的MeanShift跟踪算法实现#include "cv.h"#include "highgui.h"#include #include IplImage *image = 0, *hsv = 0, *hue = 0, *mask ...
  • koriya
  • koriya
  • 2008-11-21 19:48
  • 14401

OpenCV视频目标跟踪示例教程(Meanshift)

使用Opencv中的Camshift进行视频中目标跟踪是一个不错的选择,这方面的示例很多,但是大多代码不全,或者代码存在问题,不能正常使用,这里,对很多文章进行整理后,贴出了正确可以使用的代码。       首先下载OpenCV,  http://source...
  • luopeiyuan1990
  • luopeiyuan1990
  • 2013-04-13 10:38
  • 5371
    个人资料
    • 访问:197437次
    • 积分:2911
    • 等级:
    • 排名:第14404名
    • 原创:86篇
    • 转载:6篇
    • 译文:0篇
    • 评论:75条
    文章分类
    最新评论