文章目录
- 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);
}