cv::normalize()
`cv::normalize()`函数是OpenCV库中用于对矩阵或图像数据进行归一化处理的工具。归一化是图像处理和计算机视觉中常见的预处理步骤,它可以确保数据在一定范围内,从而有助于后续的处理和算法的稳定性和性能。`cv::normalize()`函数可以将输入矩阵的值缩放到一个指定的范围,或者将矩阵的值标准化,使其符合某种统计特性,如单位范数。
### 函数原型
`cv::normalize()`函数有多种重载形式,其中一个常用的原型如下:
```cpp
void normalize(InputArray src, OutputArray dst, double alpha, double beta, int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray());
```
### 参数说明
- **src**:输入矩阵或图像,可以是`cv::Mat`类型。
- **dst**:输出矩阵或图像,将保存归一化后的结果。
- **alpha**:归一化后的数据的最小值。
- **beta**:归一化后的数据的最大值。
- **norm_type**:归一化类型,常见的有:
- `NORM_INF`:无穷范数归一化。
- `NORM_L1`:L1范数归一化。
- `NORM_L2`:L2范数归一化。
- `NORM_MINMAX`:将数据缩放到指定的`alpha`和`beta`范围内。
- **dtype**:输出矩阵的数据类型。如果设置为-1,则输出矩阵的数据类型与输入矩阵相同。
- **mask**:可选参数,用于指定归一化的区域。如果提供,只有mask中的非零元素对应的输入矩阵元素会被归一化。
### 归一化类型详解
- **NORM_INF**:将输入矩阵的每个元素除以其绝对值的最大值,使得矩阵的最大绝对值变为1。
- **NORM_L1**:将输入矩阵的每个元素除以所有元素绝对值的总和,即L1范数。
- **NORM_L2**:将输入矩阵的每个元素除以所有元素平方根的和,即L2范数。
- **NORM_MINMAX**:将输入矩阵的值缩放至`alpha`和`beta`之间。这通常用于将数据映射到0到1或-1到1的范围,以改善数据的对比度或用于神经网络输入等。
### 示例代码
下面是一个使用`cv::normalize()`函数进行归一化的示例:
```cpp
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 创建一个测试矩阵
cv::Mat matrix = (cv::Mat_<float>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
// 归一化矩阵至0到1之间
cv::Mat normalized_matrix;
cv::normalize(matrix, normalized_matrix, 0, 1, cv::NORM_MINMAX, -1);
// 打印归一化后的矩阵
std::cout << "Normalized Matrix:\n" << normalized_matrix << std::endl;
return 0;
}
```
在这个示例中,我们创建了一个3x3的矩阵,并使用`cv::normalize()`函数将其归一化至0到1的范围。归一化后的矩阵将打印出来,可以看到所有元素的值都在0到1之间。
### 注意事项
- 在使用`NORM_L1`或`NORM_L2`进行归一化时,如果输入矩阵中有0值,可能需要先添加一个小的正值避免除以0的错误。
- 当使用`NORM_MINMAX`时,如果`alpha`和`beta`设置不当,可能会导致输出矩阵中的某些值超出预期范围。
- 归一化操作可能会改变数据的动态范围和分布,因此在归一化前后,可能需要检查数据的统计特性是否符合后续处理的要求。
cv::normalize(hist1, hist1, 1.0);
是对一个名为`hist1`的`cv::Mat`或`cv::MatND`对象进行归一化操作。这里,`hist1`通常是一个直方图数据,即`hist1`包含了图像或信号的频率分布信息。
### 参数解析
- **`hist1` (InputArray)**:这是要被归一化的输入直方图。在归一化操作后,`hist1`将被直接修改以反映归一化后的结果。
- **`hist1` (OutputArray)**:这是归一化后的输出直方图。由于输入和输出引用了同一个对象,这意味着函数直接在`hist1`上进行修改,而不创建一个新的矩阵。
- **`1.0` (double)**:这是一个重要的参数,决定了归一化的类型和目标值。在这里,`1.0`通常与`NORM_L1`或`NORM_L2`归一化类型相关联。它表示归一化的目标范数值,即所有元素的L1范数(绝对值之和)或L2范数(平方和的平方根)将被缩放至1。
归一化类型
由于在代码片段中没有明确指定`norm_type`参数,`cv::normalize()`函数将使用默认的归一化类型`NORM_L2`。因此,这段代码将执行L2范数归一化,即将`hist1`的L2范数(所有元素平方和的平方根)缩放至1。这意味着归一化后,`hist1`的元素将被调整,使得它们的平方和的平方根等于1。
作用
进行直方图归一化通常是为了以下目的:
- **比较直方图**:当比较两个直方图的相似性时,归一化可以消除图像大小或亮度差异的影响,使得比较更加公平。
- **概率解释**:如果直方图被视为一个概率分布,归一化可以确保所有概率加起来等于1,符合概率论的要求。
- **算法兼容性**:某些机器学习或计算机视觉算法可能要求输入数据满足特定的统计属性,如单位L2范数,以保证算法的稳定性和性能。
总结
综上所述,`cv::normalize(hist1, hist1, 1.0);`这行代码执行了对`hist1`的L2范数归一化,将直方图`hist1`的元素值调整,以确保它们的平方和的平方根等于1。这种处理在图像处理和计算机视觉领域中是常见且必要的预处理步骤。
相关文章:
cv::normalize()
cv::normalize()函数是OpenCV库中用于对矩阵或图像数据进行归一化处理的工具。归一化是图像处理和计算机视觉中常见的预处理步骤,它可以确保数据在一定范围内,从而有助于后续的处理和算法的稳定性和性能。cv::normalize()函数可以将输入矩阵的值缩放到一…...

【Python快速入门和实践016】Python常用脚本-对视频抽取指定帧数并保存
一、功能介绍 这段代码的功能是从一个视频文件中抽取指定数量的帧,并将这些帧保存为图像文件。步骤如下: 设置路径和参数: video_path:视频文件的路径。image_folder:保存抽取图像的目录。num_frames_to_extract&#…...
[Linux CMD] 目录与文件相关的命令
. 代表次层目录 .. 代表上一层目录 - 代表前一个工作目录 ~ 代表目前使用者身份所在的家目录 ~account 代表account这个使用者的家目录(account是个账号名称)…...

redis面试(十三)公平锁排队代码剖析
我们来看一下第二种redis分布式锁 第一种锁是可重入锁,非公平可重入锁,所谓的非公平可重入锁是什么意思呢?胡乱的争抢,根本没有任何公平性和顺序性可言 第二种锁,可重入锁,公平锁 通过公平锁,…...
冷热数据拆分
订单系统设计方案之如何做历史订单和归档 订单数据越来越多,数据库越来越慢该怎么办? 随着历史订单不断累积,2017年MySQL中订单表数据量已达千万级。之后的订单数据,远远大于亿级 对数据量大的问题,进行了以下优化…...
JavaScript 基础(四)
五、DOM编程 1.常用事件 onload 页面加载后触发事件 onscroll 滚动时触发 onresize 尺寸变化时 onclick 鼠标点击 onmouseover 鼠标悬停 onmouseout 鼠标移出 onmousemove 鼠标移动,会触发多次 onfocus 对象获得光标(焦点)时&#x…...
《机器学习by周志华》学习笔记-神经网络-01神经元模型
1、背景 本书所谈的「人工神经网络」不是生物学意义的神经网络。这是T.Kohonen 1988年在Neural Networks创刊号上给出的定义。 2、概念 2.1、神经网络 关于「神经网络(neural networks)」的研究很早就已经出现过,今天的「神经网络」已经是一个比较大且多学科交叉的领域,其…...
C#中常用的扩展类
/// <summary>/// 常用扩展/// </summary>public static class UsualExtension{public static string[] chineseNumbers { "零", "一", "二", "三", "四", "五", "六", "七", &…...

麒麟v10(ky10.x86_64)升级——openssl-3.2.2、openssh-9.8p1
系统版本: ky10.x86_64 下载安装包并上传 openssh下载地址 https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable openssl下载地址 https://openssl-library.org/source/index.html zlib下载地址 https://zlib.net/fossils/ 上传安装包 备份配置文件 cp -r /etc/ssh /et…...
【Unity】有限状态机和抽象类多态
一、介绍 有限状态机是一个用来进行对象状态管理的计算模型。它由一组状态、一个或者多个触发事件以及状态之间的转换条件所组成。 对于任意一个游戏对象,我们可以为其编写一个或者多个状态机,使其能够在不同状态下有不同的决策和运作机制。 核心思想…...

KETTLE调用http传输中文参数的问题
场景:检查服务器异常(hive)服务,就通过http发送一条短信到手机上,内容类似:【通知】 S T A R T D A T E h i v e 服务检测异常 {START_DATE}_hive服务检测异常 STARTDATEhive服务检测异常{DB_ID}&#…...

Gaussian Splatting 在 Ubuntu22.04 下部署
代码:graphdeco-inria/gaussian-splatting (github) 论文:[2308.04079] 3D Gaussian Splatting for Real-Time Radiance Field Rendering (arxiv.org) 1. 禁用自带驱动 Nouveau Ubuntu 自带的显卡驱动,是非Nvida官方版。在后面装cuda的时候,会报驱动不兼容问题。 1.进入…...

ppt中添加页码(幻灯片编号)及问题解决方案
在幻灯片母版中,选择插入 幻灯片编号 右下角显示幻灯片编号 问题一:母版中没有显示编号 原因可能是母版版式中没有设置显示,勾选即可。 问题二:子母版中没有显示幻灯片 将母版中的编号复制到子母版中。 问题三:应用…...

Flutter 初识:对话框和弹出层
Flutter对话框和弹出层小结 对话框AlertDialog属性解析 showDialog属性解析示例 SimpleDialog示例 AboutDialog属性解析示例 Custom Full-Screen Dialog示例 带动画效果的CustomDialog(showGeneralDialog)属性解析示例 自定义Dialog属性解析示例 输入对话…...

启程与远征Ⅳ--人工智能革命尚未发生
人工智能有望彻底改变工作场所。到目前为止,已经有人工智能工具可以取代或增强每一项工作,并使生产力飞速提升。甚至有许多人预测,文案写作等整个行业将在未来几年内被人工智能工具完全取代。但是,如果你抛开炒作,看看…...

Python教程(十五):IO 编程
目录 专栏列表引言基础概念什么是IO? 同步IO vs 异步IO同步IO(Synchronous IO)异步IO(Asynchronous IO) Python中的IO标准IO标准输入和输出 文件IO文件操作的上下文管理器打开文件读取文件操作内存中的数据 高级文件操…...

Qt窗口交互场景、子窗口数据获取
一、前言 在现代软件开发中,图形用户界面(GUI)的设计不仅仅关乎美观,更在于用户体验和功能的无缝衔接。Qt框架以其强大的跨平台能力和丰富的组件库,成为众多开发者构建GUI应用的首选工具。在Qt应用中,窗口…...
【C++学习笔记 18】C++中的隐式构造函数
举个例子 #include <iostream> #include <string>using String std::string;class Entity{ private:String m_Name;int m_Age; public:Entity(const String& name):m_Name(name), m_Age(-1) {}Entity(int age) : m_Name("UnKnown"), m_Age(age) {}…...

单元训练01:LED指示灯的基本控制
蓝桥杯 小蜜蜂 单元训练01:LED指示灯的基本控制 #include "stc15f2k60s2.h" #include <intrins.h>#define LED(x) \{ \P2 P2 & 0x1f | 0x80; \P0 x; \P2 & 0x1f; \}…...

Sanic 和 Go Echo 对比
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...