当前位置:   article > 正文

图像自动白平衡算法与FPGA实现_fpga 白平衡

fpga 白平衡

一、前言

白平衡,基本意义是不管任何光源下,都能将白色物体还原为白色,对特定光源下拍摄时出现的偏色现象,通过对应的补色进行补偿。日光灯下图像偏绿,钨丝灯下发黄,自然光下偏蓝。

二、算法原理

世界灰度法:该假设认为对于一幅有着大量色彩的图片,RGB三个分量的平均值趋向于同一个灰度K。首先求出图片RGB三个颜色分量的平均值Rmean Gmean Bmean,再求出图片的平均值,Fmean = (Rmean+ Gmean +Bmean)/3kr = Fmean/ Rmean既是红色分量的增益,R = r *kr即是白平衡后的图片的红色分量。绿色与蓝色同理。

三、MATLAB仿真实现

算法总体来说还是比较简单的,MATLAB实现也不困难,对比两图,发现左边的原图确实有点发黄,右边处理过后确实白色更白一点,更接近真实的颜色。

四、FPGA实现

芯片:A7100t

屏幕分辨率:1080P

图片分辨率:312*415

接口:HDMI

FPGA实现这个算法也不难,估计就是一个小时的时间,但是调试过程中发现如下几个问题:

1、在算法转换过程中数据溢出。

表现就是颜色错误,比如白色部分为黄色,蓝色颜色溢出。比如强度为255的颜色分量,图片的强度是100,颜色的强度是90,那么根据算法255*100/90 = 283,明显大于255,但是我在RGB888显示过程会忽略高位数据,那么283在显示中其实只有28,那么就会莫名其妙颜色不对。处理方法也很简单、粗暴,如果大于255就截断取255,小于255就取原值。

2、时序不收敛。

由于数学算法需要从脚本语言即MATLAB翻译成verilog语言,verilog是硬件描述语言,描述出的电路不同会影响时序。例如我一开始全部使用assign wire描述算法过程,setup slack最差-30多纳秒,总体有3000多纳秒的slack,直接导致屏幕都点不亮,后面改用流水线,发现setup slack下降到-16ns,屏幕能点亮,但是图片上有一些莫名其妙的颜色。通过查验时序报告,发现setup slack最差的时序路径是由kr = Fmean/ Rmean这个除法器带来的,这个就很尴尬了,因为除法是算法必需的过程,除法用减法来实现也是一个思路,但是比较麻烦、不直接。我是采用VIVADO自带的除法IP核,最后把setup slack降到了-2 ns,这个时候效果比较好了,这个-2 ns其实是Fmean = (Rmean+ Gmean +Bmean)/3过程的除法器带来了的。不过不影响整体效果,而且原因是同样的,就无所谓了。

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

闽ICP备14008679号