图像分割--金字塔分割算法

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(c1,c2)=|c1-c2|.
如果输入图像有单个通道(红、绿、兰),那幺

p(c1,c2)=0,3·(c1r-c2r)+0,59·(c1g-c2g)+0,11·(c1b-c2b) .

每一个簇可以有多个连接部件。图像 src 和 dst 应该是 8-比特、单通道 或 3-通道图像,且大小一样 

实验实例:

#include <iostream>  
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\opencv.hpp>
#include<opencv2\legacy\legacy.hpp>//cvPyrSegmentation函数要加这个头文件
//#pragma comment(lib, "opencv_legacy249d.lib")
  
using namespace std;    
using namespace cv;
 
void cvPyr( IplImage* src, IplImage* dst);
static void ShowHelpText() ;

int main(int argc, char** argv)
{
	IplImage* src, *dst;
	CvMemStorage* storage=cvCreateMemStorage(0);
	ShowHelpText();
	if (argc==2 && (src=cvLoadImage(argv[1],-1))!=0)
	{
		return -1;
	}
	else
	{
		src=cvLoadImage("lena.jpg",1);
	}
	dst = cvCreateImage( cvGetSize(src), src->depth, src->nChannels);
    cvPyr( src, dst);
    // Create a named window with a the name of the file.
    cvNamedWindow( "src", 1 );
    // Show the image in the named window
	cvShowImage( "src", src );
	cvShowImage( "dst", dst );
    // Press any key to exit.
    cvWaitKey(0);
    // Clean up and don’t be piggies
    cvDestroyWindow( "src" );
    cvReleaseImage( &src );
	 cvDestroyWindow( "dst" );
    cvReleaseImage( &dst );

    return 0;
	
}
static void ShowHelpText()    
{    
    //输出一些帮助信息    
	cout<<endl<<"图像分割--金字塔分割示例程序~"<<endl<<endl;
	cout<<"当前使用的OpenCV版本为 OpenCV "<<CV_VERSION<<endl;
	cout<<endl<<"键盘按键任意键- 退出程序"<<endl;
} 
void cvPyr( IplImage* src, IplImage* dst )
{
    CvMemStorage* storage = cvCreateMemStorage(0);
    CvSeq* comp = NULL;
    cvPyrSegmentation( src, dst, storage, &comp, 2, 150, 100 );
    cvReleaseMemStorage( &storage );
}


你可能感兴趣的:(图像分割--金字塔分割算法)