day13 像素值统计
函数
CV_EXPORTS_W void minMaxLoc(InputArray src, CV_OUT double* minVal,
CV_OUT double* maxVal = 0, CV_OUT Point* minLoc = 0,
CV_OUT Point* maxLoc = 0, InputArray mask = noArray());
参数 | 说明 |
---|---|
src | 输入单通道数组(图像) |
minVal | double*类型,指针指向的最小值。若无须返回,此值置为NULL |
maxVal | double*类型,指针指向的最大值。若无须返回,此值置为NULL |
minLoc | Point*类型,指针指向最小值的位置(二维情况下)。若无须返回,此值置为NULL。 |
maxLoc | Point*类型,返回最大位置的指针(二维情况下)。若无须返回,此值置为NULL |
mask | 用于选择子阵列的可选掩码 |
notes:1,minMaxLoc针对单通道图像,minMaxIdx则不限制(不过输出的坐标会变成三维)。
2,第6个参数是可选的(optional),不使用不传递即可
例1
minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat());
//统计单通道图像mv[i]中的的最大最小值和指向最大最小值的指针
//minMaxLoc()函数 输入图像(mv[i])要求单通道
CV_EXPORTS_W void meanStdDev(InputArray src, OutputArray mean, OutputArray stddev,
InputArray mask=noArray());
参数 | 说明 |
---|---|
src | 输入数组(图像)1-4通道都可以 |
mean | 均值 |
stddev | 标准差 |
mask | 用于选择子阵列的可选掩码 |
例2
meanStdDev(image, mean, stddev);
//统计image三个通道的均值和标准差
打印时 mean.at< double >(0, 0),mean.at< double >(1, 0),mean.at< double> (2, 0)
分别代表三个通道的均值,mean.at< double >(0, 0),mean.at< double >(0, 1),mean.at< double >(0, 2),也分别代表三个通道的均值而且与前三个一一对应,
标准差同理
stddev.at< double >(i,0)
代码
quickopencv.h
#pragma once
#include <opencv2\highgui.hpp>
#include <opencv2\imgproc.hpp>
using namespace cv;
//定义类
class QuickDemo{
public:
void colorSpace_Demo(Mat &image);//色彩空间转换函数2021-12-24
void mat_creation_demo(Mat &image);//Mat对象与创建2021-12-27
void pixel_vist_Demo(Mat &image);//图像像素的读写操作2022-1-3
void operators_demo(Mat &image);//图像像素的算数操作2022-1-4
void tracking_bar_demo(Mat &image);//滚动条操作演示2022-1-7
void key_demo(Mat &image);//键盘响应操作2022-1-12
void color_style_demo(Mat &image);//OpenCV自带颜色表操作2022-1-12
void bitwise_demo(Mat &image);//位操作(逻辑操作)2022-1-17
void channels_demo(Mat &image);//通道分离与合并2022-1-17
void inrange_demo(Mat &image);//roi区域提取 2022-1-20
void pixel_statistic_demo(Mat &image);//像素值统计2022-1-21
};
QuickDemo.cpp
#include <opencv2\highgui.hpp>
#include <opencv2\imgproc.hpp>
#include<quickopencv.h>
#include <iostream>
void QuickDemo::pixel_statistic_demo(Mat &image)
{
double minv, maxv;
Point minLoc, maxLoc;//位置
std::vector<Mat> mv;
split(image, mv);//通道分离
for (int i = 0; i < mv.size(); i++)
{
minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat());//minMaxLoc()函数 输入图像要求单通道
std::cout << "No.vhannels." << i << " min value " << minv << " max value " << maxv << std::endl;
}
Mat mean, stddev;//mean:平均值 stddev:方差
meanStdDev(image, mean, stddev);
//CV_EXPORTS_W void meanStdDev(InputArray src, OutputArray mean, OutputArray stddev,InputArray mask = noArray());
std::cout << "means:" << mean << std::endl;
std::cout << "stddev:" << stddev << std::endl;
//单独打印
for (int i = 0; i < mv.size(); i++)
{
std::cout <<"means:"<< mean.at<double>(i, 0) <<"----"<<"stddev:"<<stddev.at<double>(i,0)<< std::endl;//单个通道打印均值
}
}
OpencvTest.cpp
#include <iostream>
#include <opencv2\highgui.hpp>
#include <opencv2\imgproc.hpp>
#include<quickopencv.h>
using namespace cv;
using namespace std;
int main()
{
Mat scr = imread("D:\\学习\\OpenCV学习\\pictures\\image\\绿幕皮卡丘.jfif");//打开一张图
if (!scr.data == 1)//判空
return -1;
namedWindow("窗口1", WINDOW_NORMAL);//创建 WINDOW_FREERATIO窗口
imshow("窗口1",scr);//在创建的窗口显示
QuickDemo qd;
qd.pixel_statistic_demo(scr);
waitKey(0);
return 0;
}
结果: