一、知识点
1、OpenCV支持多种数据类型,每种类型都对应着不同的取值范围。 
  (1)、CV_8U取值范围[0, 255]。
  (2)、CV_16U取值范围[0, 65535]。
  (3)、CV_32F取值范围[0, 1]。
  
2、OpenCV提供convertTo()函数来转换数据类型,提供normalize()函数来改变取值范围。

3、void Mat::convertTo(OutputArray dst, int rtype, double alpha, double beta) const
  (1)、Mat成员函数,将Mat对象转换到另一种数据类型。
  (2)、参数说明:
      dst: 输出数组。
      rtype: 输出数组的期望类型,如CV_8UC1、CV_8UC3、CV_32FC3等。
      alpha: 缩放因子,默认值为1,用于乘以输入矩阵的每个元素。
      beta: 偏移量,默认值为0,用于将缩放后的值加上偏移量。

4、void normalize( InputArray src, 
                  InputOutputArray dst, 
                  double alpha = 1, 
                  double beta = 0,
                  int norm_type = NORM_L2, 
                  int dtype = -1, 
                  InputArray mask = noArray());

  (1)、将数组归一化到指定的取值范围。
  (2)、参数说明:
      src: 输入数组。
      dst: 输出数组,其类型和输入数组相同。
      alpha: 归一化后的最小值或缩放系数,具体取决于norm_type。 若为NORM_MINMAX则表示归一化后的最小值; 若为NORM_INF、NORM_L1、NORM_L2则表示缩放系数。
      beta: 归一化后的最大值,仅当norm_type为NORM_MINMAX时有效。
      norm_type: 归一化的方式,cv::NormTypes枚举值,详见5。
      dtype: 为负数时,dst的类型和src相同; 否则,dst的通道数和src相同,但深度为dtype。
      mask: 可选掩码,若不为空,则在指定数组中(非零掩码对应)归一化; 若为空,则在整个数组归一化。
  (3)、注意,norm_type为NORM_MINMAX时,虽然alpha表示最小值,beta表示最大值,但是两值调换也不影响。
      
5、enum NormTypes {
    NORM_INF = 1,
    NORM_L1 = 2,
    NORM_L2 = 4,
    NORM_L2SQR = 5,
    NORM_HAMMING = 6,
    NORM_HAMMING2 = 7,
    NORM_TYPE_MASK = 7, 
    NORM_RELATIVE = 8, 
    NORM_MINMAX = 32 
};

  (1)、常用NORM_INF、NORM_L1、NORM_L2、NORM_MINMAX这四种归一化方式。
  (2)、NORM_L1,所有像素所有通道的值和为1。
      cv::normalize(src, dst, 1.0, 0.0, cv::NORM_L1);
      sum = 2 + 8 + 10 = 20
      2  --->  0.1   (2.0 / 20.0)
      8  --->  0.4   (8.0 / 20.0)
      10 --->  0.5   (10.0 / 20.0)
  (3)、NORM_L2,所有像素所有通道的值求单位向量。 (默认)
      cv::normalize(src, dst, 1.0, 0.0, cv::NORM_L2);
      |v| = 开根号(2 * 2 + 8 * 8 + 10 * 10) = 开根号(168) = 12.96
      2  --->  0.15   (2.0 / 12.96)
      8  --->  0.62   (8.0 / 12.96)
      10 --->  0.77   (10.0 / 12.96)
  (4)、NORM_INF,每个值除以所有像素所有通道的最大值。
      cv::normalize(src, dst, 1.0, 0.0, cv::NORM_INF);
      Max = 10
      2  --->  0.2   (2.0 / 10.0)
      8  --->  0.8   (8.0 / 10.0)
      10 --->  1.0   (10.0 / 10.0)
  (5)、NORM_MINMAX (常用)
      cv::normalize(src, dst, 0.0, 1.0, cv::NORM_MINMAX);
      alpha = 0.0, beta = 1.0, 归一化范围[0.0, 1.0],简记为[a, b]
      找到样本数据最小值Min = 2, 最大值Max = 10
      计算系数k = (b - a) / (Max - Min) = 1.0 / 8.0 = 0.125
      归一化值 = a + k * (当前值 - Min)
      2  --->  0.0   (0.0 + 0.125 * (2 - 2))
      8  --->  0.75  (0.0 + 0.125 * (8 - 2))
      10 --->  1.0   (0.0 + 0.125 * (10 - 2))
      
6、注意:
  (1)、将CV_8UC3转换为CV_32FC3,8U取值范围[0, 255],32F取值范围[0.0, 1.0],如果不归一化,imshow会显示几乎全白图像。
  (2)、将CV_8UC3图像不转换类型,直接归一化,imshow会显示全黑图片。
  
  
  
二、示例代码

#include <iostream>
#include <opencv2/opencv.hpp>int main()
{//自定义src1,CV_8UC3类型的src1转为CV_32FC3类型的dst1,类型值改变但是元素值不变cv::Mat src1 = cv::Mat::zeros(3, 3, CV_8UC3);src1 = cv::Scalar(45, 60, 80);std::cout << "src1 type = " << src1.type() << std::endl << src1 << std::endl;cv::Mat dst1;src1.convertTo(dst1, CV_32FC3, 1.0, 0.0);std::cout << "dst1 type = " << dst1.type() << std::endl << dst1 << std::endl;//NORM_L1, 所有像素所有通道的值求和为1cv::Mat dst2;cv::normalize(dst1, dst2, 1.0, 0.0, cv::NORM_L1);std::cout << "dst2 type = " << dst2.type() << std::endl << dst2 << std::endl;//NORM_L2, 所有像素所有通道的值求单位向量cv::Mat dst3;cv::normalize(dst1, dst3, 1.0, 0.0, cv::NORM_L2);std::cout << "dst3 type = " << dst3.type() << std::endl << dst3 << std::endl;//NORM_INF, 每个值除以所有像素所有通道的最大值cv::Mat dst4;cv::normalize(dst1, dst4, 1.0, 0.0, cv::NORM_INF);std::cout << "dst4 type = " << dst4.type() << std::endl << dst4 << std::endl;//NORM_MINMAXcv::Mat dst5;cv::normalize(dst1, dst5, 0.0, 1.0, cv::NORM_MINMAX);std::cout << "dst5 type = " << dst5.type() << std::endl << dst5 << std::endl;//src2是读取的图像cv::Mat src2 = cv::imread("../images/6.png");if (src2.empty()){std::cout << "load src2 image error..." << std::endl;return -1;}cv::imshow("原始图像", src2);//CV_8UC3转为32FC3,值没有变化,但是显示会非常白的图片src2.convertTo(src2, CV_32FC3);cv::imshow("类型转换", src2);//NORM_L1,结果值太小,图像显示黑色cv::Mat dst6;cv::normalize(src2, dst6, 1.0, 0.0, cv::NORM_L1);cv::imshow("NORM_L1", dst6);//NORM_L2,结果值太小,放大100倍,图像能显示出来cv::Mat dst7;cv::normalize(src2, dst7, 100.0, 0.0, cv::NORM_L2);cv::imshow("NORM_L2", dst7);//NORM_INFcv::Mat dst8;cv::normalize(src2, dst8, 1.0, 0.0, cv::NORM_INF);cv::imshow("NORM_INF", dst8);//NORM_MINMAXcv::Mat dst9;cv::normalize(src2, dst9, 1.0, 0.0, cv::NORM_MINMAX);cv::imshow("NORM_MINMAX", dst9);//src3和src2读取一样的原始图片, 但如果不转换类型,直接归一化,会显示全黑的图片cv::Mat src3 = cv::imread("../images/6.png");if (src3.empty()){std::cout << "load src3 image error..." << std::endl;return -1;}cv::Mat dst10;cv::normalize(src3, dst10, 1.0, 0.0, cv::NORM_MINMAX);cv::imshow("直接归一化", dst10);cv::waitKey(0);return 0;
}

  输出结果:

src1 type = 16
[ 45,  60,  80,  45,  60,  80,  45,  60,  80;45,  60,  80,  45,  60,  80,  45,  60,  80;45,  60,  80,  45,  60,  80,  45,  60,  80]
dst1 type = 21
[45, 60, 80, 45, 60, 80, 45, 60, 80;45, 60, 80, 45, 60, 80, 45, 60, 80;45, 60, 80, 45, 60, 80, 45, 60, 80]
dst2 type = 21
[0.027027028, 0.036036037, 0.048048049, 0.027027028, 0.036036037, 0.048048049, 0.027027028, 0.036036037, 0.048048049;0.027027028, 0.036036037, 0.048048049, 0.027027028, 0.036036037, 0.048048049, 0.027027028, 0.036036037, 0.048048049;0.027027028, 0.036036037, 0.048048049, 0.027027028, 0.036036037, 0.048048049, 0.027027028, 0.036036037, 0.048048049]
dst3 type = 21
[0.13678823, 0.1823843, 0.24317907, 0.13678823, 0.1823843, 0.24317907, 0.13678823, 0.1823843, 0.24317907;0.13678823, 0.1823843, 0.24317907, 0.13678823, 0.1823843, 0.24317907, 0.13678823, 0.1823843, 0.24317907;0.13678823, 0.1823843, 0.24317907, 0.13678823, 0.1823843, 0.24317907, 0.13678823, 0.1823843, 0.24317907]
dst4 type = 21
[0.5625, 0.75, 1, 0.5625, 0.75, 1, 0.5625, 0.75, 1;0.5625, 0.75, 1, 0.5625, 0.75, 1, 0.5625, 0.75, 1;0.5625, 0.75, 1, 0.5625, 0.75, 1, 0.5625, 0.75, 1]
dst5 type = 21
[2.4214387e-08, 0.42857146, 1, 2.4214387e-08, 0.42857146, 1, 2.4214387e-08, 0.42857146, 1;2.4214387e-08, 0.42857146, 1, 2.4214387e-08, 0.42857146, 1, 2.4214387e-08, 0.42857146, 1;2.4214387e-08, 0.42857146, 1, 2.4214387e-08, 0.42857146, 1, 2.4214387e-08, 0.42857146, 1]

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

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

相关文章

机器学习算法_支持向量机

一、支持向量机 支持向量机只能做二分类任务 SVM全称支持向量机&#xff0c;即寻找到一个超平面使样本分成两类&#xff0c;且间隔最大 硬间隔&#xff1a;如果样本线性可分&#xff0c;在所有样本分类都正确的情况下&#xff0c;寻找最大间隔&#xff1b;如果出现异常值或样…

Linux : echo ~ tail 重定向符

&#x1f680; Linux 常用命令详解&#xff1a;echo、tail 与重定向符号全解析&#xff08;含通俗案例&#xff09; &#x1f4c5; 更新时间&#xff1a;2025年6月17日 &#x1f3f7;️ 标签&#xff1a;Linux基础 | Shell命令 | echo | tail | 输出重定向 | Linux入门 文章目录…

uniapp的更新流程【安卓、IOS、热更新】

UniApp应用更新方案 两种更新方式 APP全量升级&#xff1a;需要重新下载安装包热更新&#xff1a;通过下载wgt资源包实现&#xff0c;用户只需重启应用 Android更新实现 用户需要授权安装权限&#xff0c;流程为下载APK后自动弹出安装界面 var dtask plus.downloader.cre…

火山引擎解码生态型增长铁律

“技术流量与力量的崛起&#xff0c;本质上是一场生态规模的竞赛。每次浪潮的排头兵&#xff0c;都是指尖沾着代码的开发者——互联网时代的Linux社区让开源席卷全球&#xff0c;移动互联网的App Store催生百万开发者&#xff0c;而今天&#xff0c;大模型正在用API重构产业。”…

警惕GO的重复初始化

go的初始化方式有很多种&#xff0c;在某些情况下容易引起重复初始化导致错误。 事例如下&#xff1a; 当使用gorm连接数据库时定义了全局DB var DB *gorm.DB 但是在后面某个函数内部初始化时导致DB重新初始化变成了局部变量&#xff0c;导致原来的全局变量DB还是nil func I…

python校园服务交流系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…

AlexNet:图像分类领域的里程碑网络及其创新剖析

文章目录 前言AlexNet一、网络的背景二、网络结构三、网络的创新3.1 首次使用GPU训练网络3.2 使用Relu激活函数3.2.1 sigmoid激活函数和tanh激活函数3.2.1.1 sigmoid激活函数3.2.1.2 tanh激活函数 3.3 Relu激活函数3.4 使用LRN局部响应归一化(已弃用)3.4.1 LRN的定义与起源3.4.…

iOS性能调优实践:结合KeyMob等多个工具提升应用稳定性与流畅度

在iOS应用开发中&#xff0c;性能问题往往难以通过单一工具轻松解决。尤其是当App面临用户反馈的流畅度差、卡顿严重、内存泄漏等问题时&#xff0c;开发者需要依靠多种工具的组合&#xff0c;才能有效地排查和优化性能瓶颈。 在我们最近的一个项目中&#xff0c;开发团队在处…

球形波方程的推导与解法

题目 问题 6. 一个球形波是三维波动方程的解,形式为 u ( r , t ) u(r,t) u(r,t),其中 r r r 是到原点的距离(球坐标)。波动方程的形式为: u t t = c 2 ( u r r + 2 r u r ) (球形波方程) . u_{tt} = c^{2} \left( u_{rr} + \frac{2}{r} u_{r} \right) \quad \text{(球形…

自动打电话软件设计与实现

文章目录 方案概述实现代码1. 安装必要的库2. 主程序代码3. HTML模板 (templates/index.html) 功能说明部署说明扩展功能建议注意事项 方案概述 使用Twilio的API进行电话呼叫实现基本的呼叫逻辑添加简单的用户界面 实现代码 1. 安装必要的库 pip install twilio flask2. 主…

RedissonLock源代码分析与锁应用

文章目录 前言一、RedissonLock源代码分析1.1 尝试加锁2.2 解锁 二、锁业务应用1.服务层方法注解方式 注入锁1.1 定义DistributedLock 注解类1.2 定义DistributedLockAspect 切片类1.3 尝试获取锁代码片断1.4 释放锁代码片断1.5 服务层注入锁注解 2.代码行加锁2.1 pom.xml文件引…

深入理解mysql索引

一、什么是索引&#xff1f; 索引&#xff08;Index&#xff09; 是数据库管理系统中一种特殊的数据结构&#xff0c;存储在磁盘上。它包含对数据表中一列或多列的值进行排序&#xff0c;并存储了指向表中实际数据行物理位置或主键值的引用指针。可以把它类比为书籍的目录&…

VMware vSphere Foundation 9.0 技术手册 —— Ⅰ 安装 ESXi 9.0 (虚拟机)

目录 1. 安装 ESXi 9.0 (虚拟机)&#xff08;1&#xff09;ESXi Standard Boot Menu&#xff08;2&#xff09;ESXi 安装导向&#xff08;3&#xff09;最终用户许可协议&#xff08;4&#xff09;选择系统盘&#xff08;5&#xff09;选择键盘类型&#xff08;6&#xff09;设…

UE5 游戏模板 —— TopDownGame 俯视角游戏

UE5 游戏模板 —— TopDownGame 俯视角游戏 前言一、模块导入二、TopDownGameMode三、TopDownPlayerController1、构造函数2、SetupInputComponent初始化新输入系统处理输入逻辑 四、TopDownCharacter五、射线检测总结 前言 上一篇文章介绍了一下PuzzleGame模板的流程&#xf…

基于深度学习的智能图像分割系统:技术与实践

前言 图像分割是计算机视觉领域中的一个核心任务&#xff0c;其目标是将图像划分为多个有意义的区域或对象。图像分割在医学影像分析、自动驾驶、安防监控等多个领域有着广泛的应用。近年来&#xff0c;深度学习技术&#xff0c;尤其是卷积神经网络&#xff08;CNN&#xff09;…

【学习笔记】2.2 Encoder-Decoder

参考资料&#xff1a;https://github.com/datawhalechina/happy-llm 在 Transformer 中&#xff0c;使用注意力机制的是其两个核心组件——Encoder&#xff08;编码器&#xff09;和 Decoder&#xff08;解码器&#xff09;。 2.2.1 Seq2Seq 模型 Seq2Seq&#xff08;序列到…

# 材料力学押题

材料力学押题 文章目录 材料力学押题第一题第二题组合变形弯曲变形 第一题 Q 求力作用的销钉位置的竖直偏移距离。 S 方法一:能量方法 材料应变能计算为: U ∫ 内力 2 2 刚度 d A U\int \frac{\text{内力}^2}{2\times 刚度}\text{d}A U∫2刚度内力2​dA 克拉珀龙原理&…

uniapp项目之小兔鲜儿小程序商城(一) 项目介绍,技术栈,小程序的基础架构,封装拦截器和请求函数

文章目录 一.项目介绍和前置内容1.重要链接2.技术栈 二.创建uniapp项目1.使用HBuilderX创建2.使用命令行创建3.如何使用vscode开发uniapp项目?step1:把项目拉入vscode,开始下相关插件step2:ts类型校验step3:设置json文件可以允许注释 4.pages.json文件的作用是什么?5.示例:在…

Uniapp H5端SEO优化全攻略:提升搜索引擎排名与流量

在移动互联网时代&#xff0c;H5页面因其跨平台、低成本、易传播的特性&#xff0c;成为许多企业的首选。Uniapp作为一款优秀的前端跨端开发框架&#xff0c;能够快速开发H5、小程序、App等多端应用。然而&#xff0c;由于Uniapp默认采用SPA&#xff08;单页应用&#xff09;架…

一[3.3]、ubuntu18.04环境 利用 yolov8 实现列车轨道检测,并提取正确的轨道线【全网最详细】

一、参考文献 https://blog.csdn.net/u010117029/category_12977729.html 一[3.2]、ubuntu18.04环境 利用 yolov8 训练开源列车数据集,并实现列车轨道检测【全网最详细】-CSDN博客 火车轨道铁路轨道检测识别(附带Python源码+详细解析)_轨道点云提取铁轨代码-CSDN博客