1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > OpenCv中计算图像像素最大值 最小值 均值和方差

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

时间:2024-08-17 18:45:29

相关推荐

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 <opencv2\opencv.hpp>#include <iostream>#include <vector>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;}

运行结果:

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 <opencv2\opencv.hpp>#include <iostream>#include <vector>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;}

运行结果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。