OpenCv中计算图像像素最大值、最小值、均值和方差

1、寻找图像像素的最大值最小值

寻找图像最大值最小值的函数 minMaxLoc() 函数

minMaxLoc() 函数原型

void cv::minMaxLoc(InputArray src, double * minVal, double * maxVal=0,
	Point * minLoc=0,Point * maxLoc=0,InputArray mask = noArray())

其中,src为需要寻找最大值和最小值的图像或者矩阵,要求必须是单通道;minVal:图像或矩阵的最小值;maxVal:图像或矩阵的最大值;minLoc:图像或矩阵的最小值在矩阵中的坐标;maxLoc:图像或矩阵的最大值在矩阵中的坐标;mask:掩膜,用于设置在图像或矩阵中的指定区域寻找最值。

minMaxLoc() 函数输出最值的位置为按行扫描从左到右第一次检测到最值的位置,同时输入参数时一定

Point 数据类型:该数据类型用于表示图像的像素坐标,水平方向为x轴,垂直方向为y轴,Point(x,y)。针对二维坐标数据类型,定义了整型坐标 cv::Point2i(或者cv::Point)、double类型坐标cv::Point2d、浮点型坐标cv::Point2f。对于三维坐标类型定义与二维坐标数据类型相似,只需要将 2 改成 3 即可。对于坐标中 x、y 轴具体数据,可以通过变量属性进行访问,例如:Point.x 可以读取坐标的 x 轴数据。

src为需要寻找最大值和最小值的图像或者矩阵,要求必须是单通道,对于多通道矩阵数据,需要用 cv::Mat::reshape() 将多通道变成单通道,或者分别寻找每个通道的最值,然后进行比较。

cv::Mat::reshape() 函数原型

Mat cv::Mat::reshape(int cn, int rows = 0)

 其中 cn:转换后矩阵的通道数;rows:转换后矩阵的行数。如果参数为0,则转换后行数与转化前行数相同。

综合示例:

#include 
#include 
#include 

using namespace std;
using namespace cv;

int main()
{
	system("color F0");  //更改输出界面颜色
	float a[12] = { 1, 2, 3, 4, 5, 10, 6, 7, 8, 9, 10, 0 };
	Mat img = Mat(3, 4, CV_32FC1, a);  //单通道矩阵
	Mat imgs = Mat(2, 3, CV_32FC2, a);  //多通道矩阵
	double minVal, maxVal;  //用于存放矩阵中的最大值和最小值
	Point minIdx, maxIdx;  用于存放矩阵中的最大值和最小值在矩阵中的位置

						   /*寻找单通道矩阵中的最值*/
	minMaxLoc(img, &minVal, &maxVal, &minIdx, &maxIdx);
	cout << "img中最大值是:" << maxVal << "  " << "在矩阵中的位置:" << maxIdx << endl;
	cout << "img中最小值是:" << minVal << "  " << "在矩阵中的位置:" << minIdx << endl;

	/*寻找多通道矩阵中的最值*/
	Mat imgs_re = imgs.reshape(1, 4);  //将多通道矩阵变成单通道矩阵
	minMaxLoc(imgs_re, &minVal, &maxVal, &minIdx, &maxIdx);
	cout << "imgs中最大值是:" << maxVal << "  " << "在矩阵中的位置:" << maxIdx << endl;
	cout << "imgs中最小值是:" << minVal << "  " << "在矩阵中的位置:" << minIdx << endl;
	return 0;
}

运行结果:

OpenCv中计算图像像素最大值、最小值、均值和方差_第1张图片

 2、计算图像的平均值和标准差差

图像的平均值表示图像整体的亮暗程度,平均值越大,则图像整体越亮。标准差表示图中明暗变化的对比程度,标准差越大,表示图像中明暗变化越明显。

mean()函数原型

cv::Scalar cv::mean(InputArray src, InputArray mask= noArray())

其中,src:待求平均值的图像矩阵(通道数可以位1~4)。mask:掩模,用于标记求取那些区域的平均值。

该函数求取每个通道的平均值。该函数返回值是一个cv::Scalar 类型的变量,函数的返回值有 4 位,分别表示输入图像的4 个通道的平均值,如果输入图像只有一个通道,那么返回值的后 3 位都是0.可以通过 cv::Scalar[n] 查看第 n 个通道的平均值。

meanStdDev()函数原型

void cv::meanStdDev(InputArray src, OutputArray mean, OutputArray stddev, 
                        InputArray mask =noArray())

其中,src:待求平均值的图像矩阵;mean:图像每个通道的平均值,参数为Mat类型变量;

stddev:图像每个通道的标准差,参数为Mat类型变量;mask:掩模,用于标记求取那些区域的平均值和标准差。该函数没有返回值。图像的均值和标准差输出在函数第二个参数和第三个参数中。

综合示例:

#include 
#include 
#include 

using namespace std;
using namespace cv;

int main()
{
	system("color F0");  //更改输出界面颜色
	float a[12] = { 1, 2, 3, 4, 5, 10, 6, 7, 8, 9, 10, 0 };
	Mat img = Mat(3, 4, CV_32FC1, a);  //单通道矩阵
	Mat imgs = Mat(2, 3, CV_32FC2, a);  //多通道矩阵

	cout << "/* 用meanStdDev同时求取图像的均值和标准差 */" << endl;
	Scalar myMean;
	myMean = mean(imgs);
	cout << "imgs均值=" << myMean << endl;
	cout << "imgs第一个通道的均值=" << myMean[0] << "    "
		<< "imgs第二个通道的均值=" << myMean[1] << endl << endl;

	cout << "/* 用meanStdDev同时求取图像的均值和标准差 */" << endl;
	Mat myMeanMat, myStddevMat;

	meanStdDev(img, myMeanMat, myStddevMat);
	cout << "img均值=" << myMeanMat << "    " << endl;
	cout << "img标准差=" << myStddevMat << endl << endl;
	meanStdDev(imgs, myMeanMat, myStddevMat);
	cout << "imgs均值=" << myMeanMat << "    " << endl << endl;
	cout << "imgs标准差=" << myStddevMat << endl;
	return 0;
}

运行结果

OpenCv中计算图像像素最大值、最小值、均值和方差_第2张图片

 

你可能感兴趣的:(计算机视觉,opencv,计算机视觉,c++,visual,studio)