[normalize]标准化数据

参考:normalize() [1/2]

图像处理过程中常用的操作之一就是数据标准化,OpenCV提供了函数cv::normalize来完成

函数解析

CV_EXPORTS_W 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:输出数组,大小和原图一致
  • alpha:标准化值或者按范围标准化的下范围边界
  • beta:按范围标准化时的上范围边界;它不作用于范数标准化
  • norm_type:标准化类型,参考cv::NormTypes
  • dtype:如果为负(默认),则输出数组的类型与src相同;否则,其通道数与src相同,数据深度=CV_MAT_DEPTH(dtype)
  • mask:操作掩码(可选)

标准化方式

函数normalize根据参数norm_type决定数据标准化方式

normType=NORM_INF/NORM_L1/NORM_L2时,其计算方式如下:

normType=NORM_MINMAX时,其计算方式如下:

示例

假定测试数据如下:

vector<double> positiveData = { 2.0, 8.0, 10.0 };

normType=NORM_L1时,通过L1范数计算总数,然后缩放到alpha大小,比如

normalize(positiveData, normalizedData_l1, 1.0, 0.0, NORM_L1);

则计算结果为

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)

normType=NORM_L2时,通过L2范数计算总数,然后缩放到alpha大小,比如

normalize(positiveData, normalizedData_l2, 1.0, 0.0, NORM_L2);

计算结果如下

sum(numbers) = sqrt(2*2 + 8*8 + 10*10) = sqrt(168) = 12.96
Norm to unit vector: ||positiveData|| = 1.0
2.0      0.15    (2 / 12.96)
8.0      0.62    (8 / 12.96)
10.0     0.77    (10/ 12.96)

normType=NORM_MINMAX时,将数据缩放到[alpha, beta]大小,比如

normalize(positiveData, normalizedData_minmax, 1.0, 0.0, NORM_MINMAX);

将数据缩放到[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)