一、引言
这篇博客的主要知识点为:像素值统计
最小(min)最大(max)均值(mean)标准方差(standard deviation)
API 的知识点为:
最大最小值minMaxLoc计算均值与标准方差meanStdDev
二、主要内容
主要有两个API函数:
2.1 minMaxLoc
2.1.1 函数原型
void minMaxLoc( const Mat& src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, const Mat& mask=Mat() ); void minMaxLoc(const MatND& src, double* minVal, double* maxVal, int* minIdx=0, int* maxIdx=0, const MatND& mask=MatND() ); void minMaxLoc(const SparseMat& src, double* minVal, double* maxVal, int* minIdx=0, int* maxIdx=0);
2.1.2 参数解释
参数1:InputArray类型的src,输入单通道数组(图像)。参数2:double*类型的minVal,返回最小值的指针。若无须返回,此值置为NULL。参数3:double*类型的maxVal,返回最大值的指针。若无须返回,此值置为NULL。参数4:Point*类型的minLoc,返回最小位置的指针(二维情况下)。若无须返回,此值置为NULL。参数5:Point*类型的maxLoc,返回最大位置的指针(二维情况下)。若无须返回,此值置为NULL。参数6:InputArray类型的mask,用于选择子阵列的可选掩膜。
2.1.3几点说明:
1 minMaxLoc寻找矩阵(一维数组当作向量,用Mat定义) 中最小值和最大值的位置.
2 参数若不需要,则置为NULL或者0,即可.
3 minMaxLoc针对Mat和MatND的重载中 ,第5个参数是可选的(optional),不使用不传递即可.
PS:minMaxLoc针对单通道图像,minMaxIdx则不限制(不过输出的坐标会变成三维)。
2.2 meanStdDev
计算矩阵的均值和标准偏差。
C++: void meanStdDev(InputArray src,OutputArray mean, OutputArray stddev, InputArray mask=noArray())Python: cv2.meanStdDev(src[,mean[, stddev[, mask]]]) → mean, stddevC: void cvAvgSdv(constCvArr* arr, CvScalar* mean, CvScalar* std_dev, const CvArr* mask=NULL )Python: cv.AvgSdv(arr,mask=None) -> (mean, stdDev)
src:输入矩阵,这个矩阵应该是1-4通道的,这可以将计算结果存在Scalar_ ‘s中mean:输出参数,计算均值stddev:输出参数,计算标准差mask:可选参数
三、代码演示
(注意我用的是release X64跑的)
#include <opencv2/opencv.hpp>#include <iostream>using namespace cv;using namespace std;int main(int argc, char** argv){Mat src = imread("C:/Users/Dell/Desktop/myself/caomei.jpg", IMREAD_GRAYSCALE);if (src.empty()) {printf("could not load image...\n");return -1;}namedWindow("input", WINDOW_AUTOSIZE);imshow("input", src);double minVal; double maxVal; Point minLoc; Point maxLoc;minMaxLoc(src, &minVal, &maxVal, &minLoc, &maxLoc, Mat());printf("min: %.2f, max: %.2f \n", minVal, maxVal);printf("min loc: (%d, %d) \n", minLoc.x, minLoc.y);printf("max loc: (%d, %d)\n", maxLoc.x, maxLoc.y);// 彩色图像 三通道的 均值与方差src = imread("C:/Users/Dell/Desktop/myself/caomei.jpg");Mat means, stddev;meanStdDev(src, means, stddev);printf("blue channel->> mean: %.2f, stddev: %.2f\n", means.at<double>(0, 0), stddev.at<double>(0, 0));printf("green channel->> mean: %.2f, stddev: %.2f\n", means.at<double>(1, 0), stddev.at<double>(1, 0));printf("red channel->> mean: %.2f, stddev: %.2f\n", means.at<double>(2, 0), stddev.at<double>(2, 0));waitKey(0);return 0;}
四、输出结果
我们的输入源图为:
在读取的时候转为了灰度图:
我们也打印了他的像素值数据:
这样我们就打印出来他的最小最大像素值还有均值和标准方差。
这篇博客主要学习了这两个API函数。
加油吧 啊超没有蛀牙!