方法:NORM_MINMAX

Mat src=new Mat(new Size(5,1),CvType.CV_32FC1);
for(int i=0;i<src.rows();i++) {
for(int j=0;j<src.cols();j++) {
double [] data=new double[] {10,23,22,10,5};
src.put(i, j, data[j]);
}
}
Mat dst=new Mat();
System.out.println(src.dump());
Core.normalize(src,dst,1,0,Core.NORM_MINMAX);
System.out.println(dst.dump());

输出结果:

输入:[10, 23, 22, 10, 5]
输出:[0.27777779, 1, 0.94444442, 0.27777779, 0]

当前的数组是一行,我们归一化利用的

   

opencv 归一化函数 normalize_i++

我们来带入进行求解 max(A)=23 ,min(A)=5   所以说:max(A)-min(A)=23-5=17         Ai-min(A)=10-5=5           5/17=0.2777779

那么这个时候我们的输入的矩阵只有一行,如果存在多行,应该怎么来计算

输入:[10, 23, 22, 10, 5;
             11, 9, 4, 15, 2]
输出:[0.38095239, 1, 0.95238101, 0.38095239, 0.14285713;
            0.42857146, 0.33333334, 0.095238097, 0.61904764, 0]

上面的是还适用吗:

我们来带入进行求解 max(A)=23 ,min(A)=2   所以说:max(A)-min(A)=23-2=21         Ai-min(A)=10-2=8           8/21=0.38095239

看来 NORM_MINMAX 归一化的方式就是矩阵中的每一个元素减去最小的元素然后除以(矩阵中最大的元素减去最小的元素)

方法NORM_L1

Mat src = new Mat(new Size(5, 2), CvType.CV_32FC1);
for (int i = 0; i < 1; i++) {
for (int j = 0; j < src.cols(); j++) {
double[] data = new double[] { 10, 23, 22, 10, 5 };
src.put(i, j, data[j]);
}
}


for (int i = 1; i < 2; i++) {
for (int j = 0; j < src.cols(); j++) {
double[] data = new double[] { 11, 9, 4, 15, 2 };
src.put(i, j, data[j]);
}
}
Mat dst = new Mat();
System.out.println(src.dump());
Core.normalize(src, dst, 1, 0, Core.NORM_L1);
System.out.println(dst.dump());

 

输入:

[10, 23, 22, 10, 5;
 11, 9, 4, 15, 2]
输出:

[0.090090096, 0.20720722, 0.1981982, 0.090090096, 0.045045048;
 0.0990991, 0.081081085, 0.036036037, 0.13513514, 0.018018018]

计算公式:

              

opencv 归一化函数 normalize_曼哈顿距离_02

我们按照计算公司来看:矩阵的元素和为:10+23+ 22+10+5+11+9+4+15+2=111   第一个元素:10/111=0.090090096

由此可以看到的是NORM_L1归一化处理是对应元素除以矩阵元素和

方法NORM_L2

Mat src = new Mat(new Size(5, 2), CvType.CV_32FC1);
for (int i = 0; i < 1; i++) {
for (int j = 0; j < src.cols(); j++) {
double[] data = new double[] { 10, 23, 22, 10, 5 };
src.put(i, j, data[j]);
}
}


for (int i = 1; i < 2; i++) {
for (int j = 0; j < src.cols(); j++) {
double[] data = new double[] { 11, 9, 4, 15, 2 };
src.put(i, j, data[j]);
}
}
Mat dst = new Mat();
System.out.println(src.dump());
Core.normalize(src, dst, 1, 0, Core.NORM_L2);
System.out.println(dst.dump());

查看结果:

输入:[10, 23, 22, 10, 5;
            11, 9, 4, 15, 2]
输出:[0.24361277, 0.56030935, 0.5359481, 0.24361277, 0.12180638;
            0.26797405, 0.2192515, 0.097445108, 0.36541915, 0.048722554]

计算公式:

opencv 归一化函数 normalize_i++_03

我们来计算一下10*10+23*23+22*22+10*10+5*5+11*11+9*9+4*4+15*15+2*2=1685   求解1685的平方根为:41.048751503547585   然后我们求解第一个元素:10/41.048751503547585 =0.24361276856704797 这个和我们输出元素是一样的

那么我们可以看出NORM_L2 是对应元素除以所有元素的平方和的算术平方根

方法:NORM_INF

    Mat src = new Mat(new Size(5, 2), CvType.CV_32FC1);
for (int i = 0; i < 1; i++) {
for (int j = 0; j < src.cols(); j++) {
double[] data = new double[] { 10, 23, 22, 10, 5 };
src.put(i, j, data[j]);
}
}


for (int i = 1; i < 2; i++) {
for (int j = 0; j < src.cols(); j++) {
double[] data = new double[] { 11, 9, 4, 15, 2 };
src.put(i, j, data[j]);
}
}
Mat dst = new Mat();
System.out.println(src.dump());
Core.normalize(src, dst, 1, 0, Core.NORM_INF);
System.out.println(dst.dump());

查看结果:

输入结果:[10, 23, 22, 10, 5;
                   11, 9, 4, 15, 2]
输出:[0.43478262, 1, 0.95652175, 0.43478262, 0.21739131;
            0.47826087, 0.39130434, 0.17391305, 0.65217394, 0.086956523]

这个计算是比较简单的

                                       

opencv 归一化函数 normalize_归一化_04

上述的矩阵中最大的元素是23  第一个元素10  所以在输出的时候第一个元素为:10/23=0.43478260869565216

NORM_INF 归一化的方式是对应元素除以矩阵中的最大的元素

总结:  

NORM_MINMAX 归一化的方式就是矩阵中的每一个元素减去最小的元素然后除以(矩阵中最大的元素减去最小的元素)对应公式:

opencv 归一化函数 normalize_i++

NORM_L1归一化处理是对应元素除以矩阵元素和     对应公式:

opencv 归一化函数 normalize_曼哈顿距离_02

    矩阵元素的绝对值之和(曼哈顿距离)NORM_L2 是对应元素除以所有元素的平方和的算术平方根  对应公式:

opencv 归一化函数 normalize_i++_03

  矩阵各元素的欧几里德距离之和NORM_INF 归一化的方式是对应元素除以矩阵中的最大的元素   对应公式:  

opencv 归一化函数 normalize_曼哈顿距离_08

 矩阵各元素绝对值的最大值(切比雪夫距离)

 

上面是对归一化函数有一个初步的了解,以及对应的熟悉公式,看完这些感觉业务了解算法,上学的时候学习的那点知识还真的是需要恶补,特别是学习opencv,当然我们最终的目的不是说对opencv有所创新,我们希望的是对图片可以进行相关的处理,目的地还有很远,继续加油。还有3天要过年了,提前祝大家牛年快乐。

希望对你有所帮助!