前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >基于OpenCV的图像分割

基于OpenCV的图像分割

作者头像
用户9831583
发布2022-06-16 16:36:46
发布2022-06-16 16:36:46
52300
代码可运行
举报
文章被收录于专栏:码出名企路码出名企路
运行总次数:0
代码可运行

输入图像

代码语言:javascript
代码运行次数:0
运行
复制
    const int N = 3; //聚类个数
  //  const int N1 = (int)sqrt((double)N);
    //每一类用一种颜色
    // const Scalar colors[] =
    // {
    //     Scalar(0,0,255), Scalar(0,255,0),
    //     Scalar(0,255,255),Scalar(255,255,0)
    // };

    Vec3b colorTab[] =
    {
        Vec3b(0, 0, 255),
        Vec3b(0, 255, 0),
        Vec3b(255, 100, 100),
        Vec3b(255, 0, 255),
        Vec3b(0, 255, 255)
    };


    // int i, j;
    // int nsamples = 100;
    // Mat samples( nsamples, 2, CV_32FC1 );
    // Mat labels;
    // Mat img = Mat::zeros( Size( 500, 500 ), CV_8UC3 );
    // Mat sample( 1, 2, CV_32FC1 );

    // samples = samples.reshape(2, 0);
    // for( i = 0; i < N; i++ )
    // {
    //     // form the training samples
    //     Mat samples_part = samples.rowRange(i*nsamples/N, (i+1)*nsamples/N );

    //     Scalar mean(((i%N1)+1)*img.rows/(N1+1),
    //                 ((i/N1)+1)*img.rows/(N1+1));
    //     Scalar sigma(30,30);
    //     randn( samples_part, mean, sigma );
    // }
    // samples = samples.reshape(1, 0);

    Mat sample, labels;
    Mat img = imread("mmmm.jpg");
    for (int i = 0; i < img.rows; i++)
    for (int j = 0; j < img.cols; j++)
    {
        Vec3b point = img.at<Vec3b>(i, j);
        Mat tmp = (Mat_<float>(1, 3) << point[0], point[1], point[2]);
        sample.push_back(tmp);
    }

生成训练器

代码语言:javascript
代码运行次数:0
运行
复制
    Ptr<EM> em_model = EM::create();
    em_model->setClustersNumber(N);
    em_model->setCovarianceMatrixType(EM::COV_MAT_SPHERICAL);
    em_model->setTermCriteria(TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 300, 0.1));
    em_model->trainEM( sample, noArray(), labels, noArray() );

输出图像

代码语言:javascript
代码运行次数:0
运行
复制
    // classify every image pixel
    int n = 0;
    for( int i = 0; i < img.rows; i++ )
    {
        for(int j = 0; j < img.cols; j++ )
        {
            // sample.at<float>(0) = (float)j;
            // sample.at<float>(1) = (float)i;
            // int response = cvRound(em_model->predict2( sample, noArray() )[1]);
            // Scalar c = colors[response];

            // circle( img, Point(j, i), 1, c*0.75, FILLED );

            int clusterIdx = labels.at<int>(n);
            img.at<Vec3b>(i, j) = colorTab[clusterIdx];
            n++;
        }
    }

    //draw the clustered samples
    // for( i = 0; i < nsamples; i++ )
    // {
    //     Point pt(cvRound(samples.at<float>(i, 0)), cvRound(samples.at<float>(i, 1)));
    //     circle( img, pt, 1, colors[labels.at<int>(i)], FILLED );
    // }

    imshow( "EM-clustering result", img );
    waitKey(0);
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码出名企路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档