• opencv学习之路(38)、Mat像素统计基础——均值,标准差,协方差;特征值,特征向量


    本文部分内容转自  https://www.cnblogs.com/chaosimple/p/3182157.html

    一、统计学概念

    二、为什么需要协方差

    三、协方差矩阵

    注:上述协方差矩阵还需要除以除以(n-1)。MATLAB使用cov函数计算协方差时自动除以了(n-1),opencv使用calcCovarMatrix函数计算后还需要手动除以(n-1)

    协方差具体计算

    以学生成绩举例:有5名学生,参加数学、英语、美术考试,得分如图

    1.计算均值矩阵M

    均值是对每一列求平均值:means=【66,60,60】

    则均值矩阵M为

    2.原矩阵A-均值矩阵M=Y

    Y=A-M=

    3.Y转置×Y

     

    4.最后将结果除以(n-1)

    四、代码运行

    1.MATLAB代码

    2.opencv计算数字矩阵的协方差

    #include<opencv2/opencv.hpp>
    #include<iostream>
    
    using namespace cv;
    using namespace std;
    
    void main()
    {
        Mat data = (Mat_<float>(5, 3) << 90, 60, 90, 90, 90, 30, 60, 60, 60, 60, 60, 90, 30, 30, 30);
        cout << "data:" << endl << data << endl;
        Mat covar1, means1;//协方差,均值
        calcCovarMatrix(data, covar1, means1, CV_COVAR_NORMAL | CV_COVAR_ROWS);
        cout << "---------------------------" << endl;
        cout << "means:" << endl << means1 << endl;
        cout << "covar:" << endl << covar1/4 << endl;
        getchar();
        waitKey(0);//暂停按键等待
    }    

    3.opencv计算图片的均值、标准差、协方差

     (1)均值和标准差

    #include<opencv2/opencv.hpp>
    
    using namespace cv;
    using namespace std;
    
    void main()
    {
        Mat src = imread("E://1.jpg");
        imshow("img", src);
    
        Mat means, stddev, covar;
        meanStdDev(src, means, stddev);//计算src图片的均值和标准差
        printf("means rows:%d,means cols %d
    ", means.rows, means.cols);//RGB三通道,所以均值结果是3行一列
        printf("stddev rows:%d,means cols %d
    ", stddev.rows, stddev.cols);
    
        for (int row = 0; row < means.rows; row++)
        {
            printf("mean %d = %.3f
    ", row, means.at<double>(row));
            printf("stddev %d = %.3f
    ", row, stddev.at<double>(row));
        }
      waitKey(0);
    }

    (2)均值和协方差

    #include<opencv2/opencv.hpp>
    
    using namespace cv;
    using namespace std;
    
    
    void show(Mat a,int i){
        Mat covar, means;
        calcCovarMatrix(a, covar, means, CV_COVAR_NORMAL | CV_COVAR_ROWS);//计算协方差,均值
        cout << "mean " << i << " = " << means;
        cout << "covar " << i << " = " << covar;
    }
    
    void main()
    {
        Mat src = imread("E://1.png");
        imshow("img", src);
    
        //通道分离
        vector<Mat>channels;//定义Mat类型的向量
        split(src, channels);//通道分离
        //计算图片的协方差
        show(channels.at(0), 0);
        show(channels.at(1), 1);
        show(channels.at(2), 2);
    
        waitKey(0);//暂停按键等待
    }      

     之所以没用前面那张大图,是因为图片的协方差矩阵太大了,我随手画了个小图,输出都特别多

    五、特征值和特征向量

    #include<opencv2/opencv.hpp>
    using namespace cv;
    using namespace std;
    
    void main()
    {
        Mat data = (Mat_<double>(2, 2) <<
            1, 2,
            2, 1); //opencv求特征值和特征向量,输入矩阵必须是对称矩阵
        Mat eigenvalue, eigenvector;
        eigen(data, eigenvalue, eigenvector);
        for (int i = 0; i < eigenvalue.rows; i++)
            cout << "eigen value " << i << " =" << eigenvalue.at<double>(i)<<endl;
        cout << "eigen vector: "<< endl;
        cout <<eigenvector<< endl;
    
        getchar();
    }      

    当矩阵×2时,特征值翻倍,特征向量不变

  • 相关阅读:
    Collection与Collections的区别
    Java容器基础概况
    IO与NIO的区别
    BIO、NIO、AIO的区别
    Java中的IO流
    Java中的抽象类
    String常用方法解析
    字符串反转
    vue路由传参
    flask框架(八)—自定义命令flask-script、多app应用、wtforms表单验证、SQLAIchemy
  • 原文地址:https://www.cnblogs.com/little-monkey/p/8108653.html
Copyright © 2020-2023  润新知