金字塔分割

基于高斯金子塔的图像分割的原理是,根据相邻金字塔采样的原理可知,上层金字塔是下层金字塔下采样得到,那么上层金子塔的一个点和下层 
金字塔的四个点就有一个映射关系,若他们的差值小于threshold1,则被连接建立起来。同时与周围的连接进行比较,如果差值小于threshold2,则这两个连接形成一个簇。分辨率从小到大不断进行此过程。

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-通道图像,且大小一样
// Segmentation.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


#include <cv.h>
#include <highgui.h>

void main()
{
    
    
    //以原始通道数读取图片1
    IplImage* img1 = cvLoadImage("D://vc6.0//MSDev98//MyProjects//MachineVision//TestPic//Lena.bmp",CV_LOAD_IMAGE_UNCHANGED);
    IplImage* img2 = cvCreateImage(cvSize(img1->width, img1->height), IPL_DEPTH_8U, 1);

    
    //命名窗口
    cvNamedWindow("Origin", CV_WINDOW_AUTOSIZE);
    cvNamedWindow("PrySegmentation", CV_WINDOW_AUTOSIZE);    

    CvMemStorage* storage = cvCreateMemStorage(0);
    CvSeq* cmp = NULL;
    cvPyrSegmentation(img1, img2, storage, &cmp, 8, 150, 30);

    //显示图片
    cvShowImage("Origin", img1);
    cvShowImage("PrySegmentation", img2);

    cvWaitKey(0);
    
    cvReleaseImage(&img1);
    cvReleaseImage(&img2);

    cvDestroyAllWindows();
    
}

 


posted @ 2014-10-08 21:57  aTianTianTianLan  阅读(566)  评论(0)    收藏  举报