OpenCV 图像像素值统计

一、知识点
1、像素值统计

(1)、最小(min)

(2)、最大(max)

(3)、均值(mean)

(4)、标准差(standard deviation)

方差是一组数据与其平均值之差的平方的平均值。

标准差是方差的平方根。

它们衡量了数据的离散程度。 值越大,数据点之间的差异越大,集中趋势差; 反之,数据分布越集中。

2、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());

(1)、查找数组(图像)中的最小值和最大值,以及它们的位置。

(2)、参数说明:

src: 输入数组(图像),需要单通道的。

minVal: 输出参数,指向最小值的指针,若不需要,则置NULL。

maxVal: 输出参数,指向最大值的指针,若不需要,则置NULL。

minLoc: 输出参数,指向最小值位置(x, y坐标)的指针,若不需要,则置NULL。

maxLoc: 输出参数,指向最大值位置(x, y坐标)的指针,若不需要,则置NULL。

mask: 可选掩码,若不为空,则在指定数组中(非零掩码对应)搜索最小最大值; 若为空,则在整个数组中搜索。

3、void meanStdDev(InputArray src, OutputArray mean, OutputArray stddev, InputArray mask = noArray());

(1)、计算数组(图像)的均值和标准差。

(2)、参数说明:

src: 输入数组(图像),可以是单通道,也可以是多通道。

mean: 输出数组,用于存储每个通道的均值。

stddev: 输出数组,用于存储每个通道的标准差值。

mask: 可选掩码,若不为空,则在指定数组中(非零掩码对应)计算; 若为空,则在整个数组中计算。

二、示例代码

cpp 复制代码
#include <iostream>
#include <opencv2/opencv.hpp>


int main()
{
    cv::Mat src1 = cv::imread("../images/6.png");
    if (src1.empty())
    {
        std::cout << "load src image error..." << std::endl;
        return -1;
    }

    //求最小最大值时,输入图像需是单通道的
    std::vector<cv::Mat> vecM;
    cv::split(src1, vecM);
    for (int i = 0; i < vecM.size(); i++)
    {
        double minV, maxV;
        cv::Point minLoc, maxLoc;
        cv::minMaxLoc(vecM[i], &minV, &maxV, &minLoc, &maxLoc, cv::Mat());
        std::cout << "Image1 i = " << i << ", minValue = " << minV << ", maxValue = " << maxV << std::endl;
    }
    
    //求均值和方差
    cv::Mat mean, stddev;
    cv::meanStdDev(src1, mean, stddev);
    std::cout << "mean:" << std::endl << mean << std::endl << "stddev:" << std::endl << stddev << std::endl;

    cv::Mat src2 = cv::Mat::zeros(4, 3, CV_8UC3);
    src2 = cv::Scalar(42, 89, 105);

    //求最小最大值
    std::vector<cv::Mat> vecM2;
    cv::split(src2, vecM2);
    for (int i = 0; i < vecM2.size(); i++)
    {
        double minV, maxV;
        cv::Point minLoc, maxLoc;
        cv::minMaxLoc(vecM2[i], &minV, &maxV, &minLoc, &maxLoc, cv::Mat());
        std::cout << "Image2 i = " << i << ", minValue = " << minV << ", maxValue = " << maxV << std::endl;
    }

    //求均值和方差
    cv::Mat mean2, stddev2;
    cv::meanStdDev(src2, mean2, stddev2);
    std::cout << "mean2:" << std::endl << mean2 << std::endl << "stddev2:" << std::endl << stddev2 << std::endl;

    system("pause");

    return 0;
}

输出结果:

Image1 i = 0, minValue = 0, maxValue = 255

Image1 i = 1, minValue = 0, maxValue = 255

Image1 i = 2, minValue = 0, maxValue = 255

mean:

[117.4247741699219;

99.5269775390625;

103.0511779785156]

stddev:

[109.9909118460736;

99.60692477866574;

111.1995801429959]

Image2 i = 0, minValue = 42, maxValue = 42

Image2 i = 1, minValue = 89, maxValue = 89

Image2 i = 2, minValue = 105, maxValue = 105

mean2:

[42;

89;

105]

stddev2:

[0;

0;

0]

相关推荐
yuanyuan33426 分钟前
2026枣庄带检测报告伸缩门品牌测评|本地服务
大数据·数据库·人工智能·伸缩门
无所畏俱的老尹36 分钟前
Agent 落地为什么需要影子对照:同输入只读双跑、写动作变提案、差异报警,比直接切全量更安全
人工智能·机器学习·云计算·aigc·devops
会飞锦鲤43 分钟前
基于 SVM + HOG 的铸造缺陷检测系统
python·opencv·机器学习·计算机视觉·缺陷检测·图像分类·svm
神鹰手哥_起飞版2 小时前
深度研判任务里,开思考、换更强的模型、套方法论,哪个更有用?
人工智能
ObserverX212 小时前
我是如何用 13KB 纯 Python,发现本地 RAG 的“隐式递归记忆”的
人工智能
Jason_gao9992 小时前
Github Copilot 新手极速上手指南
人工智能·github·copilot
用户360055579002 小时前
Kestrel_VLLM - 35 · 把 m 循环搬进内核:一次「先量发射、再合并发射」的完整回合
人工智能
Linye2 小时前
为什么让 AI 修个小 Bug 却把底层全重写了?聊聊 Coding Agent 的最小修改边界
人工智能·架构
深度开源2 小时前
我扫了自己电脑里的 402 个 AI 技能,光目录就吃掉 4.5 万 token
人工智能
skywalk81632 小时前
hive 常驻集群:像 OSPF 一样在线,像 git 一样可信
运维·人工智能·hive