在OpenCV中,normalize函数用于将图像或矩阵的值规范化到一个特定的范围内。这在图像处理中非常有用,比如在调整图像的对比度、准备数据进行机器学习处理时。规范化可以提高不同图像之间的可比性,或是为了满足特定算法对数据范围的要求。

normalize

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:输出数组,存储规范化后的结果。dst可以和src是同一个数组。
  • alpha:规范化到范围的下限(当norm_type=NORM_MINMAX时)。
  • beta:规范化到范围的上限(当norm_type=NORM_MINMAX时)。
  • norm_type:规范化的类型。最常用的是NORM_MINMAX,用于将数据线性变换到alpha,betaalpha,beta区间。其他选项包括NORM_L1、NORM_L2等,用于不同的数学规范化操作。
  • dtype:输出数组的深度。当值为-1时,输出数组和输入数组的深度相同。可以指定为CV_32F等,以改变输出数据的类型。
  • mask:可选的操作掩码,用于指定要规范化哪些数组元素。

norm_type

norm_type=NORM_MINMAX

最常用的规范化类型,它将输入数组的所有元素线性缩放到一个指定的范围内(通常是[alpha, beta])。对于数组中的每个元素x,转换后的值x’计算如下:
OpenCV中的normalize函数以及NORM_MINMAX、NORM_INF、NORM_L1、NORM_L2具体应用介绍-LMLPHP其中minValmaxVal分别是数组中的最小值和最大值。
应用场景:图像处理、数据预处理。
用途:将数据规范化到一个特定的范围内,常用于调整图像亮度和对比度,或在输入机器学习模型前将特征缩放到同一范围。这有助于提高算法的收敛速度和精度。
优势:简单直观,易于实现,可以使数据分布更均匀。

norm_type=NORM_INF

此规范化类型将数组的所有元素缩放,使得结果数组的最大绝对值等于alpha。具体算法是将每个元素x除以数组的最大绝对值maxVal,然后乘以alpha:
OpenCV中的normalize函数以及NORM_MINMAX、NORM_INF、NORM_L1、NORM_L2具体应用介绍-LMLPHP
应用场景:优化问题、数值计算。
用途:限制数组或向量的无穷范数(即最大绝对值)。在某些优化问题中,可能需要将解的范围限制在一定界限内,使用NORM_INF规范化可以达到这一目的。
优势:保证了数据中没有极端的大值,有利于数值稳定性

norm_type=NORM_L1

NORM_L1规范化使得结果数组的L1范数(即数组元素绝对值之和)等于alpha。每个元素x的计算公式为:
OpenCV中的normalize函数以及NORM_MINMAX、NORM_INF、NORM_L1、NORM_L2具体应用介绍-LMLPHP 应用场景:稀疏编码、特征选择、压缩感知。
用途:L1规范化倾向于产生稀疏的解,即大部分元素为零,少数元素非零。这在特征选择中特别有用,可以自动地忽略不重要的特征。
优势:促进稀疏性,有助于提高模型的可解释性,减少模型复杂度。

norm_type=NORM_L2

NORM_L2规范化使得结果数组的L2范数(即数组元素的平方和的平方根)等于alpha。每个元素x的计算公式为:
OpenCV中的normalize函数以及NORM_MINMAX、NORM_INF、NORM_L1、NORM_L2具体应用介绍-LMLPHP
应用场景:机器学习、信号处理、图像去噪。
用途:L2规范化倾向于使得所有元素的大小都差不多,这在避免过拟合(如机器学习中的权重衰减)、信号去噪(通过最小化能量)等场景中非常有用。
优势:防止数据中的个别点对总体结果产生过大影响,提高模型的泛化能力。

norm_type总结

  • NORM_MINMAX适用于需要将数据规范化到相同尺度的场景。
  • NORM_INF适用于需要控制数据的最大值不超过特定阈值的场景。
  • NORM_L1适用于需要稀疏解的场景,如特征选择或构建稀疏模型。
  • NORM_L2适用于需要平滑解、防止过拟合的场景,如机器学习中的正则化处理。

举例(norm_type=NORM_MINMAX)

//图像像素归一化
void QuickDemo::normalize_pixel_demo(Mat &image){
	Mat dst;
	image.convertTo(image, CV_32F);//把无符号整型转换为浮点型
	std::cout << "image raw type:"<<image.type() << std::endl;//16---代表CV_8UC3
	std::cout << "image convertTo CV_32F type:" << image.type() << std::endl;//21---CV_32FC3
	normalize(image, dst,2.0,0,NORM_MINMAX );
	std::cout << "CV_32F image NORM_MINMAX type:" << dst.type() << std::endl;//21---CV_32FC3
	imshow("NORM_MINMAX image", dst);
}

OpenCV中的normalize函数以及NORM_MINMAX、NORM_INF、NORM_L1、NORM_L2具体应用介绍-LMLPHPOpenCV中的normalize函数以及NORM_MINMAX、NORM_INF、NORM_L1、NORM_L2具体应用介绍-LMLPHPOpenCV中的normalize函数以及NORM_MINMAX、NORM_INF、NORM_L1、NORM_L2具体应用介绍-LMLPHP

02-22 15:07