码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-12-25 15:06:23      阅读:797      评论:0      收藏:0      [点我收藏+]

标签:opencv2   自动   统计学   clu   通道   int   ann   oat   按键   

本文部分内容转自  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\n", means.rows, means.cols);//RGB三通道,所以均值结果是3行一列
    printf("stddev rows:%d,means cols %d\n", stddev.rows, stddev.cols);

    for (int row = 0; row < means.rows; row++)
    {
        printf("mean %d = %.3f\n", row, means.at<double>(row));
        printf("stddev %d = %.3f\n", 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);//暂停按键等待
}      

技术分享图片

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

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

标签:opencv2   自动   统计学   clu   通道   int   ann   oat   按键   

原文地址:http://www.cnblogs.com/little-monkey/p/8108653.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!