张秀清,赵世祺,王晓君
(河北科技大学 信息科学与工程学院,河北石家庄,050000)
可见光成像技术能够将场景的不同光照强度映射成相应的图像灰度,获取的图像包含了丰富的场景形貌信息,因此被广泛应用于关键参数检测[1]、目标识别与分类[2]、设备状态监控[3]和公共安防监视[4]等领域[5]。可见光成像技术离不开自动曝光算法,自动曝光算法用于在相机景物亮度发生变换时实时调整相机曝光时间,使图像亮度值保持在一个合适的范围内[6]。当前的自动曝光技术主要基于测光系统,通过感光元件(如光电二极管)对光线进行测量,并根据预设的曝光模式(如中央重点测光、点测光、评价测光等)来调整曝光参数。这种技术相对简单易用,广泛应用于各类相机设备中。然而,现有的自动曝光技术仍然存在一些问题,由于光线条件的复杂多变性,自动曝光系统往往难以准确判断正确的曝光值,导致过度曝光或欠曝光的情况。对此,本文提出了一种基于FPGA 的自动曝光算法与设计。
如图1 所示,系统由三个模块组成,分别为图像接收模块、图像缓存模块和自动曝光模块。其中,图像接收模块负责接收从传感器传来的图像数据,并在内部对图像数据进行处理,包括数据对齐、数据采集、串并转换等,最终输出并行的图像数据以及后续传输,并转换了写和读的时钟域,最终给出以读取地址起始的连续的4 个图像数据和读时钟域下的帧起始等信号;自动曝光模块首先根据行间隔缓存一行图像数据,然后根据设置的起始列和列间隔进行像元抽样,输出抽样的采样点数据和抽样数量,并依此计算出当前的图像灰度均值,连续进行采样时需要的帧起始等信号;图像缓存模块中利用两组双口SRAM 进行乒乓缓存的处理,以确保图像灰度均值连续与目标灰度阈值进行比较,不断调整曝光时间,最终将曝光时间输出给传感器。
图1 整体框图
模块采用Xilinx 公司ZYNQ 系列的FPGA 芯片作为核心芯片,通过对传感器输出的图像数据信号进行逻辑处理和时序调整,计算曝光时间,完成了自动曝光功能。根据模块功能需求分为图像接收模块、图像缓存模块和自动曝光模块三部分。
图像接收模块分为三个部分,分别为数据采样模块、串并转换模块和标志生成模块。其结构框图如图2 所示。
图2 图像接收模块结构框图
2.1.1 数据采样模块
数据采样模块负责接收传感器发送来的图像数据pic_data,并对数据进行延时以及采样,此采样为DDR 采样,输出pic_sam_data_0 为上升沿采集的数据,输出pic_sam_data_1 为下降沿采集的数据。由于9 位采样数据为串行输出,所以对应连接9 组串并转换模块。
2.1.2 串并转换模块
每组串并转换模块负责接收数据采样模块发送来的两组数据,并对数据进行串行数据转并行数据的处理,最终输出12 位的data_out 并行数据。
2.1.3 标志生成模块
标志生成模块负责接收格式整理模块发送来的9 组图像数据,在其中经过一系列处理之后输出图像数据和一系列标志位发送给图像缓存模块。具体实现方式如下:输入的9组图像数据中,前8 组为图像数据通道、第9 组为控制数据通道。对应数据采样模块的9 位图像数据输入,前8 位为图像数据通道,第9 位为控制数据通道。
根据控制通道低3 位的变化,可以得到帧起始标志s_fs、像素点完成标志s_pd、行完成标志s_ld、帧完成标志s_fd、行计数标志s_lowc、列计数标志s_colc,图像数据经过延时与标志数据同时输出。其中,帧起始标志s_fs、行完成标志s_ld 和帧完成标志s_fd 均为脉冲信号。
当检测到控制通道低3 位为“111”时,产生帧起始标志s_fs;当控制通道低3 位为“111”时,持续输出像素点完成标志s_pd 和并行图像数据pic_data,同时累加并输出列计数s_colc。当列计数s_colc 达到一行的像素数量并且检测到控制通道低3 位由“111”变为“000”时,产生行完成标志s_ld,列计数清零,同时累加并输出行计数s_lowc。
图像缓存模块负责接收图像接收模块发送过来的8 组图像数据和标志位,以行为单位,采用乒乓的方式对接收的图像进行缓存,首先将一行的图像数据存入乒缓存中,缓存完成后将下一行图像数据存入乓缓存中,同时将乒缓存中的图像数据读出后发给自动曝光模块;当乓缓存完成后,将下一行图像数据存入乒缓存中,同时将乓缓存中的图像数据读出后发给自动曝光模块。图像缓存模块框图如图3 所示。
图3 图像缓存模块结构框图
2.2.1 乒乓缓存
乒乓操作是一种用于数据流控制的处理技巧。典型的乒乓操作方法如图4 所示[7]。数据缓存模块可以为任何存储模块,在本文中使用的是双口SRAM(TPSRAM)。
图4 乒乓的典型操作框图
2.2.2 实现方法
在测度基本公共服务水平的前提下,进一步计算出不均等程度的指标。对于各个省份和直辖市,同样也建立基本公共服务水平测度指标,如表2所示。
图像缓存模块采用两个缓存块进行乒乓操作,分别称为TPSRAM-1 和TPSRAM-2,每个缓存块包含2 个双口SRAM共同进行读写操作,每个双口SRAM 缓存4 组图像数据,所以每个缓存块可以缓存进输入的8 组图像数据。
当输入像素点完成标志W_s_pd 为“1”时,累加写入数据标志。当输入行完成标志W_s_ld 为“1”时,如果缓存的数据开始且是需要缓存的行,则缓存完成4 个数据,开始一次写入,将列计数的高位作为写入地址,并将该行标为缓存行,同时切换写入缓存块,并且更新当前需要缓存的行,即加上预设行间隔,将行完成标志取反。检测行完成标志信号的电平变化,一旦出现变化则将输出行完成标志R_s_ld 置为“1”,并切换读取缓存块。同时,读取列地址R_addr 的最高位用于切换同一个缓存块中的2 个双口SRAM。R_en 用作缓存块的读使能。以此实现图像缓存和读取的乒乓操作,能够使图像数据不间断进行传输。
自动曝光模块分为两个部分,分别为像素采样模块和曝光时间计算模块。其结构框图如图5 所示。
图5 自动曝光模块结构框图
2.3.1 采样模块
自动曝光算法最重要的判据就是目标景物的图像亮度均值[8]。像素采样模块负责对抽样缓存的每一行图像数据按照设置好的起始列和列间隔进行像素采样,直至一帧图像结束,输出采样的像素数据和像素计数给曝光时间计算模块。具体实现方式如下:如果图像行完成标志s_lowd 有效,表明一行的缓存完成,则启动一行的读取,并置读使能R_en为高电平,读取列地址R_addr 清零,而后每读取一组并行图像数据,读取列地址R_addr 加一,直至此行的全部列读完,启动下一行的读取。而后可以开始处理符合要求的一行图像数据,如果行计数s_lowc 等于设定好的起始行,则开始进行采样,根据设定好的起始列和列间隔对像素数据进行抽样,输出给采样数据sam_data,同时每输出一个数据,采样计数sam_cnt 加一,像素采样完成信号pix_done 起一个脉冲。而后根据设定好的行间隔依次对每一行图像数据进行采样输出,最终一帧图像全部采样完成时,采样完成信号sam_done 起一个脉冲。
2.3.2 曝光时间计算模块
曝光时间计算模块负责根据采样模块发送过来的采样数据和采样计数计算出当前图像的图像灰度均值gray_average,并据此计算出自动曝光时间输出给传感器。具体实现方式如图6 所示。
图6 曝光时间计算模块流程图
其中,计算图像灰度均值公式为:
式(1)中:M为图像灰度均值gray_average;D为采样数据sam_data;n为采样计数sam_cnt。当计算出来的图像灰度均值处于提前设定好的最小值和最大值之间时即可输出自动曝光时间,此次自动曝光成功。如果计算出来的图像灰度均值偏大或者偏小则需进一步调整曝光时间。
计算曝光时间的公式为:
式(2)中:cT为计算所得曝光时间;T为当前曝光时间;G为目标图像灰度均值;Mc为计算所得图像灰度均值;M为图像灰度均值。其中Mc为M将最高位替换为0 的结果。
每调整一次曝光时间,曝光计数exposure_cnt 加1,如 果exposure_cnt计数到10 依然没有曝光成功,则输出自动曝光失败;如果exposure_cnt 计数尚未到10 但是计算所得曝光时间 已经达到了预设的最大值,则输出自动曝光失败。若曝光成功则输出自动曝光开始信号auto_exp_start 再开始一次曝光,同时更新自动曝光时间信号auto_exp_time 为当前的曝光时间 。曝光结束之后置auto_exp_done 为“1”。当正在自动曝光时,自动曝光状态auto_exp_status 输出X“11”;当自动曝光成功时,自动曝光状态auto_exp_status 输出X“22”;当自动曝光失败时,自动曝光状态auto_exp_status 输出X“FB”。
ModelSim 是由Mentor Graphics 公司开发的一种集成开发环境(IDE),专门用于数字和混合信号系统的硬件设计仿真和验证。它基于Event-driven 模拟技术,使用硬件描述语言(如VHDL 和Verilog)来描述和模拟电路行为。使用Xilinx 的集成开发环境Vivado 2019.1 联合ModelSim进行逻辑功能实现以及相应的仿真测试。本次模块设计采用层次化设计思想,将复杂的设计简化为模块化设计。由于FPGA 的纵隔实现周期较长,设计使用Testbench 模型提供系统激励来进行功能仿真测试。
使用自定义的传感器作为数据源,接收自动曝光模块发来的输出8 位图像数据和1 位控制数据共9 位,发送给图像接收模块。根据不同的原始图像数据,对回路中各个模块进行仿真实验。系统时钟设置为40MHz,Testbench 例化自定义传感器给入图像数据流。
图7 为图像缓存模块的仿真图,两个缓存块读写数据交替进行,实现了乒乓操作,图像数据可以连续不间断进行传输。
图7 图像缓存模块仿真结果
如图8 所示,当输入正常的图像数据时,最终自动曝光成功,置自动曝光完成信号auto_exp_done 为“1”,自动曝光状态由X“11”变为X“22”,输出自动曝光开始信号auto_exp_start,并输出自动曝光时间auto_exp_time;如图9 所示,当输入全黑的图像数据时,在曝光计数exp_cnt 达到10 次后,自动曝光失败,置自动曝光完成信号auto_exp_done 为“1”,自动曝光状态由X“11”变为X“FB”。
图8 自动曝光成功
图9 自动曝光失败
由图8、图9 可以看出,两种情况自动曝光成功和自动曝光失败输出的信号时序完全正确,由输入的图像数据可以实现对自动曝光的控制,可充分验证本算法的正确性。
本模块设计在基于FPGA 的环境下,采用VHDL 和Verilog 硬件描述语言进行编程设计。对此种自动曝光的算法设计进行了详细介绍,将图像灰度采样、乒乓缓存等运用到系统中,给出模块设计方案。对模块功能进行仿真验证,实现了一种基于FPGA 的自动曝光算法设计,具有很实用的参考和工程价值。