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

这篇文章给大家介绍自动白平衡之完美反射算法原理及C++实现是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

前言

昨天介绍的灰度世界算法是最原始的处理白平衡的算法。今天要介绍的完美反射算法也是自动白平衡常用的算法之一。一起来看看吧。

算法原理

完美反射理论假设图像中最亮的点就是白点,并以此白点为参考对图像进行自动白平衡,最亮点定义为R+G+B的最大值。

算法过程

  1. 计算每个像素R,G,B之后,并保存

  2. 按照R+G+B的值的大小计算出其前10%或其他Ratio的白色参考点的阈值T

  3. 遍历图像中的每个点,计算其中R+G+B值大于T的所有点的R\G\B分量的累积和的平均值

  4. 将每个像素量化到[0, 255]

代码实现

Mat PerfectReflectionAlgorithm(Mat src) {  int row = src.rows;  int col = src.cols;  Mat dst(row, col, CV_8UC3);  int HistRGB[767] = { 0 };  int MaxVal = 0;  for (int i = 0; i < row; i++) {    for (int j = 0; j < col; j++) {      MaxVal = max(MaxVal, (int)src.at<Vec3b>(i, j)[0]);      MaxVal = max(MaxVal, (int)src.at<Vec3b>(i, j)[1]);      MaxVal = max(MaxVal, (int)src.at<Vec3b>(i, j)[2]);      int sum = src.at<Vec3b>(i, j)[0] + src.at<Vec3b>(i, j)[1] + src.at<Vec3b>(i, j)[2];      HistRGB[sum]++;    }  }  int Threshold = 0;  int sum = 0;  for (int i = 766; i >= 0; i--) {    sum += HistRGB[i];    if (sum > row * col * 0.1) {      Threshold = i;      break;    }  }  int AvgB = 0;  int AvgG = 0;  int AvgR = 0;  int cnt = 0;  for (int i = 0; i < row; i++) {    for (int j = 0; j < col; j++) {      int sumP = src.at<Vec3b>(i, j)[0] + src.at<Vec3b>(i, j)[1] + src.at<Vec3b>(i, j)[2];      if (sumP > Threshold) {        AvgB += src.at<Vec3b>(i, j)[0];        AvgG += src.at<Vec3b>(i, j)[1];        AvgR += src.at<Vec3b>(i, j)[2];        cnt++;      }    }  }  AvgB /= cnt;  AvgG /= cnt;  AvgR /= cnt;  for (int i = 0; i < row; i++) {    for (int j = 0; j < col; j++) {      int Blue = src.at<Vec3b>(i, j)[0] * MaxVal / AvgB;      int Green = src.at<Vec3b>(i, j)[1] * MaxVal / AvgG;      int Red = src.at<Vec3b>(i, j)[2] * MaxVal / AvgR;      if (Red > 255) {        Red = 255;      }      else if (Red < 0) {        Red = 0;      }      if (Green > 255) {        Green = 255;      }      else if (Green < 0) {        Green = 0;      }      if (Blue > 255) {        Blue = 255;      }      else if (Blue < 0) {        Blue = 0;      }      dst.at<Vec3b>(i, j)[0] = Blue;      dst.at<Vec3b>(i, j)[1] = Green;      dst.at<Vec3b>(i, j)[2] = Red;    }  }  return dst;}

效果

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

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

关于自动白平衡之完美反射算法原理及C++实现是怎样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。