zoukankan      html  css  js  c++  java
  • 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

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

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

  • 相关阅读:
    ABP 番外篇-容器
    ABP 番外篇-菜单
    三、写服务
    十二、异步
    一、PHP_OSS使用
    十一、泛型
    Automapper
    ABP实践学习
    【2019-07-26】省是缺点
    【2019-07-25】女人,很强大
  • 原文地址:https://www.cnblogs.com/denny402/p/5011456.html
Copyright © 2011-2022 走看看