本文部分内容转自  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. 容器—stack

    c++ stl栈stack介绍 C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,——也就是说实现了一个先进后出(FILO)的数据结构. c++ stl栈stack的头文件 ...

  2. 如何使用mybatis插入数据之前就具生成id值

    SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题,该功能可以很随意的设置生成主键的方式. 不管SelectKey有多好,尽量不要遇到这种情况吧,毕竟很麻烦. k ...

  3. eolinker使用初体验(一)

    1.官网 https://www.eolinker.com 2.安装测试增强插件,由于chrome安装的时候有问题,建议移步firefox浏览器,不纠结.. 3.新建一个单例测试

  4. Java-字符串、集合

    1.只要是字符串,必然是对象. 2.API文档的基本使用 3.如何创建字符串: 直接饮用赋值,也是一个字符串对象. 可以通过new关键字来调用string的构造方法: public string (c ...

  5. SoupUI 5.1.2(专业版)下载(含破解文件)

    包内含原安装包和破解文件,仅用于技术交流,切勿用于商业用途. 安装教程参考:https://www.cnblogs.com/miaojjblog/p/9778839.html 安装包及破解文件下载地址 ...

  6. ES6的字符串和数值的扩展

    字符串扩展 对于处理大于两个字节(大于0xffff)的字符,let str =’\u{20bb7}abc’ ES5中的遍历  for(let i=0;i<str.length;i++){ con ...

  7. git使用:本地分支merge到远程分支

    背景:为了更加规范维护自动化测试工程,代码提交流程最近更新了,先拉分支到本地修改,完成后同步到远程分支. 前置条件 (1)本地机器可通过ssh与gitlab服务器通信 (2)gitlab上的测试项目中 ...

  8. ngnix 反向代理来解决前端跨域问题

    1.定义 跨域是指a页面想获取b页面资源,如果a.b页面的协议.域名.端口.子域名不同,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源.注意:跨域限制访 ...

  9. Parco_Love_String

    二维的kmp直接搞出来emmm, 后缀自动机都没这个快(本弱鸡不会后缀自动机) #include <bits/stdc++.h> using namespace std; #define ...

  10. LeetCode 5 最长对称串

    LeetCode 5 最长对称串 最早时候做这道题的时候还是用Java写的,用的是字符串匹配的思路,一直Time Limit Exceeded.甚至还想过用KMP开优化子串查找. public cla ...