图像像素类型转换与归一化
函数原型
void 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 如果norm_type为NORM_MINMAX ,则alpha为最小值或最大值;如果norm_type为其他类型,则为归一化要乘的系数【重点】
beta 如果norm_type为NORM_MINMAX ,则beta为最小值或最大值;如果norm_type为其他类型,beta被忽略,此处不会被用到,一般传入0【重点】
normType 归一化的类型,可以有以下的取值:
NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。
NORM_INF:此类型的定义没有查到,根据OpenCV 1的对应项,可能是归一化数组的C-范数(绝对值的最大值)
NORM_L1 : 归一化数组的L1-范数(绝对值的和)
NORM_L2: 归一化数组的(欧几里德)L2-范数
dtype dtype为负数时,输出数组的type与输入数组的type相同;否则,输出数组与输入数组只是通道数相同,而tpye=CV_MAT_DEPTH(dtype).
mask 操作掩膜,用于指示函数是否仅仅对指定的元素进行操作。
代码详解参考:https://blog.youkuaiyun.com/yl_best/article/details/89000431
1.normalize(image, dst, 1.0, 0, NORM_MINMAX)的函数作用:这个函数的作用就是把需要处理的数据通过某种算法限制在你需要的一定范围内。归一化数据。该函数分为范围归一化与数据值归一化。(Normalizes the norm or value range of an array.)
2.由于归一化会将整数像素值变为小数,所以要在归一化之前进行数据类型的转化。image.convertTo(image, CV_32F);//将image中的数据类型type改变成指定的类型。由于归一化会将整数像素值变为小数,所以要在归一化之前进行数据类型的转化
3.如果改变像素的取值类型,那么也要随之调整像素值,否则无法正常显示。
4.如果选择NORM_MINMAX类型,通常将alpha设定为最小值,将beta设定为最大值。比如,需要将数据范围限定在[0, 400],可以这么使用normalize(src, dst, 0, 400.0, NORM_MINMAX);
,如果选择其他三种类型,beta设定为0,alpha按需求设定。
//归一化
void QuickDemo::norm_demo(Mat &image) {
Mat dst;
std::cout << image.type() << std::endl;
image.convertTo(image, CV_32F);//将image中的数据类型type改变成指定的类型。由于归一化会将整数像素值变为小数,所以要在归一化之前进行数据类型的转化
std::cout << image.type() << std::endl;
normalize(image, dst, 1.0, 0, NORM_MINMAX);//将图片像素值按照指定方式归一化
std::cout << dst.type() << std::endl;
imshow("图像数据归一化", dst);
// CV_8UC3, CV_32FC3
}