本文部分内容转自  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>(, ) << , , , , , , , , , , , , , , );
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/ << endl;
getchar();
waitKey();//暂停按键等待
}

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 = ; 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(), );
show(channels.at(), );
show(channels.at(), ); waitKey();//暂停按键等待
}

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

五、特征值和特征向量

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

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

opencv学习之路(38)、Mat像素统计基础——均值,标准差,协方差;特征值,特征向量的更多相关文章

  1. OpenCV 学习之路(2) -- 操作像素

    本节内容: 访问像素值 用指针扫描图像 用迭代器扫描图像 编写高效的图像扫描循环 扫描图像并访问相邻像素 实现简单的图像运算 图像重映射 访问像素值 准备工作: 创建一个简单函数,用它在图像中加入椒盐 ...

  2. opencv学习之路(12)、图像滤波

    一.图像滤波简介 二.方框滤波——boxFilter() #include<opencv2/opencv.hpp> using namespace cv; void main(){ Mat ...

  3. opencv学习之路(39)、PCA

    一.PCA理论介绍 网上已经有许多介绍pca原理的博客,这里就不重复介绍了.详情可参考 http://blog.csdn.net/zhongkelee/article/details/44064401 ...

  4. opencv学习之路(17)、边缘检测

    一.概述 二.canny边缘检测 #include "opencv2/opencv.hpp" using namespace cv; void main() { //Canny边缘 ...

  5. opencv学习之路(13)、图像阈值化threshold

    一.图像阈值化简介 二.固定阈值 三.自适应阈值 #include<opencv2/opencv.hpp> using namespace cv; void main(){ Mat src ...

  6. opencv学习之路(7)、访问图像像素

    一.动态地址访问 #include <opencv2/opencv.hpp> #include<iostream> using namespace cv; using name ...

  7. opencv学习之路(4)、Mat类介绍,基本绘图函数

    一.Mat类创建 Mat img;//创建无初始化矩阵 Mat img1(,,CV_8UC1);//200行,100列(长200,宽100) Mat img2(Size(,),CV_8UC3,Scal ...

  8. Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练

    在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资 ...

  9. opencv学习之路(40)、人脸识别算法——EigenFace、FisherFace、LBPH

    一.人脸识别算法之特征脸方法(Eigenface) 1.原理介绍及数据收集 特征脸方法主要是基于PCA降维实现. 详细介绍和主要思想可以参考 http://blog.csdn.net/u0100066 ...

随机推荐

  1. Building gRPC Client iOS Swift Note Taking App

    gRPC is an universal remote procedure call framework developed by Google that has been gaining inter ...

  2. python 数据分析算法(决策树)

    决策树基于时间的各个判断条件,由各个节点组成,类似一颗树从树的顶端,然后分支,再分支,每个节点由响的因素组成 决策树有两个阶段,构造和剪枝 构造: 构造的过程就是选择什么属性作为节点构造,通常有三种节 ...

  3. scrapy_redis实现爬虫

    1.scrapy_redis的流程 在scrapy_redis中,所有的带抓取的对象和去重的指纹都存在所有的服务器公用的redis中 所有的服务器公用一个redis中的request对象 所有的req ...

  4. 建立live555海思编码推流服务

    因项目需要,这一周弄了一下live555.需求:海思编码——>RTSP server,使用VLC可以访问,类似于网络摄像机的需求.看了一下,live555的架构太复杂了,半桶水的C++水平还真的 ...

  5. SQL使用之关联更新、批量插入

    使用场景 某个字段数据异常,利用另外一张表同步修改该表异常字段的数据; 关联更新 UPDATE tableName1 AS t1 LEFT JOIN tableName12 AS t2 ON t1.x ...

  6. 虚拟机上不了网的 VMware Workstation 与 Device/Credential Guard 不兼容

    VMware Workstation 与 Device/Credential Guard 不兼容   和    虚拟机上不了网的问题  解决方法: VMware Workstation 与 Devic ...

  7. 随手科技(随手记)2017招聘Java工程师笔试题

    一  如何解决多台web服务器粘性会话的问题? 粘性session:web服务器会把某个用户的请求,交给tomcat集群中的一个节点,以后此节点就负责该保存该用户的session,如果此节点挂掉,那么 ...

  8. 导出CityGML

    通过代码实现了导出CityGML功能

  9. FPC导通阻抗计算

    pc线路板是有导电功能的,那么如何仅适用手工计算出线路的阻值能?那么就需要使用到一个公式: W*R*T=6000 W是指铜箔的宽度单位是密耳mil. T是指铜箔厚度单位是盎司oz. R是指铜箔的电阻单 ...

  10. 时区切换导致quartz定时任务没有触发问题

    时区切换对Quartz的cron表达式有影响,切换的1小时内停止触发定时任务,导致sla没有定时清空内存计数,误发限流. 美国夏令时PST切换到冬令时PDT,会有时间跳变.不带时区跳变的,会出现时间重 ...