文章目录
- 1、求roi感兴趣区域内像素值的最小值、最大值
- minMaxLoc() 函数原型:
- (1)原型一:
- (2)原型二:
- (3)另外与 `minMaxLoc()`函数原型一,用法相同的函数 `minMaxIdx()`,也可以找出矩阵中的最大值和最小值:
- minMaxIdx()函数原型:
- 2、求roi感兴趣区域内像素值的均值、标准差(标准方差)
- (1)数学概念:
- 均值 mean:样本集合的平均值;
- 方差 variance:概率论中**方差**用来度量随机变量和其数学期望(即均值)之间的**偏离程度**;统计中的方差(样本方差)是各个样本数据 与 样本平均值**之差**的 **平方和** 的**平均数**;
- 标准差 standard deviation:反映一个数据集的离散程度,标准差就是样本**方差**的算术平方根;
- (2)meanStdDev() 函数原型:
- 示例:
- (3)通过函数 `mean()`求roi感兴趣区域内像素值的均值
- mean() 函数原型:
- 代码示例:
roi感兴趣区域像素值统计,求roi感兴趣区域内像素值的最小值、最大值、均值、标准差(标准方差)
1、求roi感兴趣区域内像素值的最小值、最大值
- OpenCV中,函数
minMaxLoc()
用于找出矩阵中的最大值和最小值,并且给出它们的坐标;- 函数不适用于多通道矩阵,如果需要遍历所有的通道来找到最大和最小值,首先使用函数
Mat::reshape()
将矩阵转换为单通道矩阵,或者使用split()
、mixChannels()
,来提取特定的通道,再使用minMaxLoc()
函数求矩阵的最大值和最小值;
minMaxLoc() 函数原型:
(1)原型一:
void cv::minMaxLoc( InputArray src,double *minVal,double *maxVal = 0,Point *minLoc = 0,Point *maxLoc = 0,InputArray mask = noArray()
)参数解释:
src:输入单通道矩阵
minVal:输入矩阵中的最小值(如果不需要返回,置为NULL)
maxVal:输入矩阵中的最大值(如果不需要返回,置为NULL)
minLoc:输入矩阵中的最小值的坐标(如果不需要返回,置为NULL)
maxLoc:输入矩阵中的最大值的坐标(如果不需要返回,置为NULL)
mask:可选参数,操作掩摸,用以标记求取哪些区域
(2)原型二:
void minMaxLoc( const SparseMat &src, double *minVal,double *maxVal, int *minIdx = 0, int *maxIdx = 0
);参数解释:
src:输入单通道矩阵
minVal:输入矩阵中的最小值(如果不需要返回,置为NULL)
maxVal:输入矩阵中的最大值(如果不需要返回,置为NULL)
minLoc:输入矩阵中的最小值的坐标(如果不需要返回,置为NULL)
maxLoc:输入矩阵中的最大值的坐标(如果不需要返回,置为NULL)
(3)另外与 minMaxLoc()
函数原型一,用法相同的函数 minMaxIdx()
,也可以找出矩阵中的最大值和最小值:
minMaxIdx()函数原型:
void minMaxIdx( InputArray src,double *minVal,double *maxVal = 0,int *minIdx = 0,int *maxIdx = 0,InputArray mask = noArray()
);参数解释:
src:输入单通道矩阵
minVal:输入矩阵中的最小值(如果不需要返回,置为NULL)
maxVal:输入矩阵中的最大值(如果不需要返回,置为NULL)
minIdx:输入矩阵中的最小值的坐标(如果不需要返回,置为NULL)
maxIdx:输入矩阵中的最大值的坐标(如果不需要返回,置为NULL)
mask:可选参数,操作掩摸,用以标记求取哪些区域
2、求roi感兴趣区域内像素值的均值、标准差(标准方差)
(1)数学概念:
(2)meanStdDev() 函数原型:
opencv中标准差表示一个图像的明暗变化程度,标准差越大,表示明暗变化越明显;
void meanStdDev( InputArray src,OutputArray mean,OutputArray stddev,InputArray mask=noArray()
);参数解释:
src:输入矩阵,单通道的矩阵/多通道的矩阵;
mean:输出参数,计算出的平均值;
stddev:输出参数,计算出的标准差;
mask:可选参数,操作掩摸,用以标记求取哪些区域;
示例:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>using namespace cv;
using namespace std;int main() {// 读取图像,BGR存储在Mat矩阵里Mat src = cv::imread("C:\\cpp\\image\\suzy4.jpg");if (src.empty()) {printf("could not load image..../n");return -1;}namedWindow("src", WINDOW_NORMAL);imshow("src", src);// 将矩阵转换为单通道矩阵vector<Mat> mv;split(src, mv);double minv, maxv;Point minLoc, maxLoc;// 使用函数 minMaxLoc()找出矩阵中的最大值和最小值for (int i = 0; i < mv.size(); i++){minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat());cout << "channels:" << i << " min:" << minv << " max:" << maxv << endl;}// 求roi感兴趣区域内像素值的均值、标准差(标准方差)Mat mean, stddev;meanStdDev(src, mean, stddev);cout << "means:" << mean << endl;cout << "stddev:" << stddev << endl;waitKey();destroyAllWindows();return 0;
}
(3)通过函数 mean()
求roi感兴趣区域内像素值的均值
mean() 函数原型:
mean( InputArray src,InputArray mask=noArray()
)参数解释:
src:输入矩阵;
mask:可选参数,操作掩摸,用以标记求取哪些区域;
代码示例:
#include <opencv2/opencv.hpp>
#include <iostream>using namespace std;
using namespace cv;int main()
{cv::Mat A1 = (cv::Mat_<uchar>(3, 3) << 1, 2, 3,4, 5, 6,7, 8, 9);cout << "A1中的数据为:\n" << A1 << endl << endl;cv::Scalar A1_mean;// 通过函数mean()求roi感兴趣区域内像素值的均值 A1_mean = mean(A1);cout << "通过函数mean计算得到的A1的均值为:" << A1_mean << endl << endl;cv::Scalar A1_mean_2, A1_sd;meanStdDev(A1, A1_mean_2, A1_sd);cout << "通过函数meanStdDev计算得到的A1的均值为:" << A1_mean_2 << endl << endl;cout << "通过函数meanStdDev计算得到的A1的标准差为:" << A1_sd << endl << endl;return(0);
}