opencv 金字塔图像分割cvPyrSegmentation

opencv cvPyrSegmentation

demo: http://download.csdn.net/detail/keen_zuxwang/9852585

金字塔图像分割

图像金字塔
1. 图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。
2. 图像金字塔最初用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,
且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。
3. 金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低

图像金字塔:
高斯金字塔(Gaussianpyramid): 用来向下采样,主要的图像金字塔。
拉普拉斯金字塔(Laplacianpyramid): 用来从金字塔低层图像重建上层未采样图像,在数字图像处理中也即是预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用

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

/* Splits color or grayscale image into multiple connected components
 of nearly the same color/brightness using modification of Burt algorithm.
 comp with contain a pointer to sequence (CvSeq)
 of connected components (CvConnectedComp) */
CVAPI(void) cvPyrSegmentation( IplImage* src, IplImage* dst,
                              CvMemStorage* storage, CvSeq** comp,
                              int level, double threshold1,
                              double threshold2 );

src
输入图像
dst
输出图像
Storage:
存储连通部件的序列结果
comp
分割部件的输出序列
level
建立金字塔的最大层数
threshold1
建立连接的错误阈值
threshold2
分割簇的错误阈值
金字塔建立到 level 指定的最大层数。
如果 p(c(a),c(b))

JNIEXPORT jlong JNICALL Java_com_example_grabcut_MainActivity_doPyrSegmentation(JNIEnv *env, jclass clz, jlong imageGray)
{
    Mat imageMat0 = Mat(*(Mat*)imageGray);
    Mat imageMat1(imageMat0.size(),CV_8UC3);
    cvtColor(imageMat0, imageMat1, CV_BGRA2BGR);

    Mat imageMat;
    resize(imageMat1, imageMat, cv::Size(256, 256));
    LOGD("        cvPyrSegmentation %d, %d    ", imageMat.cols, imageMat.rows);

    IplImage  temp_src = imageMat;
    IplImage* imageg = &temp_src;

    // 图像大小是否符合规格:2的n次方
    if (!(imageg->width%2 == 0 && imageg->height%2 == 0)){
        LOGD("       cvPyrSegmentation image %d, %d   ", imageg->width, imageg->height);
    }

    IplImage* img1=cvCreateImage(cvGetSize(imageg),imageg->depth,imageg->nChannels);
    CvMemStorage* stoage = cvCreateMemStorage(0) ;
    CvSeq* comp=NULL;

    int level = 6 ; //进行n层采样
    double threshold1 = 150 ;
    double threshold2 = 30 ;

    cvPyrSegmentation(imageg,img1,stoage, &comp, level, threshold1, threshold2);

    Mat *hist = new Mat(img1);
    return (jlong) hist;
}

opencv 金字塔图像分割cvPyrSegmentation_第1张图片

你可能感兴趣的:(opencv)