图像分割学习笔记_1(opencv自带meanshift分割例子)
图像分割学习笔记_1(opencv自带meanshift分割例子)
Meanshift不仅可以用于图像滤波,视频跟踪,还可以用于图像分割。
一般而言一副图像的特征点至少可以提取出5维,即(x,y,r,g,b),众所周知,meanshift经常用来寻找模态点,即密度最大的点。所以这里同样可以用它来寻找这5维空间的模态点,由于不同的点最终会收敛到不同的峰值,所以这些点就形成了一类,这样就完成了图像分割的目的,有点聚类的意思在里面。
有一点需要注意的是图像像素的变化范围和坐标的变化范围是不同的,所以我们在使用窗口对这些数据点进行模态检测时,需要使用不同的窗口半径。因此在opencv自带的meanshift分割函数pyrMeanShiftFiltering()函数中,就专门有2个参数供选择空间搜索窗口半径和颜色窗口搜索半径的。
由函数名pyrMeanShiftFiltering可知,这里是将meanshift算法和图像金字塔相结合用来分割的,所以其参数列表中就有一个专门定义所需金字塔层数的变量。
本次试验来源于opencv2.3.1版本中自带的一个sample。其主要过程是,首先设置好参数,然后用函数pyrMeanShiftFiltering()对输入的图像进行分割。分割后的结果保存在该函数的第二个参数即输出图像中,最后根据该分割图像的特点用floodFill()函数对其分割的结果用不同的颜色进行填充。当然该函数的使用暂时没有彻底的弄清楚。
实验结果如下:
分割前的图片:
分割后的图片:
不同的颜色代表不同的分割类别。
关于本次试验的一点总结:
对createTrackbar()函数的使用,即滑动条函数,该函数有个参数就是滑动条响应函数的参数为(int,void *),这个是固定的,不能改。但是在调用的时候可以不写,函数实现的时候当然不能少了,见代码注释。
之所以createTrackbar()能响应,是因为主函数中使用了waitKey()函数,该函数不仅能够无限等待,还能够与用户进行交互,见代码注释。
关于本程序经常运行着会报内存错误,比如有时拖动滑动条就会内存报错,不知道为什么,opencv自带的sample,其代码一般是很优秀的。不过opencv本身的bug也不少,一直在完善中,情有可原。也有可能是自己稍微改了其代码造成的,不过本人认为这个应该不是主要原因。
实验代码如下:
1 // meanshift_segmentation.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <opencv2/core/core.hpp> 6 #include <opencv2/highgui/highgui.hpp> 7 #include <opencv2/imgproc/imgproc.hpp> 8 #include <iostream> 9 10 using namespace cv; 11 using namespace std; 12 13 14 Mat src,dst; 15 int spatialRad=10,colorRad=10,maxPryLevel=1; 16 //const Scalar& colorDiff=Scalar::all(1); 17 18 void meanshift_seg(int,void *) 19 { 20 //调用meanshift图像金字塔进行分割 21 pyrMeanShiftFiltering(src,dst,spatialRad,colorRad,maxPryLevel); 22 RNG rng=theRNG(); 23 Mat mask(dst.rows+2,dst.cols+2,CV_8UC1,Scalar::all(0)); 24 for(int i=0;i<dst.rows;i++) //opencv图像等矩阵也是基于0索引的 25 for(int j=0;j<dst.cols;j++) 26 if(mask.at<uchar>(i+1,j+1)==0) 27 { 28 Scalar newcolor(rng(256),rng(256),rng(256)); 29 floodFill(dst,mask,Point(i,j),newcolor,0,Scalar::all(1),Scalar::all(1)); 30 // floodFill(dst,mask,Point(i,j),newcolor,0,colorDiff,colorDiff); 31 } 32 imshow("dst",dst); 33 } 34 35 36 int main(int argc, uchar* argv[]) 37 { 38 39 namedWindow("src",WINDOW_AUTOSIZE); 40 namedWindow("dst",WINDOW_AUTOSIZE); 41 42 src=imread("stuff.jpg"); 43 CV_Assert(!src.empty()); 44 45 spatialRad=10; 46 colorRad=10; 47 maxPryLevel=1; 48 49 //虽然createTrackbar函数的参数onChange函数要求其2个参数形式为onChange(int,void*) 50 //但是这里是系统响应函数,在使用createTrackbar函数时,其调用的函数可以不用写参数,甚至 51 //括号都不用写,但是其调用函数的实现过程中还是需要满足(int,void*)2个参数类型 52 createTrackbar("spatialRad","dst",&spatialRad,80,meanshift_seg); 53 createTrackbar("colorRad","dst",&colorRad,60,meanshift_seg); 54 createTrackbar("maxPryLevel","dst",&maxPryLevel,5,meanshift_seg); 55 56 // meanshift_seg(0,0); 57 58 imshow("src",src); 59 /*char c=(char)waitKey(); 60 if(27==c) 61 return 0;*/ 62 imshow("dst",src); 63 waitKey();//无限等待用户交互响应 64 // while(1);//这里不能用while(1)的原因是需要等待用户的交互,而while(1)没有该功能。虽然2者都有无限等待的作用。 65 return 0; 66 }
图像分割学习笔记_1(opencv自带meanshift分割例子)相关推荐
- 目标跟踪学习笔记_1(opencv中meanshift和camshift例子的应用)
在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行op ...
- 基础学习笔记之opencv(14):随机数发生器绘制文字
本文主要介绍下opencv中自带的一个随机数发生器的类RNG,这里我用这个类来画一些图形,和基础学习笔记之opencv(13):基本绘图 一文中类似,只是 这里画出来图像的坐标,大小,颜色,角度等所有 ...
- 【web开发学习笔记】Structs2 Result学习笔记(三)带參数的结果集
Result学习笔记(三)带參数的结果集 第一部分:代码 //前端 <head> <meta http-equiv="Content-Type" content= ...
- 12864液晶深入学习笔记_1——基于msp430g2553
12864液晶学习笔记 Created on: 2012-8-30 Author: zhang bin 这是我对12864的学习笔记,12864液晶功能很全面,使用起来也很方便,能够满足一般的研究和工 ...
- OpenCV学习笔记#002 OpenCV相机检校例程运行
OpenCV学习笔记#002 OpenCV相机检校例程运行 OpenCV学习笔记#002 OpenCV相机检校例程运行 所需文件 修改文件 修改in_VID5.xml 修改VID5.xml VS 设置 ...
- 带时滞的病毒模型计算模板【基于matlab的动力学模型学习笔记_1】
/*仅当作学习笔记,若有纰漏欢迎友好交流指正,此外若能提供一点帮助将会十分荣幸*/ 摘 要:无论是生物病毒还是网络病毒,其内核的传播机理都有很多的相似之处.因此,本文在经典的SIR病毒模型基础上改造出 ...
- 尚学堂JAVA高级学习笔记_1/2
尚学堂JAVA高级学习笔记 文章目录 尚学堂JAVA高级学习笔记 写在前面 第1章 手写webserver 1. 灵魂反射 2. 高效解析xml 3. 解析webxml 4. 反射webxml 5. ...
- 莫队算法学习笔记(二)——带修莫队
前言:什么是莫队 莫队算法,是一个十分优雅的暴力. 普通的莫队可以轻松解决一些离线问题,但是,当遇上了一些有修改操作的问题,普通莫队就无能为力了. 于是,改进后的莫队--带修莫队就这样产生了. L i ...
- cublas 的学习笔记_1
最近开始接触cublas,为了监督自己的学习,并希望得到其他朋友的指点,特地将自己的学习笔记写出来 1. 参考文档 CUBLAS_Library_2.1.pdf > 2. 环境配置 1)添加头 ...
- 《OpenCV3编程入门》学习笔记八:图像轮廓与分割
一:内容介绍 本节主要介绍OpenCV的imgproc模块的图像轮廓与分割部分: 1. 查找并绘制轮廓 2. 寻找物体的凸包 3. 使用多边形将轮廓包围 4. 图像的矩 5. 分水岭算法 6. 图像修 ...
最新文章
- 第七篇 JVM核心机制之JVM运行和类加载全过程(二)
- GridView使用常见的注意点
- JS控制HTML元素的显示和隐藏
- Incomedia WebSite X5 17中文版
- boost::gil::view_type_from_pixel用法的测试程序
- PythonGIS可视化—Matplot basemap工具箱
- [转]再见 NoSQL!
- go语言基础之格式化输出
- [转]vue全面介绍--全家桶、项目实例
- android 创建文件夹_Android 动画小记
- [转载] Java中this和super关键字分别是什么意思
- Python3错误和异常
- C 语言怎么可能被淘汰呢?
- vscode 背景图片的设置
- C# XmlHelper
- mac ruby 环境变量_Ruby环境设置| 在Mac和Windows操作系统上安装Ruby
- xf0x9f java mysql_MySql导入数据报错Incorrect string value: ‘xF0x9Fx90x82’
- linux大于3T硬盘多个分区,Ubuntu挂载3T硬盘或大于2T磁盘的方法
- python 读取excel表格数据,然后写入word模板,批量生成
- 搞笑决战水源之巅收藏六 师傅
热门文章
- Visual Studio 远程调试设置
- std::condition_variable notify_one()与notify_all()的区别
- libevent的水平触发与边缘触发
- Centos7---1708 Linux上安装ZooKeeper 以及JDK1.8安装
- 后台解析数据--form表单get、post方法的使用(如何上传图片到服务器)
- ironpython使用方法_IronPython连接MySQL的方法步骤
- swf缓存文件在哪里_移动web缓存介绍
- Vue:不使用webpack情况下将Cesium引入到Vue项目中
- android 添加联系人地址,android – 如何向联系人添加新字段?
- Java反射库jOOR简介