opencv中的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() 
  )

Parameters

src 原始数组(向量)或者矩阵(将其展开当作数组).
dst 归一化后的结果
alpha 要归一化的范数值 或者为范围归一化的下边界
beta 范围归一化的的下边界,在范数归一化时不会使用
norm_type 归一化类型,有NORM_INF(无穷范数),NORM_L1(1范数), NORM_INFL2(2范数),NORM_MINMAX(范围归一化)
dtype 为负值时,输出数据类型和输入数据类型一致,否则 和src通道一致,depth =CV_MAT_DEPTH(dtype).
mask 可选的MASK

注意:   对于多通道数据,normalize()函数直接将其按内存中的顺序展开为数组,及当作一个向量进行处理。

实例:

vector<double> positiveData = { 2.0, 8.0, 10.0 };
vector<double> normalizedData_l1, normalizedData_l2, normalizedData_inf, normalizedData_minmax;

范数归一化:

1.    1范数:

// sum(numbers) = 20.0
// 2.0 0.1 (2.0/20.0)
// 8.0 0.4 (8.0/20.0)
// 10.0 0.5 (10.0/20.0)
normalize(positiveData, normalizedData_l1, 1.0, 0.0同上最终归一化的值为单位向量的每个值乘以参数要归一化的范数值alpha。, NORM_L1);

直接求和后算出每一个算数比上总和的比值,加起来总为1。这里要归一化的范数值为1.0,所求出的比值即为最后归一化后的值,若归一化范数值alpha为2.0,则每个比值分别乘以2.0即得到最后归一化后的结果为0.2, 0.8, 1.0,以此类推。

2.   2范数:

// Norm to unit vector: ||positiveData|| = 1.0
// 2.0 0.15
// 8.0 0.62
// 10.0 0.77
normalize(positiveData, normalizedData_l2, 1.0, 0.0, NORM_L2);

即将该向量归一化为单位向量,每个元素值除以该向量的模长。同上最终归一化的值为单位向量的每个值乘以参数要归一化的范数值alpha。

3.   无穷范数

// Norm to max element
// 2.0 0.2 (2.0/10.0)
// 8.0 0.8 (8.0/10.0)
// 10.0 1.0 (10.0/10.0)
normalize(positiveData, normalizedData_inf, 1.0, 0.0, NORM_INF);

每个值除以最大值来进行无穷范数归一化。同上最终归一化的值为单位向量的每个值乘以参数要归一化的范数值alpha。

范围归一化:

// Norm to range [0.0;1.0]
// 2.0 0.0 (shift to left border)
// 8.0 0.75 (6.0/8.0)
// 10.0 1.0 (shift to right border)
normalize(positiveData, normalizedData_minmax, 1.0, 0.0, NORM_MINMAX);

注意:按参数说明,上面例子参数中的1.0和0.0应该换下顺序,但做了几组试验的结果是这两个值的顺序并不会影响最终的结果,应该是函数内部对其又进行排序。

范围归一化是将原始数组(假设最大值为n,最小值为m)的元素,范围为[m,n],映射到新的范围[alpha, beta]中去,具体映射关系即为新旧数据在各自范围中所占比例一致。假设原始数组中某一元素值为p,对应新数组中为q,则有一下关系:

(n-p)/(p-m) = (beta-q)/(q-alpha);

注意: 使用normalize()后,一般数据都为浮点型数据,opencv中的图像数据类型为uchar,因此,一般若是对图像进行归一化处理后都需要后面紧跟convertScaleAbs()进程转换。

void cv::convertScaleAbs(InputArray src,OutputArray dst,double alpha = 1,double beta = 0 );

dst(I) = saturate_cast<uchar>(|src(I)*alpha + beta|)

saturate_cast<uchar>(data)等同于:

if (data < 0)

data = 0;

else if (data > 255)

data = 255;

opencv normalize()函数详解相关推荐

  1. opencv imshow函数详解

    前言 使用opencv对图像进行处理之后,通常调用imshow函数来显示处理结果.但是,我们经常会发现显示结果和我们预期的结果有些差别.这是由于opencv经常会涉及到对多种图像数据类型的处理,如果我 ...

  2. opencv reshape函数详解

    在opencv中,reshape函数比较有意思,它既可以改变矩阵的通道数,又可以对矩阵元素进行序列化,非常有用的一个函数. 函数原型: C++: Mat Mat::reshape(int cn, in ...

  3. opencv warpAffine()函数详解 -- 图像旋转与平移

    简述 仿射变换是二维坐标间的线性变换,故而变换后的图像仍然具有原图的一些性质,包括"平直性"以及"平行性",常用于图像翻转(Flip).旋转(Rotations ...

  4. Opencv imshow 函数详解

    官方文档:imshow.namedWindow等 本来想看看imshow的窗口是否可以隐藏菜单栏,看完官方文档感觉是不可以了. imshow imshow的输入参数如下: void cv::imsho ...

  5. 图像处理笔记(2)---- OpenCV imread函数详解

    imread()读取图片文件,imread函数有两个参数,第一个参数是图片路径,第二个参数表示读取图片的形式,有三种: cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数,可以直接写1. ...

  6. Opencv中的imshow函数详解

    前言 使用opencv对图像进行处理之后,通常调用imshow函数来显示处理结果.但是,我们经常会发现显示结果和我们预期的结果有些差别.这是由于opencv经常会涉及到对多种图像数据类型的处理,如果我 ...

  7. OpenCV 图像卷积:cv.filter2D() 函数详解

    API 照例,我们搬一下官网的 API: C++ void cv::filter2D(InputArray src,OutputArray dst,int ddepth,InputArray kern ...

  8. OpenCV 图像缩放:cv.resize() 函数详解

    目录 系列前言 API 函数详解 参数列表 缩放方式其一 缩放方式其二 两种方式的优先级 关于插值方式 扩展 -- 相关函数 系列前言 这个系列是我第一个想要更下去的系列.每篇会全面介绍一个 Open ...

  9. 【OpenCV 4开发详解】方框滤波

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  10. 【OpenCV 4开发详解】直方图应用

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

最新文章

  1. 转:初学者简易 .vimrc编写指南
  2. arthas命令使用示例:watch
  3. 刚刚,阿里开源了一系列重磅技术炸弹!| 程序员必看
  4. 挂代理无法访问网页了怎么办_微信H5网页授权
  5. 最长回文子串Python解法
  6. Avalonia跨平台入门第三篇之Popup
  7. steam一键授权工具_半个东的时间让你省了一个亿 Steam免费游戏一键领取
  8. python批量生成图_利用Python批量生成任意尺寸的图片
  9. Opencv--bitwise_and、bitwise_not等图像基本运算及掩膜
  10. .NET开发 正则表达式中的 Bug
  11. TCP协议(标志位URG、PSH,定时器,连接的建立和断开)
  12. 华为9x升级鸿蒙,荣耀9X升级鸿蒙2.0系统截图曝光:4G内存流畅度照样起飞!
  13. Springboot入门1
  14. 移动通信网络演进之路
  15. 三菱PLC缓冲表操作
  16. uniapp 开发小程序对象传递数据结构封装一层$orig,使组件中v-model绑定value失效
  17. 安全L2-1.4-安全术语介绍
  18. 理论篇:如何理解51%攻击
  19. JTextField:单行文本框组件
  20. 百度输入法android+4.8,百度输入法Android v7.6来了 翻译功能上线助力跨国沟通

热门文章

  1. 系统加速批处理文件:清理无用共享、内存及系统垃圾
  2. 【Selenium IDE】下载安装Chrome和Firefox插件IDE
  3. 变分自编码(VAE)及代码解读
  4. vue element 项目 表单校验 保姆级教程 纳税人识别号 公司电话传真 银行卡校验(包含注意点)
  5. Lagrange’s Mean Value Theorem - 拉格朗日中值定理
  6. 桌面虚拟化 VMware Horizon_view 7 安装及管理手册
  7. pandas中category类型的数据处理
  8. 简单介绍 内网与外网IP地址,域名,子网掩码,网关与路由器,ping
  9. App上实现用户手写签名保存为透明PNG格式图片
  10. RESTful及其特点