opencv中的meanshift图像切割
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 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的值,以便观察不同參数下的效果。截图例如以下
以下图是源图片
opencv中的meanshift图像切割的更多相关文章
- opencv2.4.13+python2.7学习笔记--OpenCV中的图像处理--图像轮廓
阅读对象:无要求. 1.代码 ''' OpenCV中的轮廓 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度.为了更加准确,要使用二值化图像.在寻找轮廓之前,要进行阈值化 ...
- OpenCV——使用ROI进行图像切割
ROI(region of interest)——感兴趣区域. 1.用途 这个区域是图像分析所关注的重点.圈定这个区域,以便进行进一步的处理.而且,使用ROI指定 想读入的目标,可以减少处理时间,增加 ...
- opencv2.4.13+python2.7学习笔记--OpenCV中的图像处理--图像轮廓特征和几何矩
阅读对象:对概率论中的期望有一点了解. 1.图像几何矩 1.1简述 图像的几何矩包括空间矩.中心矩和中心归一化矩.几何矩具有平移.旋转和尺度不变性,一般是用来做大粒度的区分,用来过滤显然不相关的图像. ...
- OpenCV学习(39) OpenCV中的LBP图像
本章我们学习LBP图像的原理和使用,因为接下来教程我们要使用LBP图像的直方图来进行脸部识别. 参考资料: http://docs.opencv.org/modules/contrib/doc/fac ...
- (原)Opencv中直方图均衡和图像动态范围拉伸的代码
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5102032.html 参考网址: http://blog.csdn.net/abcjennifer/a ...
- 【视频开发】OpenCV中Mat,图像二维指针和CxImage类的转换
在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...
- [OpenCV-Python] OpenCV 中视频分析 部分 VI
部分 VI视频分析 OpenCV-Python 中文教程(搬运)目录 39 Meanshift 和 和 Camshift 目标 • 本节我们要学习使用 Meanshift 和 Camshift 算法在 ...
- 图像金字塔及其在 OpenCV 中的应用范例(下)
前言 本文将主要讲解如何使用 OpenCV 实现图像分割,这也是图像金字塔在 OpenCV 中的一个重要应用. 关于图像分割 在计算机视觉领域,图像分割(Segmentation)指的是将数字图像细分 ...
- opencv分水岭算法对图像进行切割
先看效果 说明 使用分水岭算法对图像进行切割,设置一个标记图像能达到比較好的效果,还能防止过度切割. 1.这里首先对阈值化的二值图像进行腐蚀,去掉小的白色区域,得到图像的前景区域.并对前景区域用255 ...
随机推荐
- JVM调优总结(四)-垃圾回收面临的问题
如何区分垃圾 上面说到的“引用计数”法,通过统计控制生成对象和删除对象时的引用数来判断.垃圾回收程序收集计数为0的对象即可.但是这种方法无法解决循环引用.所以,后来实现的垃圾判断算法中,都是从程序运行 ...
- TCP/IP笔记 三.运输层(1)——UDP,TCP
1. 运输层 1.1 两种协议:TCP和UDP. (1)TCP:提供了一种可靠的数据传输服务,TCP是面向连接的,只有链接建立起来后才能通信. (2)UDP:是把数据直接发出去,而不管对方是不是在收信 ...
- 在Centos下安装matlab
首先科普一下什么事matlab MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发.数据可视化.数据分析以及数值计算的高级技术计算语言和交互式环境,主要包含MATLAB和Simu ...
- android的JNI标准 android的NDK
转载的! Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) ...
- B4A的软件下载
http://pan.baidu.com/share/home?uk=909467506#category/type=0
- perl 访问类方法的几种方式
[root@wx03 test]# cat Horse.pm package Horse; use base qw(Critter); sub new { my $invocant = shift; ...
- sharepoint 2013 根据网站模版创建网站,并赋值网站权限 create a site by custom site template
通过程序,根据网站模版,创建新的网站 private void CreateSiteBySiteTemplate() { SPSecurity.RunWithElevatedPrivileges(de ...
- perl学习(8) 控制:unless,until,next,redo,last
Perl中实现了所有C 的操作符! Perl力求代码最少! 1.1.unless unless的含义是:除非条件为真,否则执行块中的代码,和if正好相反 unless($fred=~ /^[A-Z_] ...
- HDU3572_Task Schedule(网络流最大流)
解题报告 题意: 工厂有m台机器,须要做n个任务.对于一个任务i.你须要花费一个机器Pi天,并且,開始做这个任务的时间要>=Si,完毕这个任务的时间<=Ei. 对于一个任务,仅仅能由一个机 ...
- 08-使用for循环输出杨辉三角(循环)
/** * 使用循环输出杨辉三角 * * */ public class Test6 { public static void main(String[] args) { // 创建二维数组 int ...