• opencv 金字塔图像分割


    我所知的opencv中分割函数:watershed(只是看看效果,不能返回每类pixel类属),cvsegmentImage,cvPyrSegmentation(返回pixel类属)

    金字塔分割原理篇在这里,本文只提供代码。

    Segment函数:

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. #include<cv.h>  
    2. #include <cvaux.h>  
    3. #include <opencvcxcore.hpp>  
    4. #include <opencv.hpp>  
    5. #include <nonfree.hpp>  
    6. #include <core/core.hpp>  
    7. #include <imgproc/imgproc.hpp>  
    8. #include <imgproc/imgproc_c.h>  
    9. #include <vector>  
    10. #include <map>  
    11. #include <highgui.h>  
    12. using namespace std;  
    13. using namespace cv;  
    14. void Segment(IplImage* I)  
    15. {  
    16.   
    17.     ////////////////////parameters initialization//////////////////////  
    18.     int mode = CV_RETR_LIST;  
    19.     int level = 2, block_size = 1000;  
    20.     CvMemStorage* storage = cvCreateMemStorage(block_size);  
    21.     CvSeq* components;  
    22.     double threshold1 = 100,threshold2 = 50;  
    23.   
    24.     IplImage *src = cvCreateImage(cvGetSize(I),IPL_DEPTH_8U,1);  
    25.     cvCvtColor(I,src,CV_RGB2GRAY);  
    26.     IplImage* dst = cvCreateImage(cvGetSize(I),IPL_DEPTH_8U,1);  
    27.   
    28.     src->width = dst->width = (I->width & -(1 << level));  
    29.     src->height = dst->height = (I->height & -(1 << level));  
    30.   
    31.     //////////////////////Segment/////////////////////////  
    32.     cvPyrSegmentation(src,dst,storage,&components,level,threshold1,threshold2);  
    33.     int ncomp = components->total;  
    34.     cout<<"segemented into "<<ncomp<<" components."<<endl;  
    35.   
    36.     //////////////////////////Get Components/////////////////////////////  
    37.     map<int, int>mapping;//map color value to component id (classify)  
    38.     for (int i = 0; i<ncomp; i++)//foreach connection component  
    39.     {  
    40.         CvConnectedComp* cc = (CvConnectedComp*) cvGetSeqElem(components,i);  
    41.         cvDrawRect(dst,cvPoint(cc->rect.x,cc->rect.y),cvPoint(cc->rect.x+cc->rect.width,cc->rect.y+cc->rect.height),cvScalar(255,255,0));  
    42.         mapping.insert(pair<int,int>(cc->value.val[0],i));  
    43.     }  
    44.     cvShowImage("segementation",dst);  
    45.     waitKey();  
    46.     cvReleaseMemStorage(&storage);  
    47. }  


    彩色图分割版本:

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
      1. void Segment(IplImage* I)  
      2. {  
      3.     ////////////////////parameters initialization//////////////////////  
      4.     int mode = CV_RETR_LIST;  
      5.     int level = 2, block_size = 1000;  
      6.     CvMemStorage* storage = cvCreateMemStorage(block_size);  
      7.     CvSeq* components;  
      8.     double threshold1 = 10,threshold2 = 50;  
      9.   
      10.     IplImage *src = cvCreateImage(cvGetSize(I),IPL_DEPTH_8U,3);  
      11.     src = cvCloneImage(I);  
      12.     IplImage* dst = cvCreateImage(cvGetSize(I),IPL_DEPTH_8U,3);  
      13.   
      14.     src->width = dst->width = (I->width & -(1 << level));  
      15.     src->height = dst->height = (I->height & -(1 << level));  
      16.   
      17.     //////////////////////Segment/////////////////////////  
      18.     cvPyrSegmentation(src,dst,storage,&components,level,threshold1,threshold2);  
      19.     int ncomp = components->total;  
      20.     cout<<"segemented into "<<ncomp<<" components."<<endl;  
      21.   
      22.     //////////////////////////Get Components/////////////////////////////  
      23.     map<int, int>mapping;//map color value to component id (classify)  
      24.     for (int i = 0; i<ncomp; i++)//foreach connection component  
      25.     {  
      26.         CvConnectedComp* cc = (CvConnectedComp*) cvGetSeqElem(components,i);  
      27.         cvDrawRect(dst,cvPoint(cc->rect.x,cc->rect.y),cvPoint(cc->rect.x+cc->rect.width,cc->rect.y+cc->rect.height),cvScalar(255,255,0));  
      28.         mapping.insert(pair<int,int>(cc->value.val[0],i));  
      29.     }  
      30.     cvShowImage("segementation",dst);  
      31.     waitKey();  
      32.     cvReleaseMemStorage(&storage);  
      33. }  
      34. // from: http://blog.csdn.net/abcjennifer/article/details/18215953
  • 相关阅读:
    亿级 Web 系统搭建:单机到分布式集群
    机器学习14种常见算法
    Nginx——使用 Nginx 提升网站访问速度【转载+整理】
    全栈开发工程师,就是个神话~【转载+整理】
    谷歌、亚马逊相继宣布屏蔽 Flash 广告,又一个时代行将结束?【转载+整理】
    前端框架现状调查【转载+整理】
    Swift 编程语言【转载+整理】
    如何将 Java 项目转换成 Maven 项目
    Eclipse 4.5.0 离线安装 Veloeclipse 插件
    Java 8 新特性——Lambdas 表达式
  • 原文地址:https://www.cnblogs.com/GarfieldEr007/p/5369631.html
Copyright © 2020-2023  润新知