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


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

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

时间: 2024-10-13 11:54:37

opencv2学习:计算协方差矩阵的相关文章

[zz]计算 协方差矩阵

http://www.cnblogs.com/chaosimple/p/3182157.html http://blog.csdn.net/goodshot/article/details/8611178 一.统计学的基本概念 统计学里最基本的概念就是样本的均值.方差.标准差.首先,我们给定一个含有n个样本的集合,下面给出这些概念的公式描述: 均值: 标准差: 方差: 均值描述的是样本集合的中间点,它告诉我们的信息是有限的,而标准差给我们描述的是样本集合的各个样本点到均值的距离之平均. 以这两个

OpenCV2学习笔记:图像的读取与显示

1. 图像读取:imread() Mat imread(const string& ?lename, int ?ags=1 ) 参数介绍: filename: 待加载的文件名称. flags: 此标志用来指定被加载图像的颜色类型(color type).这个标志的取值可以有: -- CV_LOAD_IMAGE_ANYDEPTH : 如果设置这个标志的话,如果图像为16位或32位深度的图像,则返回对应深度的图像:否则,将图像转换为8位深度图像再返回. -- CV_LOAD_IMAGE_COLOR

OpenCV2学习笔记(一):图像的基本操作

一直没有一个系统的时间来深入学习OpenCV,鉴于项目需要,记录一下一些要点以供日后查阅. OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac OS操作系统上.其1.0版本于2006年面世,而在2009年又发布了重要的版本:OpenCV2,带来了新的C++接口:现在,OpenCV3也发布了,据说其Python接口大大增强.并且加入了Python 3.x的支持,还带来了许多新的提升,不过这并不在这里的讨论范围之内.这里使用的是:OpenCV2.4.

OpenCV2学习笔记(九):视频流读取与处理

由于项目需要,计划实现九路视频拼接,因此必须熟悉OpenCV对视频序列的处理.视频信号处理是图像处理的一个延伸,所谓的视频序列是由按一定顺序进行排放的图像组成,即帧(Frame).在这里,主要记录下如何使用Qt+OpenCV读取视频中的每一帧,之后,在这基础上将一些图像处理的算法运用到每一帧上(如使用Canny算子检测视频中的边缘). 一. 读取视频序列 OpenCV提供了一个简便易用的框架以提取视频文件和USB摄像头中的图像帧,如果只是单单想读取某个视频,你只需要创建一个cv::VideoCa

OpenCV2学习笔记(二十一):GPU模块小记

接触一下OpenCV里一个之前没有接触的模块:GPU.这里只是根据教程和大家简单交流一下,欢迎大家批评指正. 注:在使用GPU模块之前,需要确认在使用CMake编译OpenCV时,勾选了选项WITH_CUDA和WITH_TBB使其生效生效. 若以上配置已经完成,在使用GPU模块的函数之前,还做一下检查:调用函数gpu::getCudaEnabledDeviceCount,如果你在使用的OpenCV模块编译时不支持GPU,这个函数返回值为0:否则返回值为已安装的CUDA设备的数量. OpenCV的

OpenCV2学习笔记(三):形态学及边缘角点检测

形态学滤波理论于上世纪90年代提出,目前被广泛用于分析及处理离散图像.其基本运算有4个: 膨胀.腐蚀.开启和闭合, 它们在二值图像和灰度图像中各有特点.基于这些基本运算还可推导和组合成各种数学形态学实用算法,用它们可以进行图像形状和结构的分析及处理,包括图像分割.特征抽取.边缘检测. 图像滤波.图像增强和恢复等.数学形态学方法利用一个称作结构元素的"探针"收集图像的信息,当探针在图像中不断移动时, 便可考察图像各个部分之间的相互关系,从而了解图像的结构特征.数学形态学基于探测的思想,与

深度学习计算模型中“门函数(Gating Function)”的作用

/* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/ author: 张俊林 看深度学习文献,门函数基本上已经是你必然会遇到的一个概念了,最典型的就是LSTM,首先上来你就得过得去"遗忘门""输入门""输出门"这三个门.门函数本身是个独立概念,不过LSTM使用多个门函数来组合出一个带有状态记忆的计算模型而已.随着LSTM大行其道,各种计算模型开始在计算过程中引入门函数的概念,相信这些论文你也没少看,其实这也是一种研究模式,比如

OpenCV2学习笔记(十二):SURF与SIFT算法

当尝试在不同图像之间进行特征匹配时,通常会遇到图像的大小.方向等参数发生改变的问题,简而言之,就是尺度变化的问题.每幅图像在拍摄时与目标物体的距离是不同的,因此要识别的目标物体在图像中自然会存在不同的尺寸. 因此,计算机视觉中引入尺度不变的特征,主要的思想是每个检测到的特征点都伴随对应的尺度因子.著名的尺度不变特征检测器SIFT(scale invariant feature transform),具有尺度,旋转,仿射,视角,光照不变性.而加速鲁棒特性特征SURF(Speeded Up Robu

OpenCV2学习笔记(十):特征点检测之Harris法

在计算机视觉中,特征点的概念被大量用于解决物体识别.图像匹配.视觉跟踪.三维重建等问题,比如图像中物体的角点,它们是在图像中可被轻易而精确地定位的二维特征.顾名思义,特征点检测的思想是无需观察整幅图像,而是通过选择某些特殊点,然后对它们执行局部分析.如果能检测到足够多的这种点,同时它们的区分度很高,并且可以精确定位稳定的特征,那么这个方法就很有效.这里主要使用Harris特征检测器检测图像角点.使用的开发平台为Qt5.3.2+OpenCV2.4.9. Harris角点的理论部分可见这篇blog: