【42】【OpenCV C++】 计算图像某一列像素方差 或 某一行像素的方差;

文章目录

  • 1 要使用到的函数 和 原理
    • 1.1 cv::meanStdDev 函数详解——计算均值和标准差
    • 1 .2 方差的通俗解释
  • 2 代码实现
  • 3 问题
    • 3.1 入口参数const cv::Mat& img 和 const cv::Mat img区别

项目要求:

  • C++ OPenCV 中 图像img ,
  • 当 string ROIdirection =“H”时,代表横向线条,则在图像宽度的一半处取一列像素,计算方差;
  • 当 string ROIdirection =“V”时,代表竖向线条,则在图像高度的一半处取一行像素,计算方差;

要求写一个独立的函数实现该功能,计算的方差有入口参数带出来;

1 要使用到的函数 和 原理

1.1 cv::meanStdDev 函数详解——计算均值和标准差

OpenCV的cv::meanStdDev函数用于同时计算输入矩阵的均值标准差。函数定义如下:

void cv::meanStdDev(InputArray src, OutputArray mean, OutputArray stddev, InputArray mask=noArray());

参数:

  • src:输入数组,必须是单通道或多通道的图像。
  • mean:输出参数,返回各个通道的均值。
  • stddev:输出参数,返回各个通道的标准差。
  • mask:可选的操作掩码,用于指定需要计算的区域。如果不提供,默认计算整个图像。

功能:

  • meanStdDev计算输入矩阵src的均值和标准差。均值是数据的平均值,标准差是数据偏离均值的程度。

代码示例及详细解释

假设我们有一个一维矩阵linePixels1D,我们可以使用meanStdDev函数来计算它的均值和标准差。具体代码如下:

cv::Scalar mean, stddev;
cv::meanStdDev(linePixels1D, mean, stddev);
  • linePixels1D:输入矩阵,这里是一维的像素值数组。
  • mean:输出参数,存储均值结果。
  • stddev:输出参数,存储标准差结果。

例子详细解释:
假设linePixels1D包含以下像素值:

[100, 150, 200, 250, 150, 100, 200, 250]

执行cv::meanStdDev后,计算过程如下:
在这里插入图片描述
然后计算这些偏差平方的平均值:
(5625 + 625 + 625 + 5625 + 625 + 5625 + 625 + 5625)/8 = 3593.75;
最后计算标准差(方差的平方根):
sqrt{3593.75} = 59.94;

3.函数结果:

  • mean[0] 将包含均值:175
  • stddev[0] 将包含标准差:59.94

1 .2 方差的通俗解释

方差是一个统计学概念,用于衡量一组数据的分散程度。通俗地讲,方差告诉我们数据点离平均值有多远。理解方差可以帮助我们了解数据的波动情况。

举例说明:
假设我们有两组学生的考试成绩:

组A:90, 91, 89, 92, 88
组B:60, 95, 85, 70, 100

这两组的平均分可能相同或相近,但数据的分散情况不同。组A的成绩比较集中,组B的成绩波动较大。

计算步骤:

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

  • 组A的方差为2,组B的方差为226。说明组A的成绩比较集中,而组B的成绩波动较大。
  • 方差越大,数据分布越分散。方差越小,数据越集中。

方差的通俗意义

  • 方差提供了一种量化数据分散程度的方法。
  • 在实际应用中,方差可以帮助我们理解和比较不同数据集的稳定性。例如,在股票市场中,较大的方差意味着股票价格波动较大,风险较高;较小的方差意味着价格波动较小,风险较低。

2 代码实现

#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>// 计算图像指定方向的像素方差
void calculateVariance(const cv::Mat& img, const std::string& ROIdirection, double& variance) {// 检查图像是否为空if (img.empty()) {std::cerr << "错误: 图像为空!" << std::endl;return;}// 检查方向参数是否有效if (ROIdirection != "H" && ROIdirection != "V") {std::cerr << "错误: 无效的ROIdirection!请使用 'H' 或 'V'。" << std::endl;return;}// 用于存储提取的像素线条cv::Mat linePixels;if (ROIdirection == "H") {// 如果是水平方向,在图像一半宽度处取一列像素int colIndex = img.cols / 2;linePixels = img.col(colIndex);} else if (ROIdirection == "V") {// 如果是垂直方向,在图像一半高度处取一行像素int rowIndex = img.rows / 2;linePixels = img.row(rowIndex);}// 将像素线条转换为一维数组以便计算方差cv::Mat linePixels1D = linePixels.reshape(1, linePixels.total());// 计算均值和标准差cv::Scalar mean, stddev;cv::meanStdDev(linePixels1D, mean, stddev);// 方差是标准差的平方variance = stddev[0] * stddev[0];
}int main() {// 加载示例图像(为了简单起见,使用灰度模式)cv::Mat img = cv::imread("path_to_image.jpg", cv::IMREAD_GRAYSCALE);if (img.empty()) {std::cerr << "错误: 无法加载图像!" << std::endl;return -1;}// 计算图像一半宽度处列像素的方差double varianceH = 0.0;calculateVariance(img, "H", varianceH);std::cout << "图像一半宽度处列像素的方差: " << varianceH << std::endl;// 计算图像一半高度处行像素的方差double varianceV = 0.0;calculateVariance(img, "V", varianceV);std::cout << "图像一半高度处行像素的方差: " << varianceV << std::endl;return 0;
}

3 问题

3.1 入口参数const cv::Mat& img 和 const cv::Mat img区别

  • const cv::Mat& img:传递的是图像的引用,不会复制图像数据,只是创建一个对原图像的引用。这在处理大图像时更加高效,因为避免了不必要的数据复制。
  • const cv::Mat img:传递的是图像的副本,函数内部将持有图像数据的一个拷贝。这会导致额外的内存开销和时间消耗,尤其是在图像很大的时候。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94621.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

元图 CAD 插件化革命:突破效率瓶颈,重构智能协作新范式

在建筑、机械、机电等工程领域&#xff0c;传统CAD软件的功能固化与场景割裂已成为效率提升的瓶颈。设计师常面临“通用工具难适配专业需求”、“跨平台协作效率低下”、“数据孤岛阻碍创新”等痛点。元图CAD凭借“场景插件化“核心技术&#xff0c;以模块化能力突破行业桎梏&a…

T:归并排序

归并排序.逆序对简介.归并排序.习题.逆序对简介 \;\;\;\;\;\;\;\;简单介绍一下归并排序的原理&#xff0c;逆序对的基本概念&#xff0c;然后收集相关的练习。 直接用一个基础问题来引入。 因此知道了: \;\;\;\;\;\;\;\;逆序对就是一对数满足 i<j&&nums[i]>nu…

三极管三种基本放大电路:共射、共集、共基放大电路

文章目录一、共集放大电路1.静态分析2.动态分析二、共基放大电路1.静态分析2.动态分析总结如何判断共射、共集、共基放大电路&#xff1f; 电路的输入回路与输出回路以发射极为公共端的电路称为共射放大电路。 电路的输入回路与输出回路以集电极为公共端的电路称为共集放大电路…

Function AI 助力用户自主开发 MCP 服务,一键上云高效部署

作者&#xff1a;靖苏 在 AI 与云原生协同创新的浪潮下&#xff0c;多模型、多场景智能应用日益普及。开发者面临的首要挑战&#xff0c;是如何实现模型之间、服务之间的高效协同&#xff0c;以及如何便捷地将自主研发能力拓展到云端&#xff0c;形成灵活可扩展的智能服务。MC…

c++编译环境安装(gcc、cmake)

一、gcc下载 下载地址&#xff1a;https://ftp.gnu.org/gnu/gcc/ 选择想要下载的版本&#xff0c;然后解压&#xff0c;查看 contrib/download_prerequisites 中的依赖。 以我下载的 gcc-7.3.0 为例&#xff0c; 二、安装依赖包 【gmp】 https://ftp.gnu.org/gnu/gmp/ 【is…

基于贝叶斯的营销组合模型实战案例(PyMC实践)

文章出自&#xff1a;基于营销预算优化的媒体投入分配研究 本篇技术亮点在于结合了广告饱和度和累积效应&#xff0c;通过数学模型和数值优化方法&#xff0c;精确计算电视与数字媒体的最佳预算分配比例&#xff0c;实现增量销售最大化。该方法适合有多渠道广告投放需求、预算…

react_05create-react-app脚手架详细解析(export)

脚手架是什么&#xff1f; 是一种工具:快速生成项目的工程化结构&#xff0c;让项目从搭建到开发&#xff0c;到部署&#xff0c;整个流程变得快速和便捷。 安装过程: 1.安装node,安装完成后验证版本,出现对应版本就表示成功 node --version npm --version2.React脚手架默认是使…

Uncaught TypeError: Illegal invocation

报错信息Uncaught TypeError: Illegal invocation关键代码$.operate.post(prefix "/edit", { "taskId": taskId, "taskStatus": completed });<input id"taskId" style"display: none;">[[${completeTask.taskId}]]&…

深入解析Go设计模式:责任链模式实战

什么是责任链模式? 责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它通过构建处理者链来传递请求。每个处理者既能自行决定是否处理当前请求,也可将请求转交给后续处理者。该模式的核心优势在于解耦请求发送方与处理方,使多个对象都能获得处理请求的机…

机器视觉系统工业相机的成像原理及如何选型

机器视觉系统是一种模拟人类视觉功能&#xff0c;通过光学装置和非接触式传感器获取图像数据&#xff0c;并进行分析和处理&#xff0c;以实现对目标物体的识别、测量、检测和定位等功能的智能化系统。其目的是让机器能够理解和解释视觉信息&#xff0c;从而做出决策或执行任务…

Java如何快速实现短信登录?

全文目录&#xff1a;开篇语前言1. 短信登录的工作原理2. 短信登录的优点3. 短信登录的缺点4. 短信登录的实现示例&#xff1a;使用 Java 实现短信登录的流程4.1 发送短信验证码&#xff08;伪代码&#xff09;4.2 使用第三方短信平台发送短信&#xff08;以阿里云为例&#xf…

HTML已死,HTML万岁——重新思考DOM的底层设计理念

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

客户管理系统的详细项目框架结构

以下是针对客户管理系统的详细项目框架结构&#xff0c;整合了核心业务模块&#xff08;客户信息、合同管理、售前售后等&#xff09;&#xff0c;并补充了实用扩展模块&#xff08;如数据统计、标签管理等&#xff09;&#xff0c;严格遵循Django模块化设计原则&#xff1a; c…

【01】OpenCV C#——C#开发环境OpenCvSharp 环境配置 工程搭建 及代码测试

文章目录一、OpenCV 介绍二、OpenCvSharp 介绍三、OpenCvSharp环境搭建3.1 创建新项目3.2 添加 NuGet组件3.3 代码测试3.4 相较于 C OpenCV不同的之处四、LearnOpenCV有时候&#xff0c;单纯c#做前端时会联合C实现的dll来落地某些功能由于有时候会用C - Opencv实现算法后封装成…

【解决办法】报错Found dtype Long but expected Float

Found dtype Long but expected Float错误通常发生在尝试将一个数据类型为Long的张量传递给一个期望数据类型为Float的函数或操作时。在PyTorch中&#xff0c;Long和Float是两种常见的数据类型&#xff0c;分别对应于64位整数和32位浮点数。某些函数或操作可能只接受特定数据类…

QtC++ 调用 tesseract开源库 搭配 Opencv 实现文字识别:从tesseract库基本介绍到实际应用实现

前言 在当今数字化时代&#xff0c;文字识别&#xff08;OCR&#xff09;技术已经渗透到我们生活和工作的方方面面&#xff0c;从扫描文档的自动排版到车牌识别、票据信息提取等&#xff0c;都离不开 OCR 技术的支持。而在众多 OCR 实现方案中&#xff0c;QtC 结合 tesseract 和…

数据集-目标检测系列- 地球仪 数据集 globe>> DataBall

数据集-目标检测系列- 地球仪 数据集 globe&#xff1e;&#xff1e; DataBall贵在坚持&#xff01;* 相关项目1&#xff09;数据集可视化项目&#xff1a;gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview2&#xff09;数据集训练、推理相关项目&…

[Oracle] DUAL数据表

Oracle中的DUAL数据表是一个特殊的单行单列虚拟表结构&#xff1a;1行1列SELECT * FROM DUAL;输出结果&#xff1a;列名默认DUMMY&#xff0c;值为X常见使用DUAL数据表的场景&#xff1a;1.系统函数调用测试当需要测试Oracle函数但不需要真实表数据时&#xff0c;我们可以考虑使…

第五篇: 深入解析基于 SQLAlchemy 的聊天记录持久化模块:`message_model` 与数据库操作封装

深入解析基于 SQLAlchemy 的聊天记录持久化模块:message_model 与数据库操作封装 作者:zgw 标签:SQLAlchemy、Python、FastAPI、数据库持久化、ORM、聊天系统、AI 应用开发 一、前言 在构建大模型应用(如聊天机器人、知识库问答系统)时,对话记录的持久化 是实现“可追溯…

学习游戏制作记录(将各种属性应用于战斗以及实体的死亡)8.5

1.将各种属性应用于战斗我们希望将上节课的CharactorState脚本作为一个父类&#xff0c;而玩家和敌人的属性状态都是继承自它的创建PlayerStats脚本&#xff1a;public class PlayerStats : CharactorState {private Player player;//获取玩家脚本protected override void Star…