图像校色 白平衡调整
灰度世界算法(Gray World)是以灰度世界假设为基础的,该假设认为对于一幅有着大量色彩变化的图像, R、 G、 B 三个分量的平均值趋于同一个灰度K。一般有两种方法来确定该灰度。
(1)直接给定为固定值, 取其各通道最大值的一半,即取为127或128;
(2)令 K = (Raver+Gaver+Baver)/3,其中Raver,Gaver,Baver分别表示红、 绿、 蓝三个通道的平均值。
算法的第二步是分别计算各通道的增益:
Kr=K/Raver;
Kg=K/Gaver;
Kb=K/Baver;
算法第三步为根据Von Kries 对角模型,对于图像中的每个像素R、G、B,计算其结果值:
Rnew = R * Kr;
Gnew = G * Kg;
Bnew = B * Kb;
对于上式,计算中可能会存在溢出(>255,不会出现小于0的)现象,处理方式有两种。
a、 直接将像素设置为255,这可能会造成图像整体偏白。
b、 计算所有Rnew、Gnew、Bnew的最大值,然后利用该最大值将将计算后数据重新线性映射到[0,255]内。实践证明这种方式将会使图像整体偏暗,建议采用第一种方案。
一般来说,灰度世界算法的效果还是比较好的呢,并且该算法的执行速度非常之快,目前也存在了不少对该算法进行改进的效果,有时间我在整理一下。
原图 处理后的图
二、完美反射算法
当初写这个代码的时候的一些参考文献一下子也找不到了,就从已经写好的代码中描述下该算法的过程吧。
原理:完美全反射理论perfect Reflector假设图像上最亮点就是白点,并以此白点为参考对图像进行自动白平衡,最亮点定义为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]之间。
原图 Ratio=10% Ratio=2%
从效果上看,该算法应该比灰度世界的效果要好些,但是也还是受到Ratio这个参数的影像。特别是第二个图片,过高的Ration导致图片过于泛白。这个问题可以还是最后量化的哪一步引起的,我会抽空再研究一下其他的量化方式,尽量降低Ration的影响。
针对上述的第二步,看到很多matlab和VC的代码,有很多人居然先用快速排序对累加后的数据进行排序,然后再取其10%的最大值,对图像的数据进行排序,可能就是再快速的排序都快不起来吧,看到这,也许全国人民都笑了。
三、动态阈值算法
参考论文:A Novel Automatic White Balance Method For Digital Still Cameras
同经典的一些算法相同,算法分为两个步骤:白点检测和白点调整。
白点检测:
(1)为了增强算法的鲁棒性,原文将图像分成12部分,其中宽高比为4:3,关于这一点,我认为不合理,对图像不是通用的,后文再说。
(2)计算每个区域的Cb\Cr分量的平均值Mb/Mr。
(3)按下式计算每个区域的Cb\Cr分量的绝对差的累积值Db/Dr:
上式中N为每个区域的像素数。
(4)如果Db/Dr的值偏小,则我们忽略这一块,因为这表明这一块的颜色分布比较均匀,而这样的局部对于白平衡不好。这个偏小的准则我们稍微再谈。
(5)统计对于除了符合第四条的的其他区域的Mb/Mr/Db/Dr的平均值作为整幅图像的Mb/Mr/Db/Dr值。
关于这一条,原文的话是:The final Mb、Mr、Db、Dr are obtained by taking the average of those regions that pass this additional step。
我在实际中做的时候就是分别对每块进行的,似乎效果也还不错。
(6)按下述规则初步确定哪些点是属于白色参考点:
(7)对于初步判断已经属于白色参考点的像素,按大小取其亮度值为前10%的位最终确定的白色参考点。
白点调整:
(1)计算白色参考点亮度值的平均值Raver,Gaver,Baver,(各通道分开计算)。
(2)按照以下各式计算每个通道的增益:
式中,Ymax就是YCbCr颜色空间中Y分量的在整幅图像中的最大值。
(3)按照以下各式计算最终每个通道的颜色值:
其中R/G/B为在原始的颜色空间中的值,注意这里要进行溢出检测的。
简单的谈下白点检测的分块操作吧,原文把图像分成4*3的12快,这样做事针对于我们很多数码照片是这个比例的,如果通用,我觉得应该用每个块的大小来控制,比如每块为 100*100个像素。
这个算法的效果如下:
原图 块大小50*50 块大小100*100
上三图表明:1、该算法效果非常好;2、对块大小不太敏感,因此非常适合于自动化操作。
关于RGB到YCbCr的快速转换,可以参考:颜色空间系列3: RGB和YCbCr颜色空间的转换及优化算法
由于在上述链接的文章中,YCbCr颜色空间已经被转换到[0,255],因此白色检测部分的第(6)条中的sign函数就不需要了。
同样,提供个编译好的文件给有兴趣研究该算法的朋友看看效果:
http://files.cnblogs.com/Imageshop/AutoWhiteBalance.zip
后记:
针对动态阈值法,很多朋友反映如果YCbCr的值量化在0到255之间的话会出现所有的像素都会被式(6)初步判断为白色参考点。这样前期的工作就失去了意义,算法就变成了类似于完美反射算法那了,稍微有点不同的地方就是两者选择两点的准则有所不同。虽然这样做的最终结果还算不错,但确实和论文的本意像违背了,后面经过实践,如果把YCbCr的值量化在-127到128之间,式6中的Sgn同样适用,则初步判断为白点的数会大量的减少,对于同一个图片,同一个参数两个算法的最终的效果比较如下:
更新后的下载链接依旧如下,以增加了修正后的功能。
图像校色 白平衡调整相关推荐
- Mac电脑用预览功能调整图像大小?Mac调整图片大小方法
要说到修改一张图片的尺寸大小,很多人的第一反应通常是打开 Photoshop 或者 Pixelmator,其实使用苹果MAC电脑有更简单方便的方法来调整图片的大小尺寸,OS X 自带的快速预览功能就可 ...
- python实现图像的白平衡,破坏图像的白平衡(冷、暖)和调节图像的亮度
白平衡: 让实际环境中白色的物体在你拍摄的画面中也呈现出"真正"的白色.不同性质的光源会在画面中产生不同的色彩倾向,比如说,蜡烛的光线会使画面偏橘黄色,而黄昏过后的光线则会为景物披 ...
- PS初学——基本图像模式与调整(二)
灰度 在图像-模式里有一个灰度,点选后会由RGB模式变为灰色模式,只有一个灰色通道 而在图像-调整里有一个去色,点选后虽然颜色也变灰了,但颜色模式不会变,通道也不会变. 可以说灰度要比去色更彻底 点选 ...
- c语言实现图像resize函数,调整图像的尺寸 - cvResize() 函数实现
前言 有时会碰到一张图片太大了,想将它缩小.本文将讲解一个很好用的函数解决这个问题. 图像尺寸调整函数 cvResize() // 图像尺寸调整函数 void Resize ( const CvArr ...
- C#不改变图像长宽比例调整图像大小
在UI显示图片时,如果容器大小固定,而图片尺寸大于容器,那显示图片时会显示不全.有些容器(例如PictureBox)本身可以通过设置属性来改变图像大小,让图像大小自动适应容器,但这不能保证图像的长宽比 ...
- 关于Yolov5在测试时,图像大小被调整的问题
原数据大小为:1920*1080 detect.py中的imgsz设置为640,按照正常图像宽高的缩放,原数据缩放后应为:640*360 而detect.py的控制台输出却为:640*384,如下所示 ...
- matlab图像边缘宽度调整
目录 图像边缘宽度 单幅图像 原始方法 改善方法 单幅图像去除坐标轴 原始方法 改善方法 多幅图像 图像边缘宽度 单幅图像 原始方法 fig = figure; plot(peaks) saveas( ...
- 图像dpi像素调整方法
矢量图转位图jpeg,同时调dpi. pdf使用acrobat打开,导出为图像,选择jpeg,在设置选项里修改dpi. 236.22表示600dpi,118.11是300dpi,一般是300dpi起步 ...
- html5图像调整大小,JavaScript调整HTML5画布中图像的大小
因此,如果所有浏览器(实际上,Chrome 5给我提供了一个不错的浏览器)都无法为你提供足够好的重采样质量,你该怎么办?然后,你自己实现它们!哦,来吧,我们正在进入Web 3.0的新时代,符合HTML ...
- image.resize()==>返回此图像的大小调整后的副本
def resize(self, size, resample=BICUBIC, box=None, reducing_gap=None): """ 作用:Returns ...
最新文章
- solidworks画白色金属光泽_美人的共通点就是卧蚕,卧蚕真的太重要了,没有也要画出来...
- MySQL的主从服务器配置
- iOS子构建Debug运行正常Release运行失败,提示证书问题
- 高清变脸更快更逼真!比GAN更具潜力的可逆生成模型来了 | OpenAI论文+代码
- 【Spring注解系列04】@Condition条件注解
- JVM内存参数设置及常见错误总结
- Android usb 权限广播,android10.0 USB弹窗权限流程解析
- numpy的基本使用 附python代码详细讲解(numpy函数,创建数组,常用属性,索引切片,数组的复制,修改维度,数组的分割、拼接、转置)
- 访问不上服务器的任何端口
- Jupyter_notebook using(慢慢积累)
- 课程设计哈夫曼编/译码系统
- 无法获得下列许可solidworks standard无效的(不一致的)使用许可号码(-8,544,0) solidworks2020 (亲测有效)
- 在windows10上安装texlive的参考文档
- 安卓基础知识(一) 服务(Service)
- HTML:a标签锚点
- 实时行情难处理?睿凝资本选择DolphinDB解决流数据难题
- Momenta实习生第一次面试经历
- MsBuild.exe的坑
- 性能可靠塔式服务器,浪潮英信双路Xeon处理器小塔式服务器性能评测
- 中文语音识别系统ViaVoive使用实录