OpenCV之meanshift分割详解
来源:互联网 发布:vender软件 编辑:程序博客网 时间:2024/06/05 22:41
1. 原理
用meanshift做图像平滑和分割,其实是一回事。其本质是经过迭代,将收敛点的像素值代替原来的像素值,从而去除了局部相似的纹理,同时保留了边缘等差异较大的特征。
OpenCV中自带有基于meanshift的分割方法pyrMeanShiftFiltering()。由函数名pyrMeanShiftFiltering可知,这里是将meanshift算法和图像金字塔相结合用来分割的。
要求输入和输出图像都是CV_8UC3类型,而且两者尺寸一样。实际上并不需要去先定义dstarr,因为程序里会将srcarr的格式赋值给dstarr。
termcrit有三种情况,迭代次数、迭代精度和两者同时满足。默认为迭代次数为5同时迭代精度为1。termcrit是个结构体,其结构如下
使用pyrMeanShiftFiltering()进行图像分割非常简单,只需要定义sp0,sr,max_level和termrit,然后调用pyrMeanShiftFiltering()就行了。
在实际操作时,为了使分割的结果显示得更明显,经常用floodFill( )将不同连通域涂上不同的颜色。具体情况参看下 面的实例。
2. 程序实例
来看看opencv自带的一个用meanshift进行分割的例子
原程序见 “ .\OpenCV249\sources\samples\cpp\meanshift_segmentation.cpp”
int floodFill( InputOutputArray image, Point seedPoint, Scalar newVal, CV_OUT Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4 );
int floodFill( InputOutputArray image, InputOutputArray mask, Point seedPoint, Scalar newVal, CV_OUT Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4 );
InputOutputArray image 输入输出图像,要求格式为1通道或3通道,8位或浮点
InputOutputArray mask 掩膜,比image的宽和高各大两像素点
Point seedPoint 填充的起始点
Scalar newVal 像素点被染色的值
CV_OUT Rect* rect=0 可选参数,设置floodFill()要重绘区域的最小边界矩形区域
Scalar loDiff=Scalar() 定义当前像素值与起始点像素值的亮度或颜色负差的最大值
Scalar upDiff=Scalar() 定义当前像素值与起始点像素值的亮度或颜色正差的最大值
flags 操作标志符
程序结果
处理后一些细小的纹理都平滑掉了,例如图中绿色线条所指示的区域。未填充时,很多地方看得并不明显,填充后就能明显看出差别来了。填充后的图很好地体现了meanshift聚类的思想!
再来看一组更“夸张”的效果图
使用meanshift方法进行处理后,原来的三个矩形区域消失了!平滑掉了!
meanshift算法的两个关键参数是空间域半径sr和颜色域半径sp,别说max_level,那是构建图像金字塔的参数好吧。最后,我们来看看sr和sp对结果的影响。
显然颜色域半径sp对结果的影响比空间域半径sr对结果的影响大。sp和sr越小,细节保留得越多,sp和sr越大,平滑力度越大。边缘和颜色突变的区域的特征保留的较好。因为meanshift要对每个像素点进行操作,所以算法的时间花销很大。
- OpenCV之meanshift分割详解
- opencv中的meanshift图像分割
- OpenCV meanshift 图像分割代码
- Opencv之meanshift篇
- MeanShift用于彩色图像分割(OpenCV)
- Meanshift图像平滑之opencv实现
- 图像分割学习笔记_1(opencv自带meanshift分割例子)
- 图像分割学习笔记_1(opencv自带meanshift分割例子)
- 学习OpenCV2——MeanShift之图形分割
- 学习OpenCV2(四)——MeanShift之图形分割
- meanshift 图像分割
- meanshift图像分割示例
- 物体跟踪meanshift详解之密度估计
- OpenCV学习笔记十九---运动跟踪 CamShift以及meanShift详解
- Opencv学习笔记(二)meanshift之我见
- opencv2-6 图像分割MeanShift
- OPENCV之Kmeans图像分割
- opencv之GrabCut&FloodFill分割
- 各种排序之间的比较和实现
- C语言中使用静态函数的好处
- 后缀数组模板详解。
- 记一次Build.gradle引发的ClassNotFound
- URAL1004---Sightseeing trip (Floyed求最小环)
- OpenCV之meanshift分割详解
- OpenCV函数threshold的使用
- jqGrid初级入门知识整理
- 弟弟的作业
- luogu1004 【2000提高】方格取数(dp)
- opencv石头剪刀布
- hdu1237简单表达式求值(我多判断了())
- mysql sql语句总结
- 存储过程