opencv 归一化函数 normalize

r囧r小猫 2022-10-29 01:50 225阅读 0赞

方法:NORM_MINMAX

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

输出结果:

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

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

  1. ![dst(i,j)= \\frac\{Ai-min(A)\}\{max(A)-min(A)\}][dst_i_j_ _frac_Ai-min_A_max_A_-min_A]

我们来带入进行求解 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

  1. Mat src = new Mat(new Size(5, 2), CvType.CV_32FC1);
  2. for (int i = 0; i < 1; i++) {
  3. for (int j = 0; j < src.cols(); j++) {
  4. double[] data = new double[] { 10, 23, 22, 10, 5 };
  5. src.put(i, j, data[j]);
  6. }
  7. }
  8. for (int i = 1; i < 2; i++) {
  9. for (int j = 0; j < src.cols(); j++) {
  10. double[] data = new double[] { 11, 9, 4, 15, 2 };
  11. src.put(i, j, data[j]);
  12. }
  13. }
  14. Mat dst = new Mat();
  15. System.out.println(src.dump());
  16. Core.normalize(src, dst, 1, 0, Core.NORM_L1);
  17. 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]

计算公式:

  1. ![dst(i,j)=\\frac\{Ai\}\{\\sum |(src(x,j)|)\}][dst_i_j_frac_Ai_sum _src_x_j]

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

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

方法NORM_L2

  1. Mat src = new Mat(new Size(5, 2), CvType.CV_32FC1);
  2. for (int i = 0; i < 1; i++) {
  3. for (int j = 0; j < src.cols(); j++) {
  4. double[] data = new double[] { 10, 23, 22, 10, 5 };
  5. src.put(i, j, data[j]);
  6. }
  7. }
  8. for (int i = 1; i < 2; i++) {
  9. for (int j = 0; j < src.cols(); j++) {
  10. double[] data = new double[] { 11, 9, 4, 15, 2 };
  11. src.put(i, j, data[j]);
  12. }
  13. }
  14. Mat dst = new Mat();
  15. System.out.println(src.dump());
  16. Core.normalize(src, dst, 1, 0, Core.NORM_L2);
  17. 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]

计算公式:

dst(i,j)=\\frac\{Ai\}\{\\sqrt\{\\sum src(x,y)^\{2\}\}\}

我们来计算一下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

  1. Mat src = new Mat(new Size(5, 2), CvType.CV_32FC1);
  2. for (int i = 0; i < 1; i++) {
  3. for (int j = 0; j < src.cols(); j++) {
  4. double[] data = new double[] { 10, 23, 22, 10, 5 };
  5. src.put(i, j, data[j]);
  6. }
  7. }
  8. for (int i = 1; i < 2; i++) {
  9. for (int j = 0; j < src.cols(); j++) {
  10. double[] data = new double[] { 11, 9, 4, 15, 2 };
  11. src.put(i, j, data[j]);
  12. }
  13. }
  14. Mat dst = new Mat();
  15. System.out.println(src.dump());
  16. Core.normalize(src, dst, 1, 0, Core.NORM_INF);
  17. 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]

这个计算是比较简单的

  1. ![dst(i,j)=\\frac\{Ai\}\{max(A)\}][dst_i_j_frac_Ai_max_A]

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

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

总结:

NORM_MINMAX 归一化的方式就是矩阵中的每一个元素减去最小的元素然后除以(矩阵中最大的元素减去最小的元素)对应公式:dst(i,j)= \\frac\{Ai-min(A)\}\{max(A)-min(A)\}

NORM_L1归一化处理是对应元素除以矩阵元素和 对应公式:dst(i,j)=\\frac\{Ai\}\{\\sum |(src(x,j)|)\} 矩阵元素的绝对值之和(曼哈顿距离)

NORM_L2 是对应元素除以所有元素的平方和的算术平方根 对应公式:dst(i,j)=\\frac\{Ai\}\{\\sqrt\{\\sum src(x,y)^\{2\}\}\} 矩阵各元素的欧几里德距离之和

NORM_INF 归一化的方式是对应元素除以矩阵中的最大的元素 对应公式: dst(i,j)=\\frac\{Ai\}\{max(|A|)\} 矩阵各元素绝对值的最大值(切比雪夫距离)

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

希望对你有所帮助!

发表评论

表情:
评论列表 (有 0 条评论,225人围观)

还没有评论,来说两句吧...

相关阅读