知识点:像素归一化
opencv中提供四种归一的方法
-NORM_MINMAX
-NORM_INF
-NORM_L1
-NORM_L2
最常用的就是NORM_MINMAX归一的方法
相关的API
normalize:
void normalize(InputArray src, OutputArray dst, double alpha = 1, double beta = 0, int norm_type = NORM_L2, int dtype = -1, InputArray mask = noArray());
以下是对各个参数的详细解释:
1. src:输入数组(可以是图像),即要进行规范化的原始数据。
2. dst:输出数组,用于存储规范化后的结果。dst可以和src是同一个数组,表示直接在原数组上进行修改。
3. alpha:
• 当norm_type为NORM_MINMAX时,alpha是规范化到范围的下限。
• 在其他的规范化类型中,它与norm_type结合起来用于计算规范化后的值。
4. beta:
• 当norm_type为NORM_MINMAX时,beta是规范化到范围的上限。
• 在其他的规范化类型中,该参数在某些情况下可能不被使用(具体取决于规范化类型的定义)。
5. norm_type:规范化的类型,常用的取值有:
• NORM_MINMAX:最常用的规范化类型,将输入数组的所有元素线性缩放到(alpha, beta)区间。对于数组中的每个元素x,转换后的值x'计算公式为x' = alpha + (x - min(src)) * (beta - alpha) / (max(src) - min(src)),其中min(src)和max(src)分别是数组中的最小值和最大值。常用于调整图像亮度和对比度,或在输入机器学习模型前将特征缩放到同一范围。
• NORM_INF:此规范化类型将数组的所有元素缩放,使得结果数组的最大绝对值等于alpha。具体算法是将每个元素x除以数组的最大绝对值maxval,然后乘以alpha。可用于限制数组或向量的无穷范数(即最大绝对值),在某些优化问题中,可能需要将解的范围限制在一定界限内。
• NORM_L1:L1规范化使得结果数组的L1范数(即数组元素绝对值之和)等于alpha。常用于稀疏编码、特征选择、压缩感知等场景,因为L1规范化倾向于产生稀疏的解,即大部分元素为零,少数元素非零。
• NORM_L2:L2规范化使得结果数组的L2范数(即数组元素的平方和的平方根)等于alpha。常用于机器学习、信号处理、图像去噪等场景,L2规范化倾向于使得所有元素的大小都差不多,这在避免过拟合(如机器学习中的权重衰减)、信号去噪(通过最小化能量)等方面非常有用。
6. dtype:输出数组的深度。当值为-1时,输出数组和输入数组的深度相同;也可以指定为CV_32F等具体的数据类型,以改变输出数据的类型。
7. mask:可选的操作掩码,用于指定要规范化哪些数组元素。如果提供了掩码数组,只有掩码中对应位置的值不为零的元素才会被规范化。
void QUickdemo::norm_demo(Mat& image)
{
Mat dst;
std::cout << image.type() << std::endl;--16
image.convertTo(dst, CV_32F);
std::cout << dst.type() << std::endl;--转化为21 CV_8UC3-----CV_32FC3
}
void QUickdemo::norm_demo(Mat& image)
{
Mat dst;
std::cout << image.type() << std::endl;
image.convertTo(image, CV_32F);
std::cout << image.type() << std::endl;
normalize(image, dst, 1.0, 0, NORM_MINMAX);--转换
std::cout << dst.type() << std::endl;
imshow("xt", dst);
//显示16,21,21
}
dst = dst * 255;
std::cout << dst.type() << std::endl;
imshow("xt11", dst);--返回