图像像素统计

我们可以将数字图像理解成一定尺寸的矩阵,矩阵每一个元素的大小表示了图像中每一个像素的亮暗程度

因此,统计矩阵中的最大值就是寻找图像中灰度值最大的像素,计算平均值就是计算图像像素平均灰度

可以用来表示图像整体的亮暗程度

图像像素最大值和最小值minMaxLoc()函数

minMaxLoc()函数原型:

void minMaxLoc(InputArray src,
               double * minVal,
               double * maxVal = 0,
               Point * minLoc = 0,
               Point * maxLoc = 0,
               InputArray mask = noArray()
               )
  • src:需要寻找最大值和最小值的图像或矩阵,要求必须是单通道矩阵
  • minVal:图像或矩阵中的最小值
  • maxVal:图像或矩阵中的最大值
  • minLoc:图像或矩阵中的最小值在矩阵中的坐标
  • maxLoc:图像或矩阵中的最大值在矩阵中的坐标
  • mask:掩模,用于设置在图像或矩阵中的指定区域寻找最值

Point的数据类型用于表示图像的像素坐标,图像以左上角的像素为坐标原点,水平方向为x轴,竖直方向为y轴

因此Point(x,y)对应图像的行和列,Piont(列数,行数)

针对二维坐标数据,定义了int坐标 Point2i(Point)、double坐标 Point2d、浮点坐标 Point2f

对于三维坐标,同样定义了上述坐标数据类型,只需将“2”变为“3” ,可以通过变量的x,y,z属性进行访问

例如 Point.x可以读取坐标的x轴数据

该函数第一个参数要求必须是单通道矩阵,所以如果是多通道矩阵数据,需要用reshape()函数

Mat reshape(int cn,
            int rows = 0
            )
  • cn:转换后矩阵的通道数
  • rows:转换后矩阵的行数,如果参数为0,则转换后行数与转换前相同

示例:

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
    system("color F0"); //改变输出界面
    float a[12] = {1,2,3,4,5,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()

图像的平均值表示图像整体的亮暗程度,图像的平均值越大,则图像整体越亮

标准差表示图像中明暗的对比程度,标准差越大,表示图像中明暗变化越明显

OpenCV4提供了mean()函数来计算图像的平均值,提供了meanStdDev()函数用于同时计算平均值和标准差

mean()函数原型:

Scalar mean(InputArray src,
            InputArray mask = noArray()
            )
  • src:需要寻找最大值和最小值的图像或矩阵,要求必须是单通道矩阵
  • mask:掩模,用于标记求取图像指定区域平均值

该函数用来求取图像矩阵的每一个通道的平均值,第一个参数用来输入待求平均值的图像矩阵

其通道数目可以为1~4,该函数返回值是一个Scalar类型的变量,返回值有4位,分别表示输入图像4个通道的平均值

如果输入图像只有一个通道,那么返回值后3位都为0,例如输入单通道平均值为1的图像,输出结果为[1,0,0,0]

可以通过Scalar[n]来查看第n个通道的平均值,第二个参数用来控制图像求取平均值的范围

meanStdDev()函数原型:

void meanStdDev(InputArray src,
                OutputArray mean,
                OutputArray stddev,
                InputArray mask = noArray
                )
  • src:需要寻找最大值和最小值的图像或矩阵,要求必须是单通道矩阵
  • mean:图像每一个通道的平均值,参数为Mat类型变量
  • stddev:图像每一个通道的标准差,参数为Mat类型变量
  • mask:掩模,用于标记求取图像指定区域平均值和标准差

该函数第一个参数与mean()函数第一个参数相同,都可以是1~4通道的图像,不同的是该函数没有返回值

图像的平均值和标准差输出在函数的第二个参数和第三个参数,存放平均值和标准差的是Mat类型变量

如果输入图像只有一个通道,那么该函数求取的平均值和标准差变量只有一个数据

示例:

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
    system("color F0"); //改变输出界面
    float a[12] = {1,2,3,4,5,6,7,8,9,10,0};
    Mat img = Mat(3,4,CV_32FC1,a); //单通道矩阵
    Mat imgs = Mat(2,3,CV_32FC2,a); //多通道矩阵
    cout << "用mean求取图像的平均值" << 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;
    cout << "imgs标准差=" << myStddevMat << "    " << endl << endl;
    return 0;
}

results matching ""

    No results matching ""