基于融合的弱光照图像增强算法及其FPGA实现——大磊

       在照明条件较差的环境中,由摄像头采集到的图像或视频的质量会下降。在道路监控、安防、或者消费类电子产品中,低照度图像将会影响系统的性能。

       我们将在本文中讨论一种基于“金字塔融合”的弱光照图像增强算法,并简要阐述在FPGA中实现该算法的架构。本章包括以下几个部分:

1简介

2 RGB与HSV相互转换

3 hdr_derived_input模块

4高斯与拉普拉斯金字塔分解与重构

1简介

       在日常生活中使用手机拍照时,拍摄的图像存在局部或者整体较暗的情况是很常见的。比如在夜间照明不良的情况下,拍摄的图像会呈现出整体亮度和对比度较低的特点。或者在背光拍摄时,由于曝光设置的限制,较亮的背景和较暗的前景中的目标很难同时被捕获,如下图所示:

图 1背光拍摄的照片

       图 1拍摄于北京长城,为了更好的展现出背景中连绵起伏的群山,导致前景中的人物偏暗。这个问题出现的根本原因是数字相机的动态范围有限。现实世界中的动态范围较宽,也就是说场景中光线的明暗差异较大。通过调整相机的曝光可以选择将有限的动态范围用于捕获较亮或者较暗的场景,但是很难同时者兼顾,因此图像会存在过曝或者欠曝的区域。

       在论文《Exposure fusion》(T. Mertens, J. Kautz, F. V. Reeth,2007)中提出可以使用多张不同曝光的图像进行融合,从而得到一个高质量的图像,如下图所示:

图 2 多张不同曝光图像的融合

       由于图 2中的方法需要对同一场景拍摄多张不同曝光的图像进行融合,因此不适合用于针对视频流的处理。但是论文中介绍的基于金字塔分解的多曝光图像融合方法非常具有启示意义,如下图所示:

图 3 基于金字塔分解的多曝光图像融合

        在图 3中对两张不同曝光的图像进行拉普拉斯金字塔分解,并对每张图像的权重图进行高斯金字塔分解,其中权重图用于衡量图像的对比度、饱和度等信息。在图像的欠曝和过曝区域通常呈现出灰度级平坦、缺少色彩等特征,这些区域被赋于较低的权重;而我们感兴趣的区域通常拥有较亮的颜色和更多的细节,它们应该被保留。

       从图 3的Weight Map中可以看出,第一张图片主要保留建筑、灯光以及较亮的天空区域,而第二张图则主要保留了建筑在水中的倒影、水面、以及较暗的天空区域。通过金字塔图像分解,可以在不同尺度上对两张图像的特征进行融合,从而避免最终混合得到的图像有明显的拼接痕迹。

      在论文《A Fusion-based Enhancing Method for Weakly Illuminated Images》中,提出了一种基于融合思想的弱光照图像增强方法。该方法采用图像金字塔分解技术,将多种经典图像增强算法融合,有效地取长补短,使增强后的图像能够同时克服对细节增强、对比度提升和主观感知效果等方面都兼顾的难题。同时,该方法的计算复杂度较低,易于实现。论文中提出的算法框架如下图所示:

图 4 基于融合的弱光照图像增强算法

       值得一提的是,该论文由厦门大学傅雪阳博士、曾德炉教授等人合作,并获得欧洲信号处理学会旗下的期刊Signal Processing 2020年度唯一最佳论文奖。不同于前面所提到的多张曝光图像的融合,图 4中的算法可以应用于单张图像,因此更适合视频流处理。本文将基于该算法框架进行FPGA架构设计,如下图所示:

图 5 基于融合的弱光照图像增强算法FPGA架构

       在图 5所示的FPGA架构中,最左侧输入的是弱光照条件下的RGB彩色图像,经过rgb_to_hsv模块将亮度、与饱和度和色调分离出来。分离出来的亮度信息将通过hdr_derived_input模块获取额外两张灰度图像,分别代表了亮度增强和对比度增强后的图像。此外hdr_derived_input模块还会计算出三张灰度图像各自的权重信息,模块输出的权重WEIGHT和亮度BRIGHT信息将按照图 3中所示的方法进行金字塔分解与融合。

       三个权重图像在gaussian_pyramid_3level模块中进行三层高斯金字塔分解,与此同时,三个亮度图像在laplacian_pyramid_3level模块中进行三层拉普拉斯金字塔分解。分解后的各层权重和亮度信息在gauss_laplace_fusion_level模块中进行融合,然后输入到reconstruct_pyramid_3level模块进行三层金字塔反向重构,重构得到的图像在增强了暗部区域的同时兼顾了图像的对比度。

       重构后的图像相比于输入的视频流会存在多行的延迟,因此需要在v_line_delay模块中对饱和度以及亮度信息延迟相同的行数,然后在stream_align_combine_hsv模块中对H、S、V三个通道进行对齐操作。对齐之后的HSV通道由hsv_to_rgb模块转换成彩色图像。整个设计的文件层次目录如下图所示:

图 6 顶层模块层次目录

2 RGB与HSV相互转换

       色彩空间从RGB转到HSV的转换公式如下:设(r,g,b)是红、绿、蓝三个颜色分量,它们的取值范围都是[0,1]。设max为r,g,b中的最大值,min为最小值。要求得HSV空间上的(h,s,v)值,这里色调h的范围是[0,360),饱和度s和亮度l的范围是[0,1]。

图 7 RGB转HSV

色彩空间从HSV转到RGB的转换公式如下:

图 8 HSV转RGB

3 hdr_derived_input模块

       hdr_derived_input模块用于从灰度图像中获取亮度增强和对比度增强的图像,加上原始的灰度图像,一共输出三张亮度图像用于后续的融合。同时输出的还有三张灰度图像所对应的权重图像,其FPGA架构如下图所示:

图 9 hdr_derived_input模块架构图

      图 9中的hdr_contrast_enhance模块采用线性对比度增强算法,用于提升图像对比度。Hdr_lut_gamma模块采用Gamma映射来提升图像亮度。h_stream_clk_delay模块用于对输入的原始灰度图像进行延迟,从而与对比度增强和亮度增强图像进行同步。

       接下来对三张灰度图像分别计算亮度权重和对比度权重。hdr_weight_bright模块用于计算图像中每个像素的亮度权重,对于曝光良好的像素具有更高的权重,对于过曝或者欠曝的像素具有较低的亮度权重。hdr_weight_contrast模块用于计算每个像素的对比度权重,需要注意的是对比度权重不仅考虑到亮度信息,而且要考虑到色彩信息,因此需要同时使用HSV三个通道进行计算,图中没有画出色调和饱和度信息。

       在hdr_weight_normalize模块中,每个图像的亮度权重和对比度权重进行相乘,然后三个图像的相乘之后的权重进行归一化之后分别输出。同时三个灰度图像也要经过h_stream_clk_delay模块进行延迟,从而与权重图像进行同步。

4高斯与拉普拉斯金字塔分解与重构

       如果直接对hdr_derived_input模块输出的权重和亮度图像进行融合,将会在融合后的图像中产生伪影,严重影响增强后的图像的视觉效果,如下图所示:

图 10 左:原始图像 中:直接融合图像 右:多尺度融合图像

       图 10中间的图像为三个权重图像和亮度图像直接进行融合的结果,由于权重图像并不平滑,不同亮度区域的权重有剧烈的变化,因此导致融合后的图像有伪影,比如小女孩的面部区域。而最右侧的图像采用了基于图像金字塔的多尺度融合,该方法混合的是图像的特征,而不是亮度,因此具有较好的效果。

三层高斯金字塔和拉普拉斯金字塔的分解与重构过程如下图所示:

图 11 三层金字塔的分解与重构过程

       高斯金字塔的第一层就是输入的灰度图像,先对其进行高斯滤波,然后进行下采样,即可得到第二层的高斯金字塔。第二层金字塔的尺寸是第一层金字塔的四分之一。对第二层高斯金字塔重复上面的操作,即先进行高斯滤波再下采样,即可得到第三层高斯金字塔。

       在高斯金字塔分解的基础上,可以得到拉普拉斯金字塔。我们对第二层高斯金字塔先进行上采样,再进行高斯滤波,最后与高斯金字塔的第一层作差,即可得到第一层拉氏金字塔。同样,对第三层高斯金字塔进行高斯滤波和上采样,并与第二层高斯金字塔作差,可以得到第二层拉氏金字塔。而第三层拉氏金字塔与第三层高斯金字塔是完全相同的。

       从图中可以看出,拉氏金字塔包含了图像不同尺度上的细节信息(特征),而高斯金字塔则包含了图像不同尺度上的背景信息。我们将不同图像的权重高斯金字塔与亮度拉普拉斯金字塔进行融合,可以达到融合图像特征的效果。

       在金字塔的反向重构过程中,我们对拉氏金字塔的第三层进行上采样和高斯滤波,然后与第二层拉氏金字塔相加,即可以得到重构的第二层金字塔。接下来对重构得到的第二层金字塔重复上采样和高斯滤波的操作,并与第一层拉氏金字塔相加,即可得到重构的第一层金字塔,也就是最终的输出图像。

       在FPGA中实现图像金字塔的分解与重构,最大的难点在于如何进行流水的设计,本文中设计实现的FPGA金字塔架构如下图所示:

图 12 FPGA实现金字塔的分解与重构

       图 12中的卷积操作使用的是3x3的高斯卷积核,下采样直接隔行隔列抽取像素数据即可,上采样使用的是双线性插值。需要注意的是,在获取拉氏金字塔的时候,需要对上层高斯金字塔和下层高斯金字塔经过上采样和高斯滤波的结果进行作差;另外在反向重构的过程中,需要用上层拉氏金字塔与下层重构金字塔经过上采样和高斯滤波的结果进行求和。在作差和求和的过程中,需要对两路视频流进行同步,因此FPGA实现图像金字塔的分解与重构时,需要耗费较多的RAM资源用于缓存图像,在图 12中使用“Delay”标志该过程。

FPGA中实现三层高斯金字塔的RTL视图如下所示:

图 13 FPGA实现三层高斯金字塔RTL视图

     图13中gauss_filter_3x3模块实现高斯滤波,hdr_down_sample模块实现下采样,v_line_delay模块用于对第一层和第二层高斯金字塔进行延迟,以达到与拉氏金字塔的第一层和第二层同步的目的,从而能够进行后续的融合操作。

FPGA中实现三层拉普拉斯金字塔的RTL视图如下所示:

图 14 FPGA实现三层拉普拉斯金字塔RTL视图  

         图14中蓝色高亮的模块具有和图 13中相同的结构,这是因为拉普拉斯金字塔是建立在高斯金字塔的基础上获得的。相比于高斯金字塔,图 14多了两个新模块,其中hdr_up_sample_after_down模块用于实现上采样,stream_align_minus模块用于两路视频流作差,从而得到拉氏金字塔。

FPGA中实现三层金字塔重构的RTL视图如下所示:

图 15 FPGA实现三层金字塔的反向重构RTL视图

        需要注意的是,图 15中的hdr_up_sample_reconstruct模块同样是用于实现上采样,它的功能与图 14中的hdr_up_sample_after_down模块相同,但是实现方式有差异。因为hdr_up_sample_after_down模块总是位于下采样模块之后,所以视频流中每隔一行就会空出来一行的时间,在有效行中每隔一个像素也会空出一个像素的时钟周期。因此不需要考虑上采样插值得到的像素在输出时向输入端造成反压,只需要缓存一行即可。而hdr_up_sample_reconstruct模块并不位于下采样模块之后,因此考虑到插值像素输出所占用的时间会向前造成反压,所以对输入的视频流需要多缓存几行从而避免输入端的FIFO溢出。除此之外,stream_align_add模块用于两路视频流求和,从而得到重构金字塔。

        在介绍了如何在FPGA中实现高斯和拉普拉斯金字塔之后,下面的图就很容易理解了。图 16展示了亮度拉氏金字塔和权重高斯金字塔的融合过程,从图中可以看出,我们对权重高斯金字塔的第一层和第二层做了延迟,以达到与拉氏金字塔的第一层和第二层同步的目的。为了使该示意图不显得过于复杂,这里我们只画出了一个亮度金字塔及其权重金字塔在每一层上的乘法运算,即图 16中的“Mult”标志。实际上在金字塔的每一层乘法运算之后,还会与其余两个图像的乘积结果一起进行求和,从而实现三张图像的亮度和权重金字塔的融合与重构。

图 16 亮度拉氏金字塔和权重高斯金字塔的融合与重构

       在本文的最后,我们给出该FPGA设计在Modelsim中仿真的结果,以直观地感受基于融合的弱亮度图像增强算法效果。相比于图 17中较暗的场景,图 18中的草丛、人物、马匹以及远处的树林和建筑都得到了明显的亮度提升。而且提升后图像的对比度也得到了保留,无论是近处郁郁葱葱的草丛,还是远处层层叠叠的树林,纹理层次都清晰可见。就像是一束光,照进了我昏暗的生活,嘲笑我有多难过。

图 17 Modelsim仿真输入图像

图 18  Modelsim仿真输出图像

该设计在xcku040-ffva1156-2-i上使用Vivado进行综合及实现,最终消耗的资源情况如下图所示:

图 19 xcku040-ffva1156-2-i上的资源占用情况

       由于设计时间紧迫,没有来得及对资源的占用进行优化。从图 19中可以看出,该算法占用了大量的BRAM资源。下面给出优化BRAM资源占用的建议:在模块中需要对齐数据流的地方,均使用了深度能够存储一行图像的FIFO,比如各层亮度高斯金字塔与权重拉氏金字塔相乘的时候。实际上他们之间的数据流相差在十几个时钟周期,因此可以将FIFO的深度修改为256或者512,以减小BRAM资源的占用。

学习交流讨论可加vx:DaLei_FPGA  也可加QQ3183701261~~~~

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值