OPENCV函数介绍:normalize()

OPENCV函数介绍:normalize()

OPENCV版本:3.4.2
VS版本:2017

  1. 函数原型:
void cv::normalize(InputArry src,InputOutputArray dst,double alpha=1,double beta=0,int norm_type=NORM_L2,int dtype=-1,InputArray mark=noArry())
  1. 函数作用:
    归一化数据。该函数分为范围归一化与数据值归一化。(Normalizes the norm or value range of an array.)其实范围归一化和数值归一化可以归为一类,一般来说数值归一化是指将数值归一到[0,1]区间上,而范围归一化则指将数值归一到[a,b]上,a,b为任意值。由此看出,数值归一化是范围归一化的特例,包含在范围归一化中。

  2. 参数说明:

src 输入数组;
dst 输出数组,数组的大小和原数组一致;
alpha 用来规范值或者规范范围,并且是下限;
beta 只用来规范范围并且是上限,因此只在NORM_MINMAX中起作用
norm_type 归一化选择的数学公式类型;
dtype 当为负,输出在大小深度通道数都等于输入,当为正,输出只在深度与输如不同,不同 的地方由dtype决定;
mark 掩码。选择感兴趣区域,选定后只能对该区域进行操作。

  1. 归一化选择的数学公式类型介绍(norm_type)

设数组中元素为{A1,A2,A3…An}

NORM_L1:
在这里插入图片描述

NORM_INF:
在这里插入图片描述

NORM_L2:
在这里插入图片描述

NORM_MINMAX:(AK不属于{max(Ai)},min(Ai),当AK等于max(Ai)时p=1,等于min(Ai)时p=0)
在这里插入图片描述

  1. 举例说明:

src={10,23,71},默认alpha=1,beta=0:

NORM_L1运算后得到 dst={0.096,0.221,0.683}

NORM_INF运算后得到 dst={0.141,0.324,1}

NORM_L2运算后得到 dst={0.133,0.307,0.947}

NORM_MINMAX运算得到 dst={0,0.377,1}

  1. 四种norm_type的区别

1.NORM_L1、NORM_INF、NORM_L2模式下归一化结果与beta无关,只与alpha有关,详见第4部分的公式说明;

2.NORM_MINMAX中alpha、beta都起作用,同时需要注意的是alpha和beta的取值顺序与归一化结果无关。即alpha=255,beta=0和alpha=0,beta=255最后的归一化结果是相同的。

  1. 举例程序说明:

NORM_L1运算:

#include
#include

using namespace std;
using namespace cv;

int main()
{
	vectora = { 10,11,234,45,65,456,0 };
	normalize(a, a,1,255,NORM_L1);
	//normalize(a, a,1,0,NORM_L1);结果相同
	for (int i = 0; i < a.size(); i++)
	{
		cout << a[i] << endl;
	}
	waitKey(0);
	return 0;
}

运行结果:
OPENCV函数介绍:normalize()_第1张图片
NORM_MINMAX运算:

#include
#include

using namespace std;
using namespace cv;

int main()
{
	vectora = { 10,11,234,45,65,456,0 };
	normalize(a, a,-1,255,NORM_MINMAX);
	//normalize(a, a,255,-1,NORM_MINMAX);结果相同
	for (int i = 0; i < a.size(); i++)
	{
		cout << a[i] << endl;
	}
	waitKey(0);
	return 0;
}

运行结果:
在这里插入图片描述

  1. 关于参数解释中alpha与beta的上下限与其默认取值的问题的解释

normalize()中alpha默认为1,beta默认为0,而在参数解释中alpha解释为下限,beta解释为上限,很多同学在这个地方产生了疑问?一个数组的下限不是应该小于上限吗?即alphabeta=0。
这里给出我自己的解释,有错误的地方请大家指出:由上述实验知道,
在norm_type=NORM_MINMAX下:
alpha与beta的大小关系其实并不重要,alpha,beta只是确定范围的两个边界值,其确定的范围可以表示为:
[min(alpha,beta), max(alpha,beta)]
在norm_type=NORM_L1\INF\L2下:
beta取任何值都对归一化结果没有影响

因此,我得出的结论是,在3.参数说明中,应该将alpha解释成:用来规范值或者规范范围,在规范范围是为范围的一边界值; 将beta解释成:只用来规范范围,为范围的另一边界值

注:本文在博主:cosmispower的一篇文章的基础上做了相应的个人修改补充,感谢博主的贡献。

参考博主的博客链接:https://blog.csdn.net/cosmispower/article/details/64457406

你可能感兴趣的:(OpenCV,计算机视觉)