建立收费网站,新媒体营销概念,18款未成年禁止下载的app,天堂呦呦OpenCV的函数normalize()的两个作用:调整矩阵的值范围(归一化处理)、规范化矩阵的范数为某个值
函数normalize()有两个原型: 原型一#xff1a;
void cv::normalize(InputArray src,InputOutputArray dst,double alpha 1,double beta 0,int norm_type NORM_L2,int d…OpenCV的函数normalize()的两个作用:调整矩阵的值范围(归一化处理)、规范化矩阵的范数为某个值
函数normalize()有两个原型: 原型一
void cv::normalize(InputArray src,InputOutputArray dst,double alpha 1,double beta 0,int norm_type NORM_L2,int dtype -1,InputArray mask noArray() ) dstcv.normalize(src, dst[, alpha[, beta[, norm_type[, dtype[, mask]]]]])原型二
void cv::normalize(const SparseMat src,SparseMat dst,double alpha,int normType ) dstcv.normalize(src, dst[, alpha[, beta[, norm_type[, dtype[, mask]]]]])原型一的适用对象是密集矩阵通常我们的矩阵都是密集矩阵。 原型二的适用对象是稀疏矩阵在这篇博文中暂不作介绍。
在介绍各参数的意义前先说下函数normalize()的作用。
函数normalize()有两个作用 第一个作用规范化矩阵的范数为某个值 第二个作用规范化矩阵的值范围即我们常说的对矩阵进行归一化处理。
究竟函数normalize()发挥什么作用这取决于参数norm_type取什么值。
当它起第一个作用时即用于规范化矩阵的范数为某个值时它通过线性缩放和平移操作实现如下目标 当pInf时对应的参数normType取值为NORM_INF 当p1时对应的参数normType取值为NORM_L1 当p2时对应的参数normType取值为NORM_L2 关于参数normType取值为NORM_INF、NORM_L1、NORM_L2时函数究竟对原矩阵作了怎样的操作 请参看本博文的原文本博文的原文链接 https://www.hhai.cc/thread-214-1-1.html
当它起第二个作用时即对矩阵进行归一化处理时它通过线性缩放和平移操作实现如下目标 即此时函数normalize()会把原矩阵中的值范围从[min(src), max(src)]按比例线性变换到[alpha, beta]的范围。
根据上面的这个目标可知实现的具体数学表达式如下 根据上式可以得到dst(i,j)的表达式如下 有了上面的准备知识后接下来开始介绍其原型一各参数的意义这里再把原型一复制如下
void cv::normalize(InputArray src,InputOutputArray dst,double alpha 1,double beta 0,int norm_type NORM_L2,int dtype -1,InputArray mask noArray() ) 各参数意义如下 src—输入矩阵。 dst—输出矩阵。 alpha—在第一个作用中它表示目标范数值(Norm Value)在第二个作用中函数normalize()会把原矩阵中的值范围从[min(src), max(src)]按比例线性变换到[alpha, beta]的范围。 beta—在第一个作用中此参数没有作用是一个无效参数。在第二个作用的情况中函数normalize()会把原矩阵中的值范围从[min(src), max(src)]按比例线性变换到[alpha, beta]的范围。 norm_type—这个参数决定了函数normalize()对输入矩阵作哪种规范化操作。其可取值如下表所示 我们常常用这个函数对矩阵进行归一化处理即上面说的第二个作用此时norm_type取NORM_MINMAX。 当norm_type取NORM_MINMAX时需要注意两点 ①当norm_typeNORM_MINMAX时矩阵src只能为密集矩阵。 ②当有掩码矩阵参数时它是在掩码矩阵所选取的子矩阵上进行操作包括最大值最小值的选取也是在子矩阵的范围内而不是整个原矩阵的范围内进行最大值最小值的选取。
在上面的norm_type取值表中NORM_INF、NORM_L1、NORM_L2、NORM_L2SQR 情况下都存在src2的情况可是函数normalize()并没有两个输入参数啊这是怎么回事呢 是因为并不是只有函数normalize()取这些枚举值其它函数也会取这些枚举值比如norm()的参数也需要取这些枚举值。norm()的OpenCV4.4.0官方文档链接:https://docs.opencv.org/4.4.0/d2/de8/group__core__array.html#ga55a581f0accd8d990af775d378e7e46c
dtype—输出矩阵的数据类型当它为负值时和输入矩阵的数据类型一样。否则按它指定的数据类型生成输出矩阵。 mask—操作掩码矩阵。如果操作掩码矩阵存在则掩码值为0的矩阵元素不参与运算掩码值为1矩阵元素参与运算。
接下来上示例代码
首先是利用函数normalize()将原矩阵的范数规范化为某个值的Python代码
# -*- coding: utf-8 -*-
# 出处昊虹AI笔记网(hhai.cc)
# 用心记录计算机视觉和AI技术# 博主微信/QQ 2487872782
# QQ群 271891601
# 欢迎技术交流与咨询# OpenCV的版本为4.4.0import cv2 as cv
import numpy as npA np.array([[1, 2, 4],[8, 16, 32]], dtypeint8)B1 A.copy()
B2 A.copy()
B3 A.copy()alpha1 100# 将矩阵A的所有元素的最大绝对值调整为参数alpha1的值
cv.normalize(A, B1, alpha1, norm_typecv.NORM_INF)# 将矩阵A的所有元素的绝对值之和调整为参数alpha1的值
cv.normalize(A, B2, alpha1, norm_typecv.NORM_L1)# 将矩阵A的所有元素绝对值的平方和进行开方后的值调整为参数alpha1的值
cv.normalize(A, B3, alpha1, norm_typecv.NORM_L2)
运行结果如下 对上面运行结果的说明和验证 请参看本博文的原文 本博文的原文链接如下 https://www.hhai.cc/thread-214-1-1.html
然后是利用函数normalize()将原矩阵的值归一化到某个区间的Python代码
# -*- coding: utf-8 -*-
# 出处昊虹AI笔记网(hhai.cc)
# 用心记录计算机视觉和AI技术# 博主微信/QQ 2487872782
# QQ群 271891601
# 欢迎技术交流与咨询# OpenCV的版本为4.4.0import cv2 as cv
import numpy as np# 注意矩阵A的数据类型设置为uint8
# 昊虹君测试过如果设置为int8,得不到想要的结果
A np.array([[1, 2, 4],[8, 16, 32]], dtypeuint8)B1 A.copy()alpha1 100
beta1 200# 将矩阵A的元素值范围调整到区间[alpha1 beta1]
cv.normalize(A, B1, alpha1, beta1, norm_typecv.NORM_MINMAX)
运行结果如下