基于FPGA 的微光图像处理
2022-06-13陈文明
陈文明
(1.中航华东光电有限公司,安徽 芜湖 241002;2.特种显示技术国家工程实验室,安徽 芜湖 241002)
0 引 言
目前,像增强器作为主流器件被用于微光夜视系统中,但是随着CMOS 图像处理器技术的不断发展和进步,尤其是SOI(绝缘衬底硅)、BSI(背照结构)等新技术的出现,极大提升了CMOS 图像处理器的光敏度和成像质量。同时,CMOS 技术兼容性高,具有低电压驱动、低功耗、高分辨率的特点,在夜视系统中逐渐被应用。但是由于CMOS 图像处理器中的模拟电路较多,导致电路的一致性很难控制,因此成像图像的均匀性较差,而且在低照度情况下,底噪声严重。为了提升最终显示图像的效果,需要根据CMOS 图像处理器在低照度下输出图像的特点,针对性地进行图像处理[1]。本文采用现场可编程逻辑门阵列(Field Programmable Gate Array,FPGA)作为图像处理的主控制器,实现CMOS 的驱动、图像的采集、坏点的矫正、噪声的去除以及图像增强等图像处理操作,保证微光系统能够输出干净、清晰、对比度高的视频图像。
1 微光图像处理系统硬件组成
微光图像处理系统的硬件电路部分如图1 所示,由CMOS 传 感器、FPGA、SRAM、DVI 编码器、通信接口以及各个电源模块组成。CMOS 传感器是微光视频的采集终端,对微弱的光信号进行采集、放大、数模转化及读出等操作,实现光电转化的功能,并将采集的视频按一定的视频格式传输给FPGA,以进行下一步的处理和控制[2]。FPGA 是主控制模块,负责电路的总体控制、视频接口的实现以及针对视频数据进行降噪、增强处理;SRAM 是视频数据的存储模块,配合相应的视频处理算法,实现需要数据的读写控制操作;DVI 编码芯片负责数字视频信号向DVI 信号的转化,主要完成DVI 编码;通信方式采用RS-422 接口,主要完成对微光夜视仪的控制以及工作状态的反馈。
图1 电路整体框图
2 微光图像处理算法的FPGA 实现
2.1 FPGA 视频处理架构
本文采用的CMOS 图像传感器的分辨率为1 920×1 080,需要处理的数据量非常大,而且要求具有实时显示的功能,通过软件中断很难实现。而FPGA 是一种并行架构,通过Verilog DHL 或者VHDL 语言描述的电路,被编译成具体的数字电路在FPGA 内部并行运行,所以使用FPGA 来处理数字图像,具有吞吐量大、处理速度快的特点。因此,本文的夜视图像处理系统的主控制器选用的是Xilinx 公司的Artix 7 系列FPGA。FPGA 主要实现的功能有采集移动产业处理器接口(Mobile Industry Processor Interface,MIPI)信号转化为数字信号以便后续模块的处理,由于CMOS 图像传感器以MIPI接口输出视频信号,通过FPGA 的LVDS 接口搭配外围的电阻网络将MIPI 信号进行转化;CMOS 上电后需要对其内部寄存器进行配置,使其进入正常的工作模式,同时在使用过程中,需要根据环境调整相关参数,来使CMOS 适应外部环境,使其工作在最佳状态。CMOS 输入的信号在照度极低的情况下会产生严重的噪声,通过相应的算法将其去除;由于低照度图像的灰度较低,图像总体的对比度较低,不易于人眼识别,所以要对去噪后的图像进行灰度拉升,提升对比度,即增强处理[3]。FPGA 内部主要的功能框图如图2 所示。
图2 FPGA 内部功能模块
2.2 FPGA 代码实现
2.2.1 坏点矫正
CMOS 图像传感器上有呈阵列排列的像素点。每个像素点是一个感光单元,根据光强将光信号转化为电信号,被像素下的采样电路接收和转化。由于像素阵列在制作过程中存在工艺上的差异,或者在光信号转化电信号的过程中出现错误,都会造成输出图像上的像素信息出现错误。直观的表现是坏点的灰度与周围的像素点不一致,存在很大的差别,一般为亮点或是暗点,这样的点就被称作坏点。在坏点尺寸不是很大的情况下,可以通过算法对图像进行修复[4]。
以图3 所示的坏点矫正区域为例,在3×3 的区域内,通过比较算出区域中最大值Pmax,次大值Pmax1,最小值Pmin,第二小值Pmin1以及此区域的平均亮度Pyav。根据数据之间的关系,判断当前点是否为坏点。如果是,就用区域内相互差异最小的两个点的均值来替代坏点的值。坏点矫正分为3 种情况。
图3 坏点矫正3×3 区域
(1)对于亮点的矫正。当同时满足|Pmax-P11|≥Th,|Pmax1-P11|≥Th,|4×(Pmax-Pmax1)|<|Pmax1-Pyav|。
(2)对于暗点的矫正。当同时满足|P11-Pmin|≥Th,|P11-Pmin1|≥Th,|4×(Pmin1-Pmin)|<|Pyav-Pmin1|。
(3)如果P11是坏点,就要用3×3 区域内差异最小的两个点的均值来替代;否者,输出P11。
坏点校正模块框图如图4 所示,其中line_sram模块是行缓存器,3 个line_sram 一起得到一个3×3 区域。badpix_control 模块对3×3 个数据进行判断和运算,判断当前数据是否为坏点。如果是,用计算数值替代,反之,直接输出[5]。
图4 坏点校正模块框图
2.2.2 视频去噪
CMOS 图像传感器由于其自身特点,在低照度成像难免会出现各种噪声,主要包括暗电流散射的噪声、暗电流复位噪声、放大器噪声以及光散射噪声等。这些噪声让图像处理变得异常复杂,所以在进行进一步处理之前要对视频图像进行去噪。常见的去噪方式有中值滤波、均值滤波以及高斯滤波,还有机遇时间域的帧间平均滤波。结合夜视图像的噪声特点,本文设计一种改进的双边滤波算法,能够有效地去除夜视图像的噪声,对图像的边缘和细节保护,而且不需要延时,实时性好。
双边滤波的数学表达式为:
式中:g(x,y)表示处理后数据,f(i,j)表示原始图像,ω(i,j)为加权系数,ωs(i,j)为距离对应的加权系数,ωr(i,j)为数值对应的加权系数。
考虑到算法的实时性和FPGA 的运行速率,以上电路采用流水线方式实现,在各个运算节点处需要插入触发器,注意ω(i,j)结束时间和f*w 的时间不在同一时刻,需要对ω(i,j)输出进行相应延时以和f*w 匹配。f*w 与ω(i,j)经过FPGA 自带的除法器计算,得到此区域的滤波后数据。算法效果如图6 所示,图像中的噪声部分被滤除,线条的边缘锐度变化较小。
图5 算法计算电路
图6 算法效果对比图
2.2.3 视频增强
夜视图像的灰度级都集中在较小的区间,而正常亮度下的图像灰度值在直方图中呈现均匀分布的状态。为了提升图像的对比度,需要对其进行增强处理。自适应直方图均衡(Adaptive Histgram Equalization,AHE)是一种比较适合在FPGA 中实现的算法。本文采用此算法进行图像的增强处理,来达到扩大局部对比度、平滑区域细节的作用。直方图均衡化的数学表达式为其中,k为灰度级,N为一幅图像的像素总点数。
在FPGA 中实现自适应直方图均衡,需要进行两步操作。首先,对整幅图像中的灰度进行统计,计算其出现的概率;然后计算每一个灰度级的累积分布函数;最后在下一帧通过累积分布函数计算输入图像的值,实现图像的增强。
如图7 所示,自适应直方图均衡模块由fifo、双口ram1、双口ram2、SRAM_CTRL 以及CDF_cal 控制模块组成。电路工作过程如下。
图7 自适应直方图均衡电路
当检测到VS 信号下降沿,对fifo 进行复位,同时启动对his_ram1 内部数据的清零。因为新的一帧图像的直方图数据会有差异,需要清零,重新记录。双口his_ram1 的端口A 为数据写入端,端口B 为数据读出端。直方图计算需要先从对应的地址读出数据,再将数据自增1,并写回his_ram1 的原地址。也就是说,一个新像素的直方图计算至少要3 个像素时钟。为了保证数据流的连续性,需要在输入视频数据和直方图计算模块之间加入缓存。本文采用fifo 进行缓存。当新的一帧视频数据输入后,在像素时钟和DEN 信号的控制下,将数据写入到fifo 中进行缓存。直方图计算模块监控到fifo 的empty 信号为0 时,从fifo 读出数据,读出时钟频率是像素时钟的3 倍。整个控制流程的状态转化如图8 所示。
图8 直方图计算的状态转换图
上电后,程序首先进入Idle 状态,当vs 信号出现低电平时vs_neg=’1’,状态跳转到ini_ram,在此状态现实对双口ram 的清零,地址从0 ~255 自增,对应地址的数据为0。当地址addr=255 时,ram 清零完成,状态切换到wait_data 状态。在wait_data状态监控fifo 的empty 信号状态,当empty=’0’,从fifo 读取数据,并跳转到rd_his 状态。在rd_his状态,以从fifo 读到的数据作为ram 的读地址,从此地址读取数据,并且将数据加1,同时跳转到wr_his状态。在wr_his 状态将自增后的数据写回到读出地址,并回到wait_data 状态,这样就完成了一个像素的统计。如此循环往复,直到一帧数据全部统计完,在wait_data 状态同时满足empty=’1’和field_over =’1’,完成一帧数据统计,返回到idle 状态,等待新一帧数据的统计。
完成一帧数据的直方图统计之后,开始计算这一帧的CDF 值。计算方式与直方图计算类似,从his_ram1 循环读取0 ~255 地址的数据,并将当前地址的数据与其前所有地址的数据相加,将相加结果写到his_ram2 对应的地址,直到地址达到255,计算完成。
由于直方图统计需要对一帧的所有数据进行统计,为了将计算的结果与对应的统计帧对应起来,需要将统计帧进行缓存,等计算继续后,在下一帧统计的过程中,按一定视频时序从SRAM 中取出,并在his_ram2 中进行查表,得到增强后的像素值。考虑到计算的方便,在最后输出视频的时候,对数据进行固定除数(除数为一帧图像的总点数)的除法计算,商即为最终输出像素数据。采用以上方法得到的图像增强效果如图9 所示。
图9 自适应直方图均衡后对比
3 夜视效果验证
为了验证夜视图像处理的效果,改进现有微光相机的FPGA 代码,增加了坏点校正、视频去噪以及视频增强算法。在夜晚环境照度5.4×10-4lx 下,对同一地点进行拍摄,通过监视器观察显示效果如图10 所示。其中,左边为原始效果,右边为处理后的效果。可以看出,处理后的图像清晰,边缘轮廓分明,对比度范围宽。总体而言,经过本文算法联合处理后,夜视视频图像的质量得到明显改善,图像中的细节清晰,所含噪声较少,同时,视频图像的总体亮度有提升,灰度之间的差异被拉开。对比度提升,能明显识别感兴趣区域,而且处理后视频更适合人眼的视觉观察效果。
图10 夜视视频图像处理前后效果对比
4 结 语
本文针对夜视CMOS 图像传感器的特点,研究了针对其图像质量提升的方法。首先对微光夜视系统的硬件组成进行介绍,进一步分析了基于FPGA的图像处理的架构,并且对具体的处理模块进行了详细的介绍,在理论分析的基础上,介绍了其在FPGA 中的详细实现过程和具体电路。本文主要论述了CMOS 图像传感器的坏点矫正、视频图像的噪声去除以及视频图像增强算法的FPGA 实现。最后通过夜晚户外实验来检验算法的有效性。通过实验对比,结果表明本文的算法能够有效改善夜视视频图像质量,能够提升图像细节,减少噪声,提升对比度,使得处理后的视频更适合人眼观察。