[normalize]标准化数据
图像处理过程中常用的操作之一就是数据标准化,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::NormTypesdtype
:如果为负(默认),则输出数组的类型与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)