zoukankan      html  css  js  c++  java
  • 【图像算法】彩色图像分割专题九:基于KCM的彩色分割

    -------------------------------------------------------------------------------------------------------------------------------

    【图像算法】彩色图像分割专题九:基于KCM的彩色分割

          SkySeraph July 31st 2011  HQU

    Email:zgzhaobo@gmail.com    QQ:452728574

    Latest Modified Date:July 31st 2011 HQU

    -------------------------------------------------------------------------------------------------------------------------------

    》原理

    提出者:     http://www.cs.uwf.edu/~jbezdek/

    原理相关:  http://home.dei.polimi.it/matteucc/Clustering/tutorial_html/index.html

                   http://en.wikipedia.org/wiki/K-means_clustering

    -------------------------------------------------------------------------------------------------------------------------------

    》源码

    利用OpenCV函数(cvKMeans2)

    cvKMeans2说明:

    void cvKMeans2( 
      const CvArr* samples, //输入样本的浮点矩阵,每个样本一行。 
      int cluster_count,  //所给定的聚类数目 
       * labels,    //输出整数向量:每个样本对应的类别标识 
       CvTermCriteria termcrit //指定聚类的最大迭代次数和/或精度(两次迭代引起的聚类中心的移动距离)
     );

    执行源码:

    View Code
     1 void CColorImgSftDlg::OnKcm() //Kmeans
    2 {
    3 if(!(ToDisplayCtr1))
    4 {
    5 MessageBox("Please Load Pic!");
    6 return;
    7 }
    8
    9 BeginWaitCursor();
    10 int64 begin_count = cvGetTickCount();
    11
    12 IplImage* src;
    13 src = ToDisplayCtr1;
    14
    15 int width = src->width;
    16 int height = src->height;
    17 int channel = src->nChannels;
    18 int lenth = width*height;
    19
    20 CvMat *samples=cvCreateMat(width*height,1,CV_32FC3);
    21 CvMat *clusters=cvCreateMat(width*height,1,CV_32SC1);
    22
    23 int k=0;
    24 for (int i=0;i<width;i++)
    25 {
    26 for (int j=0;j<height;j++)
    27 {
    28 CvScalar s;
    29 s.val[0]=(float)cvGet2D(src,j,i).val[0];
    30 s.val[1]=(float)cvGet2D(src,j,i).val[1];
    31 s.val[2]=(float)cvGet2D(src,j,i).val[2];
    32 cvSet2D(samples,k++,0,s);
    33 }
    34 }
    35
    36 int nCuster=2;
    37 cvKMeans2(samples,nCuster,clusters,cvTermCriteria(CV_TERMCRIT_ITER,100,1.0));
    38 IplImage *bin=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
    39 k=0;
    40 int val=0;
    41 float step=255/(nCuster-1);
    42
    43 for (i=0;i<width;i++)
    44 {
    45 for (int j=0;j<height;j++)
    46 {
    47 val=(int)clusters->data.i[k++];
    48 CvScalar s;
    49 s.val[0]=255-val*step;
    50 cvSet2D(bin,j,i,s);
    51 }
    52 }
    53 SetDlgItemInt(IDC_TimeCost, (unsigned int)((cvGetTickCount() - begin_count)/cvGetTickFrequency()/1000 ));
    54
    55 if(ToDisplayCtr3)
    56 cvZero(ToDisplayCtr3);
    57 cvCopyImage(bin,ToDisplayCtr3);
    58 DrawPicToHDC(ToDisplayCtr3,IDC_ImgShowCtrl3);
    59
    60 cvReleaseImage(&bin);
    61 EndWaitCursor();
    62 }

    -------------------------------------------------------------------------------------------------------------------------------

    》效果

    还是采用Meanshift中那位MM来分割下:

    运行时间199ms

    原图:

    分割图:

     

    -------------------------------------------------------------------------------------------------------------------------------

    Author:         SKySeraph

    Email/GTalk: zgzhaobo@gmail.com    QQ:452728574

    From:         http://www.cnblogs.com/skyseraph/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

     -------------------------------------------------------------------------------------------------------------------------------

  • 相关阅读:
    【JavaScript】实现队列Queue
    【Leetcode刷题篇】1.两数之和(JS)
    【48个原生JS网页小demo】1.信息切换
    【JavaScript】原生实现call bind apply
    【JavaScript】Interview(精简版)
    【JavaScript】4种常见的内存泄露
    【JavaScript】原型和原型链
    论自作音乐播放器涉及知识点总结
    Android横竖屏切换继续播放视频
    Android上传头像代码,相机,相册,裁剪
  • 原文地址:https://www.cnblogs.com/skyseraph/p/2122911.html
Copyright © 2011-2022 走看看