引言


图像是由像素组成的。黑白图像是单个像素矩阵,而彩色图像中每个颜色通道都有单独的像素矩阵,比如:红色,绿色,蓝色等颜色通道。

像素值为0~255范围内的整数。虽然可以直接将原图像的像素数据直接作为神经网络模型的训练数据,但可能给模型的训练过程带来一些问题,例如导致模型训练速度变慢。

而在模型训练前对图像的像素值做预处理,能避免很多不必要的麻烦,例如将像素值缩放到0-1之间。

归一化是一种数理统计中常用的数据预处理手段,在机器学习中归一化通常将数据向量每个维度的数据映射到(0,1)或(-1,1)之间的区间或者将数据向量的某个范数映射为1,归一化好处有两个:

  1. 消除数据单位的影响:其一可以将有单位的数据转为无单位的标准数据,如成年人的身高150-200cm、成年人体重50-90Kg,身高的单位是厘米而体重的单位是千克,不同维度的数据单位不一样,造成原始数据不能直接代入机器学习中进行处理,所以这些数据经过特定方法统一都映射到(0,1)这个区间,这样所有数据的取值范围都在同一个区间里的。
  2. 可提深度学习模型收敛速度: 如果不进行归一化处理,假设深度学习模型接受的输入向量只有两个维度x1和x2,其中X1取值为0-2000,x2取值为0-3。这样数据在进行梯度下降计算时梯度时对应一个很扁的椭圆形,很容易在垂直等高线的方向上走大量的之字形路线,是的迭代计算量大且迭代的次数多,造成深度学习模型收敛慢。

归一化的作用与定义


归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。

首先归一化是为了后面数据处理的方便,其次是保证程序运行时收敛加快。归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在某个区间上是统计的坐标分布。归一化有同一、统一和合一的意思。

归一化的目的,是使得没有可比性的数据变得具有可比性,同时又保持相比较的两个数据之间的相对关系,如大小关系;或是为了作图,原来很难在一张图上作出来,归一化后就可以很方便的给出图上的相对位置等。

像素归一化


首先,需要知道的是,对于大多数图像数据,像素值是介于0和255之间的整数。

在深度神经网络训练时一般使用较小的权重值来进行拟合,而当训练数据的值是较大整数值时,可能会减慢模型训练的过程。因此,一般需要图像的像素进行归一化,使得图像的每个像素值都在0-1之间。当图像的像素处于0-1范围时,由于任然介于0~255之间,所以图像依旧是有效的,并且可以正常查看图像。

像素的归一化可以通过将所有像素值除以最大像素值来实现,最大像素值一般为255。需要注意的是,不管图片是单通道的黑白图片还是多通道的彩色图片,都可以使用这种方法;不管图片的最大像素值是否有255,都除以255

像素的归一化可以总结如下,这也是机器学习中一般的归一化方法,只不过像素归一化中X_min为0,忽略了这一项。

x= (x−X_min)(X_max−X_min)\frac{(x-X\_min)}{(X\_max-X\_min)}(X_max−X_min)(x−X_min)​

OpenCV中提供的归一化方法


  • NORM_MINMAX------最常用
  • NORM_INF
  • NORM_L1
  • NORM_L2

NORM_L1归一化

  • 归一化数组的L1-范数(绝对值的和)

  • L1范数(L1 norm)是指向量中各个元素绝对值之和,也有个美称叫“稀疏规则算子”(Lasso regularization)。

    比如 向量 , 那么A的L1范数为|1|+|-1|+|3|=5

  • 依据:和为1

    2.0+8.0+10.0=20
    2.0 0.1
    8.0 0.4
    10.0 0.5

L2 归一化

  • 归一化数组的(欧几里德)L2-范数

  • 依据:单位向量为1,也即是每个数除以根号下所有数的平方和)

  • 优势:
    经过L2范数归一化后,一组向量的欧式距离和它们的余弦相似度可以等价。

    2.0 0.15
    8.0 0. 62
    10.0 0.77

NORM_INF 归一化

  • 归一化数组的C-范数(绝对值的最大值)

  • 依据是:最大值

    2.0 0.2
    8.0 0. 8
    10.0 1.0

NORM_MINMAX 归一化

  • 数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。

  • 依据是:delta=max-min,也即最小值为0,最大值为1。

    2.0 0.0
    8.0 0. 75
    10.0 1.0

OpenCV提供的归一化函数


void normalize(InputArray src, InputOutputArray dst,double alpha = 1, double beta = 0, int norm_type = NORM_L2, int dtype = -1,        InputArray mask = noArray());
src:输入待处理数组
dst:与src大小相同的输出数组
alpha:可以用来规范值,也可以用来规范范围,并且是范围的下限。
beta:用来规范范围,并且是范围的上线。
norm_type:规范化类型
dtype:dtype为负数时,输出数组的type与输入数组的type相同;否则,输出数组与输入数组只是通道数相同,而tpye=CV_MAT_DEPTH(dtype)。
mask:操作掩膜,选择感兴趣区域,选定后只能对该区域进行操作。用于指示函数是否仅仅对指定的元素进行操作。

归一化公式


  • 线性函数转换:norm_type=NORM_MINMAX

    if mask(i,j)!=0
          dst(i,j)=(src(i,j)−min(src))∗(b′−a′)max(src)−min(src)\frac{(src(i,j)-min(src))*(b'-a')}{max(src)-min(src)}max(src)−min(src)(src(i,j)−min(src))∗(b′−a′)​+a’
    else
          dst(i,j)=src(i,j)

    其中b’=MAX(alpha,beta),a’=MIN(alpha,beta);

  • 当norm_type!=NORM_MINMAX:
    if mask(i,j)!=0
         dst(i,j)=src(i,j)∗alphanorm(src,norm_type,mask)\frac{src(i,j)*alpha}{norm(src,norm\_type,mask)}norm(src,norm_type,mask)src(i,j)∗alpha​;
    else
        dst(i,j)=src(i,j);
    其中norm的功能是:计算norm(范数)的绝对值

    即有:

  1. NORM_INF:
    dst(i,j)=src(i,j)Max∣src(x,y)∣\frac{src(i,j)}{Max|src(x,y)|}Max∣src(x,y)∣src(i,j)​
  2. NORM_L1:
    dst(i,j)=src(i,j)∣∑src(x,y)∣\frac{src(i,j)}{|\sum{src(x,y)|}}∣∑src(x,y)∣src(i,j)​
  3. NORM_L2:
    dst(i,j)=src(i,j)∑(src(x,y)2)\frac{src(i,j)}{\sqrt{\sum{(src(x,y)^2)}}}∑(src(x,y)2)​src(i,j)​

// 读取一张灰度图像Mat src = imread("D:/test/src1.jpg", IMREAD_GRAYSCALE);if (src.empty()) {cout << "could not load image.." << endl;return -1;}imshow("src", src);Mat gray_f;// 转换为浮点数类型数组src.convertTo(gray_f, CV_32F);cout << "gray_f" << gray_f << endl;// NORM_MINMAX 归一化,根据delta = max - min = 8.0// 归一化到[alpha, beta],即[1.0, 0]// 2.0     0.0     ((2.0 - 2.0)/8.0)// 8.0     0.75    ((8.0 - 2.0)/8.0)// 10.0        1.0     ((10.0 - 2.0)/8.0)Mat dst = Mat::zeros(gray_f.size(), CV_32FC1);normalize(gray_f, dst, 1.0, 0, NORM_MINMAX);Mat result = dst * 255;result.convertTo(dst, CV_8UC1);imshow("NORM_MINMAX", dst);// NORM_INF 归一化,根据最大值// 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(gray_f, dst, 1.0, 0, NORM_INF);result = dst * 255;result.convertTo(dst, CV_8UC1);imshow("NORM_INF", dst);// NORM_L1 归一化,依据和为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(gray_f, dst, 1.0, 0, NORM_L1);result = dst * 10000000;result.convertTo(dst, CV_8UC1);imshow("NORM_L1", dst);// NORM_L2 归一化,根据单位向量为1// ||positiveData|| = sqrt(2.0*2.0 + 8.0*8.0 + 10.0*10.0) = 12.96// 2.0       0.15            (2.0/12.96)// 8.0       0.62            (8.0/12.96)// 10.0      0.77            (10.0/12.96)normalize(gray_f, dst, 1.0, 0, NORM_L2);result = dst * 10000;result.convertTo(dst, CV_8UC1);imshow("NORM_L2", dst);

学习:
opencv中归一化函数normalize()的原理讲解
OpenCV-Day-011:像素归一化
OpenCV4.0入门(11)像素归一化

OpenCV--011:像素归一化相关推荐

  1. opencv学习-011-图像像素归一化(normalize)

    opencv学习-011-图像像素归一化(normalize) #include <opencv2/opencv.hpp> #include <iostream>using n ...

  2. opencv像素归一化解释

    转载自:https://blog.csdn.net/Pierce_KK/article/details/90489397 图像的像素归一化是一个图像的预处理过程. 众所周知图像是由像素组成的,灰度图是 ...

  3. Tensorflow2实现像素归一化与频谱归一化

    Tensorflow2实现像素归一化与频谱归一化 前言 像素归一化 像素归一化详解 像素归一化实现 频谱归一化 频谱归一化详解 频谱归一化实现 前言 归一化技术的改进是生成对抗网络(Generativ ...

  4. OpenCV之图像像素归一化

    python代码: import cv2 as cv import numpy as npsrc = cv.imread("./test.png") cv.namedWindow( ...

  5. OpenCV中的归一化

    归一化就是把数据经过处理后限制在某个特定范围内. opencv 中使用 normalize 方法来实现归一化,它的函数原型如下 cv2.normalize(src, dst, alpha=None, ...

  6. Pytorch+Opencv 读取图像 归一化与逆归一化

    在深度学习工程中,有时需要利用opencv对图像进行读取后传入深度学习模型中 import cv2img = cv2.imread(filepath, 1) 这里的img是narray格式,openc ...

  7. opencv获取图像像素值的坑

    我最开始学习OpenCV的时候,网上搜索,获取某个像素点的值,大概是这样的, srcImg.at<uchar>(i, j) 当然这样可以获取,但是效率很低,也就是速度很慢,然后网上搜索了第 ...

  8. opencv 修改图像数值_opencv 修改图像数值_Python中使用OpenCV读取像素

    如何在Python中遍历像素呢?请看代码: import numpy as np import cv2 import matplotlib.pyplot as plt src = cv2.imread ...

  9. 【Android 应用开发】Android屏幕适配解析 - 详解像素,设备独立像素,归一化密度,精确密度及各种资源对应的尺寸密度分辨率适配问题

    . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19698511 . 最近遇到了一系列的屏幕适配问题, 以及 ...

最新文章

  1. Windows 8实用窍门系列:9.Windows 8中使用FlipView
  2. 118 Python程序中的线程操作-守护线程
  3. Android HAL(硬件抽象层)介绍以及调用
  4. leapmotion 定义识别手势改变物体颜色
  5. qam报告matlab,16QAM调制解调(MATLAB)..doc
  6. 戴尔微型计算机云处理器,为创作与品质而生 戴尔全新XPS15 OLED云解析
  7. 组装计算机硬盘的选购,组装电脑教程:DIY组装电脑怎么选择硬盘
  8. vue2.0模板的三种写法
  9. 今日头条是如何做推广和运营的?
  10. 6.标准C语言程序的文件名的后缀是,c语言源程序文件名的后缀是什么
  11. keil错误提示Error: L6218E: Undefined symbol
  12. hive:创建udf函数过滤emoji表情等特殊字符
  13. 。Windows 键盘快捷键
  14. 哪一刻你才发现青春结束了
  15. LeetCode-Algorithms-[Easy]LCP 02. 分式化简
  16. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java校园百事知系统lt1v4
  17. 基于Xlinx的时序分析、约束和收敛(7)----非理想时钟的特性约束
  18. [我可怜的3110c!nbsp;续]
  19. 标准时间源——中国国家授时中心
  20. 诺基亚n1系统更新显示无网络_安卓系统为何更新慢,诺基亚告诉你

热门文章

  1. 关于 Android O 的 treble/hidl
  2. 什么是网络环路问题?
  3. 手把手教你配置苹果APNS推送服务
  4. IE浏览器出现版本过低升级字样的解决方案
  5. CocosCreator开源框架(不断更新)
  6. 【随机过程】第二版龚光鲁译课后习题4.5参考答案
  7. edgy trees_将Ubuntu从Edgy升级到Feisty(6.10至7.04)
  8. python爬虫 爬取图片
  9. DCB value for SVN 77 not found on dcb.dat
  10. 手把手教你用Arduino接入阿里云物联网平台,ESP8266连接阿里云物联网平台必看教程...