寻找图像最大值最小值的函数 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;
}
运行结果:
图像的平均值表示图像整体的亮暗程度,平均值越大,则图像整体越亮。标准差表示图中明暗变化的对比程度,标准差越大,表示图像中明暗变化越明显。
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;
}
运行结果