opencv normalize()函数详解

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 positiveData = { 2.0, 8.0, 10.0 };
vector 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(|src(I)*alpha + beta|)

saturate_cast(data)等同于:

if (data < 0)

   data = 0;

else if (data > 255)

  data = 255;



你可能感兴趣的:(openCV)