一、算法背景

  白平衡是图像处理比较常见的一个概念,在采集图像的过程中,相机的感光元件或者镜头会对原始色彩造成影响,而白平衡技术通常可以用来校正这种光线和镜头对颜色影响。所以现在先记录一个白平衡算法,叫做完美反射算法,这个算法原理也不是有多复杂,但是效果还是挺好的,而且基本也不需要调节参数就有效果了。完美反射算法很多博客都有介绍,而且实际上也还是就几个公式,所以我也是简单记录重要的公式和实现代码而已。

二、算法原理

  完美反射算法(perfect Reflector, 也有叫镜面法的)认为,一幅彩色图像中,"镜面"是可以完全发射光源照射在物体上面的光线,因此,如果图像中存在一个“镜面”的话,那么在特定光源下,可以将所获得的"镜面"的色彩信息认为是当前光源的信息[1],那么在这个假设下,图像中就一定存在一个纯白色的的像素或者最亮的点,在对图像进行白平衡调整的时候会以该点作为参考来校准图像的像素。完美反射算法流程如下:
  (1)、遍历原始图像,统计RGB三通道之和的直方图;
  (2)、遍历原始图像,找到RGB三通道各自的最大值BmaxGmaxRmax
  (3)、设定比例 r ,对RGB之和的直方图进行倒叙遍历,找到使白点像素个数超过总像素个数比例的阈值,T
  (4)、遍历原始图像,计算RGB之和大于 T 的像素,各个通道取平均,得到BavgGavgRavg
  (5)、遍历原始图像,分别计算RGB三通道的调整值Aout=A / Aavg * Amax
  (6)、防溢出处理,这里可以采用简单的截断即可。

三、主要代码

  代码也没优化,就这样哈。

int histRGBSum[255 * 3 + 1] = { 0 };//统计R+G+B
uchar maxValue[3] = { 0 };
for (int i = 0; i < src.rows; i++)
{const uchar *ptrSrc = src.ptr<uchar>(i);for (int j = 0; j < src.cols; j++){int sum = *(ptrSrc + 3 * j) + *(ptrSrc + 3 * j + 1) + *(ptrSrc + 3 * j + 2);histRGBSum[sum]++;maxValue[0] = std::max(maxValue[0], *(ptrSrc + 3 * j));maxValue[1] = std::max(maxValue[1], *(ptrSrc + 3 * j + 1));maxValue[2] = std::max(maxValue[2], *(ptrSrc + 3 * j + 2));}
}//计算R+G+B的数量超过像素总数的ratio的像素值
double sum = 0.0;
int thresholdValue = 0;
for (int i = 765; i >= 0; i--)
{sum += histRGBSum[i];if (sum > src.rows * src.cols * ratio){thresholdValue = i;break;}
}//计算R+G+B大于阈值的所有点的均值
double avgB = 0.0;
double avgG = 0.0;
double avgR = 0.0;
int pixCount = 0;
for (int i = 0; i < src.rows; i++)
{const uchar *ptrSrc = src.ptr<uchar>(i);for (int j = 0; j < src.cols; j++){int sum = *(ptrSrc + 3 * j) + *(ptrSrc + 3 * j + 1) + *(ptrSrc + 3 * j + 2);if (sum > thresholdValue){avgB += *(ptrSrc + 3 * j);avgG += *(ptrSrc + 3 * j + 1);avgR += *(ptrSrc + 3 * j + 2);pixCount++;}}
}
avgB /= pixCount;
avgG /= pixCount;
avgR /= pixCount;//量化0-255
cv::Mat dst = cv::Mat::zeros(src.size(), src.type());
for (int i = 0; i < src.rows; i++)
{const uchar *ptrSrc = src.ptr<uchar>(i);uchar *ptrDst = dst.ptr<uchar>(i);for (int j = 0; j < src.cols; j++){double blue = (double)*(ptrSrc + 3 * j) / avgB * maxValue[0];double green = (double)*(ptrSrc + 3 * j + 1) / avgG * maxValue[1];double red = (double)*(ptrSrc + 3 * j + 2) / avgR * maxValue[2];blue = std::min(std::max((double)0, blue), (double)255);green = std::min(std::max((double)0, green), (double)255);red = std::min(std::max((double)0, red), (double)255);*(ptrDst + 3 * j) = (uchar)blue;*(ptrDst + 3 * j + 1) = (uchar)green;*(ptrDst + 3 * j + 2) = (uchar)red;}
}
return dst;

四、算法结果

  原图、结果,这个算法比灰度世界稍微复杂一丢丢丢,效果还是挺好的,与灰度世界算法各有优势吧。

朝发披香殿,夕济汾阴河。
于兹怀九逝,自此敛双蛾。
沾妆如湛露,绕臆状流波。
日见奔沙起,稍觉转蓬多。
朔风犯肌骨,非直伤绮罗。
衔涕试南望,关山郁嵯峨。
始作阳春曲,终成苦寒歌。
惟有三五夜,明月暂经过。
– 南北朝 沈约 《昭君辞》

白平衡之完美反射算法相关推荐

  1. JavaCV - 白平衡(完美反射算法)

    一.效果图 如图所示,左侧为原图,右侧是白平衡处理后的图片 二.实现原理 白平衡的意义在于,对在特定光源下拍摄时出现的偏色现象,通过加强对应的补色来进行补偿,使白色物体能还原为白色. 完美反射算法是白 ...

  2. OpenCV-白平衡(完美反射算法)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 实现原理 白平衡的意义在于,对在特定光源下拍摄时出现的偏色现象,通过加强对应的补色来进行补偿,使 ...

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

    自动白平衡之完美反射算法原理及C++实现 原文:https://blog.csdn.net/just_sort/article/details/85982871 算法原理 https://www.cn ...

  4. 白平衡算法简单原理以及灰色世界、完美反射实现

    这篇文章是一次课程作业,发到网上以供参考,由于时间有点紧张导致有些部分不够详尽以及有些方法没有实现,之后如果有机会再进行补充. 作业要求 以下两题任选一道完成,自选合适的测试图象,提交代码.实验结果和 ...

  5. 基于灰度世界、完美反射、动态阈值等图像自动白平衡算法的原理、实现及效果...

    原文:http://www.cnblogs.com/Imageshop/archive/2013/04/20/3032062.html 白平衡是电视摄像领域一个非常重要的概念,通过它可以解决色彩还原和 ...

  6. 基于灰度世界、完美反射、动态阈值等图像自动白平衡算法

    文章目录 一.灰度世界算法 二.完美反射算法 三.动态阈值算法 一.灰度世界算法 C++ 算法: 灰度世界 灰度世界算法(Gray World)是以灰度世界假设为基础的,该假设认为对于一幅有着大量色彩 ...

  7. awb数据怎么计算_白平衡自己主动(AWB)算法---2,颜色计算

    本文说明了白平衡算法估计当前场景的色温过程. 色温计算的原理并不复杂,但要做到,还是一道,认真做好每一步,这需要大量的测试,和算法一直完好. 关于该过程首先简要: 1, 取的图像数据,并划分MxN块, ...

  8. 数字图像处理(3) — 基于白平衡的人脸美白算法

    前言 上篇文章介绍了基于VC++的人脸美颜软件的具体原理和编程细节,其中提到了美白效果由于难度和时间关系,借用了另一套图像增强-非锐化掩蔽算法.本篇将着重介绍白平衡人脸美白算法,并给出基于MATLAB ...

  9. 基于opencv的 SNR,GAMMA,色差,饱和度,曝光误差,白平衡误差的自动化算法开发

    imatest利用24色卡colorchecker模块计算SNR,GAMMA,色差,饱和度,曝光误差,白平衡误差. 1.SNR SNR主要计算中心灰的最大最小信号差与标准差的比值,用来表征信噪比,当时 ...

最新文章

  1. 希望的背后……感谢青鸟、感谢51cto、感谢帮助过我的人们
  2. 基于phantomJS实现web性能监控
  3. Integer Sequence Dividing
  4. 对 sql server 数据库的备份进行加密
  5. Anthem库的Google Suggest 实现
  6. SAP Spartacus 最后渲染出的页面和后台 CMS 页面元数据的一一对应
  7. 【UOJ#188】Sanrd(min_25筛)
  8. 关于Java里如何跳出一个多重循环
  9. IPFS的相关操作命令
  10. 我是Leader,我被降职成了普通员工,HR说:公司要梯队年轻化
  11. 【数据库题型大总结】应用题总结
  12. php设置文字大小、,html字体大小怎么设置
  13. Active Directory之强制占有操作主机
  14. 导入web项目运行报错找不到包
  15. php导航自助收录源码,最近网上流行的导航网秒收录网站php源码
  16. 就这样吧,从此山水不相逢
  17. 中介房屋买卖合同及违约责任
  18. 你有一个程序员的男朋友
  19. 一个有趣的问题 : α_β_γ_δ_ε_ζ_η_θ_ι_κ_λ_μ_ν怎么读
  20. 雷达信号处理算法:静态杂波滤除(附MATLAB代码和数据)

热门文章

  1. 恢复服务器删除文件,恢复服务器删除文件夹
  2. 【论文笔记】GaitSet: Regarding Gait as a Set for Cross-View Gait Recognition
  3. win10如何设置或取消屏保密码
  4. 关于学习开展微信公众号前期推广
  5. java简单通讯录实现
  6. job处理缓慢的性能问题排查与分析(r4笔记第18天)
  7. codeforces Cthulhu 简单图论
  8. win10 右下角网络图标消失解决方案
  9. vue中使用Echarts绘制K线图
  10. 《Docker系列》Docker安装Hadoop