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…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
UE5 音效系统
一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类,将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix,将上述三个类翻入其中,通过它管理每个音乐…...
算法250609 高精度
加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...
Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目
应用场景: 1、常规某个机器被钓鱼后门攻击后,我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后,我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...
