当前位置:   article > 正文

自动白平衡之完美反射算法原理及C++实现_完美反射法白平衡c++

完美反射法白平衡c++

自动白平衡之完美反射算法原理及C++实现

原文:https://blog.csdn.net/just_sort/article/details/85982871

算法原理

https://www.cnblogs.com/Imageshop/archive/2013/04/20/3032062.html 在Imageshop前辈看到了这个完美反射算法用于自动白平衡的算法,此算法的原理是:完美反射理论假设图像中最亮的点就是白点,并以此白点为参考对图像进行自动白平衡,最亮点定义为R+G+B的最大值

算法步骤

  • 计算每个像素R,G,B之后,并保存
  • 按照R+G+B的值的大小计算出其前10%或其他Ratio的白色参考点的阈值T
  • 遍历图像中的每个点,计算其中R+G+B值大于T的所有点的R\G\B分量的累积和的平均值
  • 将每个像素量化到[0, 255]

C++源码实现

  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <immintrin.h>
  4. #include <opencv2/opencv.hpp>
  5. #include <opencv2/core/core.hpp>
  6. #include <opencv2/ml/ml.hpp>
  7. #include "opencv2/highgui/highgui.hpp"
  8. using namespace cv;
  9. using namespace cv::ml;
  10. using namespace std;
  11. Mat PerfectReflectionAlgorithm(Mat src) {
  12. int row = src.rows;
  13. int col = src.cols;
  14. Mat dst(row, col, CV_8UC3);
  15. int HistRGB[767] = { 0 };
  16. int MaxVal = 0;
  17. for (int i = 0; i < row; i++) {
  18. for (int j = 0; j < col; j++) {
  19. MaxVal = max(MaxVal, (int)src.at<Vec3b>(i, j)[0]);
  20. MaxVal = max(MaxVal, (int)src.at<Vec3b>(i, j)[1]);
  21. MaxVal = max(MaxVal, (int)src.at<Vec3b>(i, j)[2]);
  22. int sum = src.at<Vec3b>(i, j)[0] + src.at<Vec3b>(i, j)[1] + src.at<Vec3b>(i, j)[2];
  23. HistRGB[sum]++;
  24. }
  25. }
  26. int Threshold = 0;
  27. int sum = 0;
  28. for (int i = 766; i >= 0; i--) {
  29. sum += HistRGB[i];
  30. if (sum > row * col * 0.1) {
  31. Threshold = i;
  32. break;
  33. }
  34. }
  35. int AvgB = 0;
  36. int AvgG = 0;
  37. int AvgR = 0;
  38. int cnt = 0;
  39. for (int i = 0; i < row; i++) {
  40. for (int j = 0; j < col; j++) {
  41. int sumP = src.at<Vec3b>(i, j)[0] + src.at<Vec3b>(i, j)[1] + src.at<Vec3b>(i, j)[2];
  42. if (sumP > Threshold) {
  43. AvgB += src.at<Vec3b>(i, j)[0];
  44. AvgG += src.at<Vec3b>(i, j)[1];
  45. AvgR += src.at<Vec3b>(i, j)[2];
  46. cnt++;
  47. }
  48. }
  49. }
  50. AvgB /= cnt;
  51. AvgG /= cnt;
  52. AvgR /= cnt;
  53. for (int i = 0; i < row; i++) {
  54. for (int j = 0; j < col; j++) {
  55. int Blue = src.at<Vec3b>(i, j)[0] * MaxVal / AvgB;
  56. int Green = src.at<Vec3b>(i, j)[1] * MaxVal / AvgG;
  57. int Red = src.at<Vec3b>(i, j)[2] * MaxVal / AvgR;
  58. if (Red > 255) {
  59. Red = 255;
  60. }
  61. else if (Red < 0) {
  62. Red = 0;
  63. }
  64. if (Green > 255) {
  65. Green = 255;
  66. }
  67. else if (Green < 0) {
  68. Green = 0;
  69. }
  70. if (Blue > 255) {
  71. Blue = 255;
  72. }
  73. else if (Blue < 0) {
  74. Blue = 0;
  75. }
  76. dst.at<Vec3b>(i, j)[0] = Blue;
  77. dst.at<Vec3b>(i, j)[1] = Green;
  78. dst.at<Vec3b>(i, j)[2] = Red;
  79. }
  80. }
  81. return dst;
  82. }
  83. int main() {
  84. Mat src = imread("F:\\child.jpg");
  85. Mat dst = PerfectReflectionAlgorithm(src);
  86. imshow("origin", src);
  87. imshow("result", dst);
  88. imwrite("F:\\res.jpg", dst);
  89. waitKey(0);
  90. }

效果

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/287344
推荐阅读
相关标签
  

闽ICP备14008679号