千家信息网

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

发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,这篇文章给大家介绍自动白平衡之完美反射算法原理及C++实现是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前言昨天介绍的灰度世界算法是最原始的处理白平衡的算法。今天要介绍的
千家信息网最后更新 2025年02月03日自动白平衡之完美反射算法原理及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(i, j)[0]);      MaxVal = max(MaxVal, (int)src.at(i, j)[1]);      MaxVal = max(MaxVal, (int)src.at(i, j)[2]);      int sum = src.at(i, j)[0] + src.at(i, j)[1] + src.at(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(i, j)[0] + src.at(i, j)[1] + src.at(i, j)[2];      if (sumP > Threshold) {        AvgB += src.at(i, j)[0];        AvgG += src.at(i, j)[1];        AvgR += src.at(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(i, j)[0] * MaxVal / AvgB;      int Green = src.at(i, j)[1] * MaxVal / AvgG;      int Red = src.at(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(i, j)[0] = Blue;      dst.at(i, j)[1] = Green;      dst.at(i, j)[2] = Red;    }  }  return dst;}

效果



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

算法 反射 原理 图像 j++ 参考 C++ 像素 内容 更多 白点 帮助 不错 原始 最大 世界 亮点 代码 兴趣 分量 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 辽宁服务器硬盘销售 开平区企业网络技术不二之选 常见的关系型数据库表示的数据 联通网络安全生产组职责 索尼影像数据库文件未就绪 怎么查数据库正在运行的会话 不间断数据库切换 老电脑网络连接正常找不到服务器 云服务器1月6 你是如何看待网络安全工作的 方舟组合服务器多少钱 平谷区正规软件开发职责 服务器nvme硬盘安装 网络安全和信息化工作月报 想转网络安全专业 我的世界网页怎么进入服务器 怎么用高级筛选重复数据库 管理口安装服务器系统 导出数据库图片工具 大连软考中级数据库培训班 网络安全管理和网络运营 根服务器 数据库系主任是什么意思 u8升级数据库路径文件访问错误 网络安全自主检查表 宣城求职招聘软件开发费用 河南道源盈网络技术有限公司 网络安全落实应急值守措施 asp实时修改数据库记录6 互联网会不会阻碍科技发展
0