基于FPGA的自动白平衡算法实现

1 概述

       在机器视觉中,白平衡(White Balance)是很多彩色成像设备的必备功能。白平衡按照校准方式可分为自动白平衡和手动白平衡。

       首先,白平衡的提出是由于不同环境下不同的光源具有不同的色温,即不同的光谱分布。也就是说在不同光源的光照条件下彩色图像传感器所拍摄的“白色”在人眼看来是不同的。这是由于传感器的光谱响应特性是固定的,在不同色温下会产生色偏。而人眼具有颜色恒常性,可以避免光源变化带来的颜色变化。白平衡就是要校正图像传感器与人眼之间的颜色偏差,使传感器的色彩符合人眼的视觉特性。

       白平衡一般通过调节传感器输出图像R、G、B三个通道的增益系数来实现。

       手动白平衡一般是针对特定色温的光源用白色物体进行标定,计算出3个增益系数。

       而自动白平衡(Auto White Balance),就是根据所拍摄物体的颜色分布自动计算并调节R、G、B三个通道的增益系数。 

       有一些CMOS图像传感器带有自动白平衡功能,可直接使用。对于没有自动白平衡功能的CMOS传感器,就需要在接收端设计开发相应的自动白平衡算法,来动态控制CMOS的R、G、B三通道增益系数。

       目前,很多CMOS传感器使用FPGA芯片作为图像接收端。本文介绍一种可在FPGA中实现的自动白平衡算法,该算法平衡了算法的复杂度与成像效果,可实时计算每幅图像的RGB增益系数,并应用于高速成像领域。

       算法原理来自一篇论文:

Combining Gray World and Retinex Theory for Automatic White Balance in Digital Photography. Edmund Y. Lam, Member, IEEE

2 Gray World Retinex自动白平衡算法

       该方法其实是在QCGP算法上做了一些改进。关于QCGP算法此处不作介绍,可搜索相关博客文章。QCGP算法的计算公式如下,以R通道为例。

       设Rave、Gave、Bave为图像中RGB分量的均值,Rmax、Gmax、Bmax各为RGB 分量的最大值。

       根据上述2组公式得出2个校正系数u和v,最后经过白平衡校正后的Rwb为:

       同理,G和B通道也可通过上述公式计算。

       Gray World Retinex算法在此基础上进行改进,不对G通道进行校正,只对R和B通道进行校正。以R通道为例,计算公式为:

       根据上述公式得出2个校正系数u和v,最后经过白平衡校正后的Rwb为:

       同理,B通道也可通过上述公式计算。

       显然,此算法利用了人眼对于绿色最为敏感的特性。

        该算法的matlab程序如下:

function [I1] = f_awb_retinex(I0)
% Combining Gray World and Retinex Theory for Automatic White Balance in Digital Photography
R0 = I0(:,:,1);
G0 = I0(:,:,2);
B0 = I0(:,:,3);
[m,n] = size(R0);

%找到RGB最大值
Rmax = double(max(max(R0)));
Gmax = double(max(max(G0)));
Bmax = double(max(max(B0)));

R2max = (double(Rmax))^2;
G2max = (double(Gmax))^2;
B2max = (double(Bmax))^2;

%计算RGB均值
Rave = double(mean(R0(:)));
Gave = double(mean(G0(:)));
Bave = double(mean(B0(:)));
 
R2ave = (double(Rave))^2;
G2ave = (double(Gave))^2;
B2ave = (double(Bave))^2;

%反解参数u'v'即xr1,xr2,xr1,xr2
Ar = [R2ave,Rave;R2max,Rmax];
Ab = [B2ave,Bave;B2max,Bmax];
B = [Gave;Gmax];

xr = Ar\B;
xb = Ab\B;

%计算R, B分量白平衡
for i=1:1:m
    for j=1:1:n    
        R1(i,j)=xr(1)*(double(R0(i,j)))^2 + xr(2)*double(R0(i,j));
        B1(i,j)=xb(1)*(double(B0(i,j)))^2 + xb(2)*double(B0(i,j));
    end
end

R1 = uint8(R1);
B1 = uint8(B1);
G1 = uint8(G0);

%合成
I1(:,:,1) = R1;
I1(:,:,2) = G1;
I1(:,:,3) = B1;

end

3 算法效果对比

4 FPGA实现

       首先根据计算公式,在FPGA中要依次统计RGB三通道的均值、最大值,并计算均值和最大值的平方。其次,要根据方程组分别解出R和B通道的2个校正系数u和v。最后,按照校正公式将u、v代入计算出校正后的R和B。

       针对1280*1024,8bit图像的自动白平衡算法模块资源消耗如下:

       需要算法FPGA源码请私信。

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
以下是一个简单的FPGA白平衡算法代码示例。请注意,此代码实现仅用于说明算法实现的基本思路,实际情况下可能需要进行更多的优化和调整。 ```verilog module white_balance ( input clk, input rst, input [7:0] r_in, input [7:0] g_in, input [7:0] b_in, output reg [7:0] r_out, output reg [7:0] g_out, output reg [7:0] b_out ); reg [7:0] r_sum = 0; reg [7:0] g_sum = 0; reg [7:0] b_sum = 0; reg [7:0] count = 0; always @(posedge clk) begin if (rst == 1) begin r_sum <= 0; g_sum <= 0; b_sum <= 0; count <= 0; end else begin r_sum <= r_sum + r_in; g_sum <= g_sum + g_in; b_sum <= b_sum + b_in; count <= count + 1; end end wire [7:0] r_avg = r_sum / count; wire [7:0] g_avg = g_sum / count; wire [7:0] b_avg = b_sum / count; always @(posedge clk) begin if (rst == 1) begin r_out <= 0; g_out <= 0; b_out <= 0; end else begin r_out <= r_in * 256 / r_avg; g_out <= g_in * 256 / g_avg; b_out <= b_in * 256 / b_avg; end end endmodule ``` 这个代码模块包括了一个时钟信号clk、一个重置信号rst,以及输入RGB值和输出RGB值。在时钟上升沿时,每次输入RGB值时,对应的RGB分量的总和将会累加到r_sum、g_sum和b_sum中,同时count变量也会增加。在下一个时钟上升沿时,将通过平均化计算出R、G、B三个通道的平均值,然后将RGB值除以平均值,从而实现白平衡。 请注意,这个代码示例并没有包括任何流水线或其他优化技术,因此可能需要进行更多的修改和优化才能适应实际情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MmikerR

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值