• opencv2学习:计算协方差矩阵


    图像的高级处理中,协方差矩阵计算是必不可少的,但opencv关于这方面的资料却相当少。

    首先,利用matlab计算一下,便于比较:

    >> data=[1,2,3;10,20,30]
    
    data =
    
         1     2     3
        10    20    30
    
    >> convar=cov(data)
    
    convar =
    
       40.5000   81.0000  121.5000
       81.0000  162.0000  243.0000
      121.5000  243.0000  364.5000

    在计算协方差矩阵时,在源数据矩阵中,默认以行为样本数,以列为维度。如果你是相反的,那么结果可能和我的不一样。

    在opencv2中,先利用公式来进行计算:

    代码:

        Mat data = (Mat_<float>(2, 3) << 1, 2, 3, 10, 20, 30);
        cout << "data:"<<endl << data << endl;
        Mat means(1, data.cols, data.type(), Scalar::all(0));
        for (int i = 0; i < data.cols; i++)
            means.col(i) = sum(data.col(i)) / data.rows;  //计算列均值
        cout << "means:"<<endl << means << endl;
        Mat tmp = repeat(means, data.rows, 1);
        data = data - tmp;    //源数据减去均值
        Mat covar = (data.t()*data) / (data.rows - 1);   // (X'*X)/n-1
        cout << "covar:"<<endl<< covar << endl;

    结果:

    data:
    [1, 2, 3;
     10, 20, 30]
    means:
    [5.5, 11, 16.5]
    covar:
    [40.5, 81, 121.5;
     81, 162, 243;
     121.5, 243, 364.5]
    请按任意键继续. . .

    结果和matlab计算是一样的。

    还有一种比较简便的方法,那就是使用opencv自带的函数calcCovarMatrix来计算。

    void calcCovarMatrix(InputArray samples, OutputArray covar, OutputArray mean, int flags, int ctype=CV_64F)

    代码:

        Mat covar, means;
        Mat data = (Mat_<float>(2, 3) << 1, 2, 3, 10, 20, 30);
        cout << "data:" << endl << data << endl;
        calcCovarMatrix(data, covar, means, CV_COVAR_NORMAL | CV_COVAR_ROWS); 
        cout << "means:" << endl << means << endl;
        cout << "covar:" << endl << covar << endl;

    结果:

    data:
    [1, 2, 3;
     10, 20, 30]
    means:
    [5.5, 11, 16.5]
    covar:
    [40.5, 81, 121.5;
     81, 162, 243;
     121.5, 243, 364.5]

    和上面的结果完全一样。注意最后一个参数CV_COVAR_ROWS表示以行为样本,即一行为一个向量。如果你是以列为向量,则应换成CV_COVAR_COLS

    标记位参数值极其意义

    标志参数的具体标志值

    意义

    CV_COVAR_NORMAL

    计算均值和协方差

    CV_COVAR__SCRAMBLED

    快速PCA”Scrambled”协方差

    CV_COVAR_USE_AVERAGE

    输入均值而不是计算均值

    CV_COVAR_SCALE

    重新缩放输出的协方差矩阵

    这个函数的具体介绍可以参考官方文档:传送门

  • 相关阅读:
    .Net开发笔记(二十一) 反射在.net中的应用
    .Net开发笔记(二十)创建一个需要授权的第三方组件
    .Net开发笔记(十九) 创建一个可以可视化设计的对象
    .net开发笔记(十八) winform中的等待框
    .Net开发笔记(十七) 应用程序扩展
    java连接https时禁用证书验证.
    How to disable SSL certificate checking with Spring RestTemplate?(使用resttemplate访问https时禁用证书检查)
    webpack打包调试react并使用babel编译jsx配置方法
    动态改变spring定时任务执行频率
    在java代码中,用xslt处理xml文件
  • 原文地址:https://www.cnblogs.com/denny402/p/5011456.html
Copyright © 2020-2023  润新知