知识点:

OpenCV中提供了四种归一化的方法:
- NORM_MINMAX
- NORM_INF
- NORM_L1
- NORM_L2
最常用的就是 NORM_MINMAX 归一化方法。
相关API函数:

  1. void normalize(InputArray src,
  2. InputOutputArray dst,
  3. double alpha = 1,
  4. double beta = 0,
  5. int norm_type = NORM_L2,
  6. int dtype = -1,
  7. InputArray mask = noArray());

- InputArray src // 输入图像

  • InputOutputArray dst // 输出图像

  • double alpha = 1 // NORM_MINMAX时候低值

  • double beta = 0 // NORM_MINMAX时候高值,通常保持 alpha 和 beta 一大一小即可

  • int norm_type = NORM_L2 // NORM_L2、NORM_L1、NORM_INF 只需要 alpha,NORM_MINMAX 需要 alpha 和 beta 两个参数

  • int dtype = -1 // 输出数组的type与输入数组的type相同,否则,输出数组与输入数组只是通道数相同,而tpye = CV_MAT_DEPTH(dtype)

  • InputArray mask = noArray() // mask默认值为空
    [

](https://blog.csdn.net/Apple_Coco/article/details/93731517)

C++代码

  1. #include <opencv2/opencv.hpp>
  2. #include <iostream>
  3. using namespace std;
  4. using namespace cv;
  5. void day11() {
  6. // 读取一张灰度图像
  7. Mat src = imread("G:\\opencvTest\\test.jpg", IMREAD_GRAYSCALE);
  8. if (src.empty()) {
  9. cout << "could not load image.." << endl;
  10. return;
  11. }
  12. imshow("src", src);
  13. Mat gray_f;
  14. // 转换为浮点数类型数组
  15. src.convertTo(gray_f, CV_32F);
  16. // NORM_MINMAX 归一化,根据delta = max - min = 8.0
  17. // 归一化到[alpha, beta],即[1.0, 0]
  18. // 2.0 0.0 ((2.0 - 2.0)/8.0)
  19. // 8.0 0.75 ((8.0 - 2.0)/8.0)
  20. // 10.0 1.0 ((10.0 - 2.0)/8.0)
  21. Mat dst = Mat::zeros(gray_f.size(), CV_32FC1);
  22. normalize(gray_f, dst, 1.0, 0, NORM_MINMAX);
  23. Mat result = dst * 255;
  24. result.convertTo(dst, CV_8UC1);
  25. imshow("NORM_MINMAX", dst);
  26. // NORM_INF 归一化,根据最大值
  27. // 2.0 0.2 (2.0/10.0)
  28. // 8.0 0.8 (8.0/10.0)
  29. // 10.0 1.0 (10.0/10.0)
  30. normalize(gray_f, dst, 1.0, 0, NORM_INF);
  31. result = dst * 255;
  32. result.convertTo(dst, CV_8UC1);
  33. imshow("NORM_INF", dst);
  34. // NORM_L1 归一化,依据和为1
  35. // sum(numbers) = 20.0
  36. // 2.0 0.1 (2.0/20.0)
  37. // 8.0 0.4 (8.0/20.0)
  38. // 10.0 0.5 (10.0/20.0)
  39. normalize(gray_f, dst, 1.0, 0, NORM_L1);
  40. result = dst * 10000000;
  41. result.convertTo(dst, CV_8UC1);
  42. imshow("NORM_L1", dst);
  43. // NORM_L2 归一化,根据单位向量为1
  44. // ||positiveData|| = sqrt(2.0*2.0 + 8.0*8.0 + 10.0*10.0) = 12.96
  45. // 2.0 0.15 (2.0/12.96)
  46. // 8.0 0.62 (8.0/12.96)
  47. // 10.0 0.77 (10.0/12.96)
  48. normalize(gray_f, dst, 1.0, 0, NORM_L2);
  49. result = dst * 10000;
  50. result.convertTo(dst, CV_8UC1);
  51. imshow("NORM_L2", dst);
  52. waitKey(0);
  53. }

Python代码

Javascript代码