opencv笔记(二十八)——OpenCV中矩阵的归一化

匆匆过客 提交于 2019-12-08 02:28:14

1. 归一化定义与作用

    归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。首先归一化是为了后面数据处理的方便,其次是保证程序运行时收敛加快。归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在某个区间上是统计的坐标分布。归一化有同一、统一和合一的意思。

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

     图像处理中,图片像素点单通道值一般是[0-255]的unsigned char类型,将其转化到[0,1]之间,更方便计算,这就需要用到矩阵的归一化运算。normalize的原矩阵必须是单通道(src.channel==1),函数执行完,无论之前是否初始化结果矩阵,结果矩阵的大小和类型与原矩阵相同。

    在使用机器学习算法的数据预处理阶段,归一化也是非常重要的一个步骤。例如在应用SVM之前,缩放是非常重要的。Sarle的神经网络FAQ的第二部分(1997)阐述了缩放的重要性,大多数注意事项也适用于SVM。缩放的最主要优点是能够避免大数值区间的属性过分支配了小数值区间的属性。另一个优点能避免计算过程中数值复杂度。因为关键值通常依赖特征向量的内积(inner products),例如,线性核和多项式核力,属性的大数值可能会导致数值问题。我们推荐将每个属性线性缩放到区间[-1,+1]或者[0, 1]。

    当然,我们必须使用同样的方法缩放训练数据和测试数据。例如,假设我们把训练数据的第一个属性从[-10,+10]缩放到[-1, +1],那么如果测试数据的第一个属性属于区间[-11, +8],我们必须将测试数据转变成[-1.1, +0.8]。

参考:“SVM:从理论到OpenCV实践” 4.2 归一化数据:

http://blog.csdn.net/zhazhiqiang/article/details/20146243

2. normalize 函数介绍

2.1 函数原型:

 void normalize(InputArray src,OutputArray dst, double alpha=1, doublebeta=0, int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray() )

    该函数归一化输入数组使它的范数或者数值范围在一定的范围内。该函数分为范围归一化与数据值归一化。(Normalizes the norm or value range of an array.)

2.2 参数说明

src:

    输入数组

dst:

    输出数组,数组的大小和原数组一致;支持原地运算

alpha:

    range normalization模式的最小值。1,用来规范值,2.规范范围,并且是下限;

beta:

    只用来规范range normalization模式的最大值,不用于norm normalization(范数归一化)模式。

normType:

    归一化的类型,可以有以下的取值:

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

    NORM_INF: 此类型的定义没有查到,根据OpenCV 1的对应项,可能是归一化数组的C-范数(绝对值的最大值)

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

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

dtype:

    dtype为负数时,输出数组的type与输入数组的type即大小、深度、通道数都相同;

否则,输出数组与输入数组只是通道数相同,其余地方由tpye决定。如tpye=CV_MAT_DEPTH(dtype).

mask:

    操作掩膜,选择感兴趣区域,选定后只能对该区域进行操作。

2.3 归一化选择的数学公式类型介绍(norm_type)

设数组中原有{A1,A2,A3...An}

NORM_L1:

                                                                             

NORM_INF:

                                                                       

NORM_L2:

                                                                       

NORM_MINMAX:(AK不属于{max(Ai)},min(Ai),当AK等于max(Ai)时p=1,等于min(Ai)时p=0)

                                                                     

2.4.举例说明:

src={10,23,71}

NORM_L1运算后得到    dst={0.096,0.221,0.683}

NORM_INF运算后得到  dst={0.141,0.324,1}

NORM_L2运算后得到   dst={0.133,0.307,0.947}

NORM_MINMAX运算得到 dst={0,0.377,1}

3.范围归一化值归一化的区别

区别一:范围归一化使用的是如下式子,设范围为【0,255】

即把src缩放到【0,255】这个范围内,并不使用上面的4个公式去解。

区别二:使用范围归一化时,beta必有值不等于0

举例说明:

一 值归一化:

#include<opencv2/opencv.hpp>
#include<iostream>
 
using namespace std;
 
int main()
{
	vector<double>a={ 10,11,234,45,65,456,0 };
	cv::normalize(a, a, 1,0, cv::NORM_MINMAX);
	for (int i=0;i < a.size();i++)
	{
		cout << a[i] << endl;
	}
	return 0;
}

结果如下:

                                                   

二 范围归一化

#include<opencv2/opencv.hpp>
#include<iostream>
 
using namespace std;
 
int main()
{
	vector<double>a={ 10,11,234,45,65,456,0 };
	cv::normalize(a, a, 0,255, cv::NORM_MINMAX);
	for (int i=0;i < a.size();i++)
	{
		cout << a[i] << endl;
	}
	return 0;
}

结果如下:

                                                        

4.归一化公式:

1、线性函数转换,表达式如下:(对应NORM_MINMAX)

ifmask(i,j)!=0

    dst(i,j)=(src(i,j)-min(src))*(b‘-a‘)/(max(src)-min(src))+ a‘

else

     dst(i,j)=src(i,j)

    其中b‘=MAX(a,b), a‘=MIN(a,b);

2. 当norm_type!=CV_MINMAX:

ifmask(i,j)!=0

    dst(i,j)=src(i,j)*a/norm (src,norm_type,mask)

else

    dst(i,j)=src(i,j)

    其中,函数norm的功能是计算norm(范数)的绝对值

Thefunctions norm calculate an absolute norm of src1 (when there is no src2 ):

技术分享

参考:

https://blog.csdn.net/cosmispower/article/details/64457406

https://blog.csdn.net/chinadragon_1981/article/details/51726177

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!