opencv中的meanshift图像分割
来源:互联网 发布:电脑打不开windows 编辑:程序博客网 时间:2024/05/16 09:51
Meanshift(均值漂移)是一种在一组数据的密度分布中寻找局部极值的稳定的方法。Meanshift不仅可以用于图像滤波,视频跟踪,还可以用于图像分割。
通过给出一组多维数据点,其维数是(x,y,r,g,b),均值漂移可以用一个窗口扫描空间来找到数据密度最大的区域,可以理解为数据分布最集中的区域。
在这里需要注意,由于空间位置(也就是上面的x和y)的变化范围与颜色的变化范围(上面的r,g,b)有极大的不同,所以,meanshift对这两个维数要采用不同的窗口半径。在opencv自带的meanshift分割函数cvPyrMeanShiftFiltering()中,就专门有2个半径参数,分别是spatialRadius和colorRadius,这两个参数分别代表的是空间半径(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 imageIplImage* dst; //the dst image after meanshiftint 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 meanshiftcvShowImage("dst",dst); //show the segmented image}void main(){src = cvLoadImage("1.png"); //load the pictureCvSize size;size.width = src->width;size.height = src->height;dst = cvCreateImage(size,src->depth,3); //set the size of the dst imagecvNamedWindow("src",CV_WINDOW_AUTOSIZE);cvNamedWindow("dst",CV_WINDOW_AUTOSIZE);cvShowImage("src",src);cvPyrMeanShiftFiltering(src,dst,spatialRad,colorRad,maxPryLevel);//create the trackbarcvCreateTrackbar("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的值,以便观察不同参数下的效果。截图如下
下面图是源图片
**************************************************************************************************************************
- opencv中的meanshift图像分割
- OpenCV meanshift 图像分割代码
- MeanShift用于彩色图像分割(OpenCV)
- meanshift 图像分割
- meanshift图像分割示例
- opencv2-6 图像分割MeanShift
- OpenCV之meanshift分割详解
- 图像分割学习笔记_1(opencv自带meanshift分割例子)
- 图像分割学习笔记_1(opencv自带meanshift分割例子)
- opencv中的三种图像分割算法
- Meanshift图像平滑之opencv实现
- meanshift算法学习(二):opencv中的meanshift
- opencv 图像分割
- opencv 金字塔图像分割
- opencv 金字塔图像分割
- opencv图像分割
- opencv 金字塔图像分割
- opencv 金字塔图像分割
- Best Time to Buy and Sell Stock II
- 图算法小总结(小Tip)
- 如何打开已经创建的MongoDB数据库
- C#小练习:SerialPort读写操作
- matlab 6.800e+0.03(已解决)
- opencv中的meanshift图像分割
- KM算法 详解+模板
- ubuntu server下调用boost::filesystem失败
- A^B = B^A
- Why 使用TLS记录协议封装IP层VPN IS A Bad Idea
- PBOC借贷记交易流程与命令解析(一)
- C++ MD5加密实现
- java好不好学啊
- js:深入函数的定义