roi感兴趣区域像素值统计,求roi感兴趣区域内像素值的最小值、最大值、均值、标准差(标准方差)


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)数学概念:

  • 均值 mean:样本集合的平均值;

请添加图片描述

  • 方差 variance:概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏离程度;统计中的方差(样本方差)是各个样本数据 与 样本平均值之差平方和平均数

请添加图片描述

  • 标准差 standard deviation:反映一个数据集的离散程度,标准差就是样本方差的算术平方根;

在这里插入图片描述

(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);
}

猜你喜欢

转载自blog.csdn.net/qq_33867131/article/details/132203761