图像分割,采用金字塔实现,该函数为,
- PyrSegmentation
- 用金字塔实现图像分割
- void cvPyrSegmentation( IplImage* src, IplImage* dst,
- CvMemStorage* storage, CvSeq** comp,
- int level, double threshold1, double threshold2 );
- src
- 输入图像.
- dst
- 输出图像.
- storage
- Storage: 存储连通部件的序列结果
- comp
- 分割部件的输出序列指针 components.
- level
- 建立金字塔的最大层数
- threshold1
- 建立连接的错误阈值
- threshold2
- 分割簇的错误阈值
- 函数 cvPyrSegmentation 实现了金字塔方法的图像分割。金字塔建立到 level 指定的最大层数。如果 p(c(a),c(b))<threshold1,则在层 i 的象素点 a 和它的相邻层的父亲象素 b 之间的连接被建立起来,
- 定义好连接部件后,它们被加入到某些簇中。如果p(c(A),c(B))<threshold2,则任何两个分割 A 和 B 属于同一簇。
- 如果输入图像只有一个通道,那么
- p(c¹,c²)=|c¹-c²|.
- 如果输入图像有单个通道(红、绿、兰),那么
- p(c¹,c²)=0,3·(c¹r-c²r)+0,59·(c¹g-c²g)+0,11·(c¹b-c²b) .
- 每一个簇可以有多个连接部件。 图像 src 和 dst 应该是 8-比特、单通道 或 3-通道图像,且大小一样
例题为:
- #include "StdAfx.h"
- #include "highgui.h"
- #include"cv.h"
- //superdont
- //blog.csdn.net/superdont
- int main(int argc,char ** argv)
- {
- IplImage * src = cvLoadImage("lena.png");
- //常见错误,如果图像本身不能被要求次数的2整除,则会报错终止,一定注意
- IplImage * dst=cvCreateImage(cvGetSize(src), src->depth,src->nChannels);
- CvMemStorage * stoage = cvCreateMemStorage(0) ;
- CvSeq* comp=NULL;
- int level = 4 ; //进行n层采样
- double threshold1 = 150 ;
- double threshold2 = 30 ; //
- cvPyrSegmentation(src,dst, stoage,&comp,level, threshold1,threshold2) ;
- cvNamedWindow("src") ;
- cvNamedWindow("dst") ;
- cvShowImage("src",src);
- cvShowImage("dst",dst);
- cvWaitKey(0) ;
- cvDestroyAllWindows();
- return 0;
- }
参考文献:
1.学习OpenCV,刘瑞祯,于仕祺,清华大学出版社,pp.152-155
2.http://blog.csdn.net/cartoonface/article/details/5998543
3.http://www.opencv.org.cn/index.php/Cv%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86#PyrSegmentation