版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huanghuangjin/article/details/81623851
Mat像素统计基础
计算N维数据的平均值
方差
协方差
计算方差与协方差矩阵:
代码
#include "../common/common.hpp"
void main(int argc, char ** argv)
{
Mat src = imread(getCVImagesPath("images/test.png"));
imshow("src8-2", src);
Mat means, stddev; // 均值,方差
/*
void meanStdDev( // 计算均值和标准方差(偏差)
InputArray src, // 输入矩阵
OutputArray mean, // 输出参数,均值
OutputArray stddev, // 输出参数,标准差(方差)
InputArray mask=noArray()
);
*/
meanStdDev(src, means, stddev);
// means rows=3, cols=1, depth=6, type=6 src是3通道的,所以计算出来的rows=3
cout << "means rows=" << means.rows << ", cols=" << means.cols << ", depth=" << means.depth() << ", type=" << means.type() << endl;
// stddev rows=3, cols=1, depth=6, type=6 CV_64F
cout << "stddev rows=" << stddev.rows << ", cols=" << stddev.cols << ", depth=" << stddev.depth() << ", type=" << stddev.type() << endl;
for (size_t row = 0; row < means.rows; row++)
{
// 当方差大于均值时,表示图像的像素值分差明显,可以用均值作为阈值二值化
// 当图像的像素值一致的时候,方差为0
cout << "means " << row << ", " << means.at<double>(row) << endl;
cout << "stddev " << row << ", " << stddev.at<double>(row) << endl;
}
// 5*3 矩阵
Mat samples = (Mat_<double>(5, 3) << 90,60,90, 90,90,30, 60,60,60, 60,60,90, 30,30,30); // <<给Mat赋值方式为一行一行的赋,不是一列一列
Mat cov, mu; // 协方差矩阵,各维度均值矩阵
/*
void calcCovarMatrix( // 计算协方差矩阵
InputArray samples, // 输入矩阵
OutputArray covar, // 输出参数,协方差矩阵
InputOutputArray mean, // 输出参数,均值矩阵
int flags, // CV_COVAR_NORMAL 表示 flag for cvCalcCovarMatrix, [v1-avg, v2-avg,...] * transpose([v1-avg,v2-avg,...])
// CV_COVAR_ROWS 表示 flag for cvCalcCovarMatrix, all the input vectors are stored in a single matrix, as its rows
// CV_COVAR_COLS 表示 flag for cvCalcCovarMatrix, all the input vectors are stored in a single matrix, as its columns
// 其他参数参看注释
int ctype = CV_64F
);
*/
calcCovarMatrix(samples, cov, mu, CV_COVAR_NORMAL | CV_COVAR_ROWS);
// cov rows=3, cols=3, depth=6, type=6
cout << "cov rows=" << cov.rows << ", cols=" << cov.cols << ", depth=" << cov.depth() << ", type=" << cov.type() << endl;
// mu rows=1, cols=3, depth=6, type=6
cout << "mu rows=" << mu.rows << ", cols=" << mu.cols << ", depth=" << mu.depth() << ", type=" << mu.type() << endl;
/*
[2520, 1800, 900;
1800, 1800, 0;
900, 0, 3600]
*/
cout << cov << endl;
/*
[504, 360, 180;
360, 360, 0;
180, 0, 720]
*/
cout << cov/5 << endl;
cout << mu << endl; // [66, 60, 60]
waitKey(0);
}