cv::normalize()

ops/2024/9/24 7:30:04/

`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。这种处理在图像处理和计算机视觉领域中是常见且必要的预处理步骤。


http://www.ppmy.cn/ops/94891.html

相关文章

[鸿蒙笔记-基础篇_TS语法] Harmony OS

前言:看过的一款黑马的鸿蒙开发视频&#xff0c;讲的不错&#xff0c;有些官方文档也没有细说&#xff0c;整理一些截图方便后续查找和面试复习。 1、数据类型 2、条件语句 3、循环语句 4、函数类型 5、面向对象 6、TS类、函数导入和导出使用方法 后续再做补充

希尔排序,详细解析(附图解)

1.希尔排序思路 希尔排序是一种基于插入排序的算法&#xff0c;通过将原始数据分成若干个子序列&#xff0c;然后对子序列进行插入排序&#xff0c;逐渐减小子序列的间隔&#xff0c;最后对整个序列进行一次插入排序。 1.分组直接插入排序&#xff0c;目标接近有序--------…

龙智Atlassian解决方案实践案例:集成Jira、Confluence、JSM,助力某汽车行业客户实现高效项目管理

客户简介 所属行业&#xff1a;汽车智能网联 用户数&#xff1a;约250人 使用产品/服务&#xff1a;Jira、Confluence、Jira Service Management &#xff08;JSM&#xff09; 解决方案提供商/合作伙伴&#xff1a;龙智 案例背景 该客户专注于车联网系统的研发&#xff0…

无字母数字webshell命令执行

<?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$code)){die("NO.");}eval($code); }else{highlight_file(__FILE__); }限制&#xff1a; 1.webshell长度不超过…

安卓相关环境配置

安卓相关环境配置 偶尔更新。。。 JEB&#xff08;动态调试好用&#xff09; JEB动态调试Smali-真机/模拟器&#xff08;详细&#xff0c;新手必看&#xff09; 夜步城 JADX官网&#xff08;静态分析&#xff09; https://github.com/skylot/jadx/releases/tag/v1.5.0 雷…

LVS--理论+实操

lvs简介 LVS:Linux Virtual Server&#xff0c;负载调度器&#xff0c;内核集成&#xff0c;章文嵩&#xff0c;阿里的四SLB(Server LoadBalance)是基 于LVSkeepalived实现 lvs集群体系结构 工作原理&#xff1a; VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS…

https访问需要怎么操作

其实现在很多细心的朋友都会发现&#xff0c;越来越多的网站在访问时&#xff0c;都是https访问而不是http访问&#xff0c;有人知道https和http有什么区别吗&#xff1f; 其实http访问只是最基础的网站访问方式&#xff0c;在使用浏览器访问时&#xff0c;会显示不安全的提示…

激光测距传感器

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言一、产品原理&#xff1a;二、产品介绍&#xff1a;三、应用特点四、应用案例&#xff1a;1.冶金钢铁板卷材开卷工…