OpenCV 学习笔记-day13 像素值统计 统计计算最大最小值,平均值和标准差 (minMaxLoc()和meanStdDev()函数的使用)

day13 像素值统计

函数

  1. minMaxLoc(); 最大值最小值统计
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输入单通道数组(图像)
minValdouble*类型,指针指向的最小值。若无须返回,此值置为NULL
maxValdouble*类型,指针指向的最大值。若无须返回,此值置为NULL
minLocPoint*类型,指针指向最小值的位置(二维情况下)。若无须返回,此值置为NULL。
maxLocPoint*类型,返回最大位置的指针(二维情况下)。若无须返回,此值置为NULL
mask用于选择子阵列的可选掩码

notes:1,minMaxLoc针对单通道图像,minMaxIdx则不限制(不过输出的坐标会变成三维)。
2,第6个参数是可选的(optional),不使用不传递即可

例1

minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat());
//统计单通道图像mv[i]中的的最大最小值和指向最大最小值的指针
//minMaxLoc()函数 输入图像(mv[i])要求单通道
  1. meanStdDev();平均值和标准方差统计
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;
}

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值