基于HLS的色彩插值算法硬件设计与实现
2020-06-16潘晓英李晨晨薛玉锋
潘晓英,李晨晨*,王 昊,薛玉锋
(1.西安邮电大学 计算机学院,陕西 西安 710121;2.厦门优莱柏网络科技有限公司,福建 厦门 361008)
1 引 言
图像传感器是获取图像不可或缺的一个重要组成部分。目前市场上常见的图像传感器主要有互补金属氧化物半导体(Complementary Metal Oxide Semiconductor,CMOS)图像传感器和电荷耦合元件(Charge-coupled Device,CCD)图像传感器两种[1]。由于制造工艺和原件成本等原因,市场上主流的传感器多为CMOS图像传感器。为获得彩色图像,通常需要在CMOS图像传感器表面覆盖一层彩色滤波阵列(Color Filter Array,CFA),而Bayer格式的CFA是最常用的一种[2],Bayer格式的图像在每个像素位置上只有物理三基色(红、绿、蓝)中的一种色彩分量,要得到RGB彩色图像就需要根据该色彩分量周围的其他色彩分量插值计算出另外两种色彩分量,这种处理方式称为色彩插值[3-4]。
随着图像传感器像素尺寸的增加,图像数据量也随之增大,使用软件方式实现色彩插值算法存在实时性差、效率低下等问题,现场可编程门阵列(Field-Programmable Gate Array, FPGA)[5-6]在图像处理应用上具有处理数据量大、处理速度快等特点,使用FPGA可以加速实现色彩插值算法。色彩插值算法在实际硬件实现中多采用计算简单、实现较为容易的算法,比如邻近插值算法和双线性插值算法等[7-9]。文献[10]提出在FPGA上采用邻近插值算法实现色彩还原,但图像色彩还原较差,细节丢失严重。文献[11]提出在FPGA上实现一种四合一图像插值算法,该算法FPGA实现简单,实时性较好,但图像边缘锯齿现象较为严重。上述文献中插值算法的实现多使用硬件描述语言开发,对开发要求较高且开发时间较长。
针对上述算法存在图像色彩还原较差、细节丢失严重、存在锯齿现象以及开发周期较长等问题,本文提出了一种改进的色彩插值算法,该算法融合双线性插值法和一阶微分边缘导向插值法实现色彩插值,使用Xilinx高层次综合工具HLS完成算法开发。与传统FPGA开发使用硬件描述语言实现相比,HLS使用C/C++进行开发[12-13],可降低开发难度,缩短开发时间。最后本文在ZYNQ平台上将HLS生成的色彩插值IP与图像采集模块结合实现了实时的图像色彩还原。
2 改进的色彩插值算法
本文的色彩插值算法采用双线性插值算法和一阶微分边缘导向插值算法相结合的方式实现图像色彩还原。如图1所示,在Bayer格式的CFA中,绿色分量占据所有像素信息的一半,所包含的图像信息量相对较多,需要在插值计算中更加精确地进行还原。当被插值像素点为R分量或B分量时,对缺失像素的插值使用较为复杂的算法计算。红色与蓝色分量分别占所有像素信息的1/4,为减少算法复杂度与FPGA资源占用,当被插值像素点为G分量时,使用计算相对简单的算法完成插值计算。图1所示为Bayer格式的色彩滤波阵列。
图1 Bayer色彩滤波阵列(CFA)Fig.1 Bayer color filter array (CFA)
在图像色彩还原时,如果插值算法没有考虑到图像边缘的特殊性,使用了跨边缘的图像像素信息进行插值,就会导致插值后得到的图像边缘产生模糊和锯齿现象。改进后的色彩插值算法对以红色和蓝色分量为中心像素点的像素使用一阶微分边缘导向插值算法进行色彩插值还原,通过计算被插值像素点处水平(垂直)方向或对角方向的梯度值确定图像边缘,取梯度较小方向上的像素点作为估计点,从而避免了插值时错误地利用跨边缘的邻域像素信息,在插值计算时能有效还原图像边缘信息,改善图像边缘模糊以及锯齿现象等问题。对以绿色分量为中心像素点的像素使用双线性插值算法进行色彩插值还原,利用相邻像素中同色分量的像素值信息进行平均运算得到当前像素的插值色彩分量,该算法运算量较小,可有效减少FPGA资源的使用。
图2 不同分量为中心像素点的示意图。(a)蓝色分量;(b)红色分量;(c)绿色分量Fig.2 Diagram of different compontnts as central pixols. (a)Blue component;(b)Red component;(c)Green component.
2.1 红色与蓝色分量处的色彩插值
如图2(a)所示,当以蓝色分量B22为中心像素点时,针对需要恢复的绿色分量和红色分量,本文使用一阶微分边缘导向插值算法进行色彩还原。对需要插值的绿色分量,首先计算水平方向和垂直方向上的梯度大小,取梯度较小方向上的像素点作为估计点,计算当前缺失像素,ΔHg表示水平梯度,ΔVg表示垂直梯度。
(1)
缺失的G分量插值计算方式如式(2)所示:
(2)
对蓝色分量B22进行插值求取红色分量R,根据蓝色分量B22周围的红色分量的值来确定对角梯度值,Hr表示主对角梯度,Vr表示次对角梯度。取梯度较小方向上的像素点作为估计点,对角梯度值定义如下:
(3)
R分量的插值计算方式如式(4)所示:
(4)
在图2(b)中,红色分量R22为中心像素,需要插值计算出绿色分量和蓝色分量,其计算过程与以蓝色分量B22为中心像素点时的计算方式相同,首先计算R22处水平与垂直梯度值,插值计算出缺失的G分量,再计算R22处的对角梯度值,插值计算出缺失的B分量。
2.2 绿色分量处的色彩插值
如图2(c)所示,当以绿色分量G22为中心像素点时,使用双线性插值算法进行色彩还原,首先对中心像素点邻域内相同颜色分量求均值,然后将该值作为中心像素点缺失颜色分量值。
对图2(c)中像素点G22进行插值,对应的红色分量R和蓝色分量B的恢复公式如下:
(5)
(6)
本文提出了一种改进后的色彩插值算法实现图像色彩还原,对不同的颜色分量,使用相对应的色彩插值算法,利用图像边缘的梯度信息区分图像的边缘,恢复出的图像边缘细节较好,减少了锯齿与模糊现象。
3 色彩插值算法的HLS实现
Vivado HLS 是 Xilinx 公司推出的高层次综合工具。与使用硬件描述语言开发FPGA不同,HLS使用 C/C++进行开发,通过高层次综合将其转换成HDL代码,并将程序打包成IP核,因此具有很强的灵活性,可大幅度缩短开发周期,同时也具有良好的加速功能。
3.1 使用HLS设计色彩插值IP核
使用Vivado HLS完成Bayer格式图像色彩还原的流程如图3所示。
图3 HLS 硬件加速流程Fig.3 HLS hardware acceleration process
本文使用Sony IMX系列CMOS传感器完成图像采集,图像尺寸为2 048×1 536。系统运行时,摄像头完成取图,原始Bayer格式图像数据流进色彩插值IP,通过AXI4-Stream 协议将数据流转换为HLS opencv库下的 hls::Mat 格式,然后进行色彩插值运算,最后将处理完成的图像再经过格式转换流出色彩插值IP,完成Bayer格式图像的色彩插值,最终得到RGB彩色图像。
图4 Vivado HLS实现色彩插值算法流程框图Fig.4 Vivado HLS algorithm flow chart
使用HLS完成色彩插值算法的主要流程如图4所示。首先对图像进行格式转换,根据AXI4-Stream协议将原始图像数据流转换为HLS视频库下的 hls::Mat 格式,使用hls::LineBuffer缓存大小为3×2 048的行缓存,将行缓存中的数据使用hls::Window再缓存到一个大小为3×3的滑动窗口,对该3×3的滑动窗的中心像素点进行插值计算,计算完成后窗口右移,当该窗口完成行遍历后,行缓存下移,窗口继续向右移动,直至完成所有像素点遍历。
如图1所示,在Bayer格式的CFA中,不同色彩分量有规律地分布,其中G分量处于奇行偶列与偶行奇列,R分量与B分量处于奇行奇列与偶行偶列。在色彩插值计算中,需要判断该滑动窗中心像素点所处行列的奇偶性,当中心像素处于奇行偶列与偶行奇列时,对该像素采用双线性插值算法进行色彩插值。当中心像素处于奇行奇列与偶行偶列时,对该像素采用一阶微分边缘导向插值算法进行色彩插值。
3.2 色彩插值IP硬件系统实现
在Xilinx高层次综合工具中,将设计仿真通过的色彩插值算法打包成IP核,在Vivado开发环境中将色彩插值IP添加进整体的图像采集系统完成色彩还原的硬件加速。图5为图像采集和色彩还原系统的整体设计。在整体系统设计中将摄像头采集到的Bayer格式数据输送到色彩插值IP中,完成实时的图像色彩还原。
图5 Vivado中图像采集和色彩还原系统设计Fig.5 Image acquisition and color restoration system
4 实验与结果分析
在对Bayer格式图像进行插值运算过程中有可能会出现伪彩色、摩尔纹现象、锯齿现象等问题。为衡量色彩插值算法的还原效果,需要对还原后的图像进行图像质量进行评价。衡量图像还原质量可分为主观评价和客观评价,主观判断不具有量化标准,因此本文选用了客观评价中评价重构图像质量最常用的方法:彩色信噪峰值比(CPSNR)。CPSNR值越大,说明插值后得到的图像质量越好。
式(7)所示为CPSNR的计算公式。其中:W表示图片的宽度,H表示图片的高度,Oi,j,k表示真实图片的原始值,Ni,j,k表示经过插值算法恢复后的图像,P表示像素的峰值,因为本文图像格式为8 bits,因此P取值为255。
(7)
为验证本文算法的图像还原效果,随机选取经典的Kodak图像库里的8幅图像数据作为测试图像,对选取图像进行图像还原处理,得到Bayer格式的图像再使用色彩插值算法进行还原。
图6 实验结果Fig.6 Experimental results
图7 Kodak测试图像集Fig.7 Kodak image dataset
从图6中可以看出,采用本文算法插值还原得到的图像细节相较于双线性法图像细节更加丰富,色彩还原更好。相较于文献[10]与文献[11],图像边缘细节还原较好,锯齿现象较少。
表1 几种算法的CPSNR值对比Tab.1 Comparison of CPSNR values of three algorithms
续 表
表2 硬件资源使用表Tab.2 Hardware resource usage table
从表1中可以看出,本文算法的彩色峰值信噪比(CPSNR)相较于双线性插值算法、文献[8]、文献[9]所提算法平均高4~6 dB,使用一阶微分边缘导向插值算法得到的CPSNR值比本文算法平均高0.5 dB左右。从表2中可看出,本文算法的FPGA资源使用略高于双线性法与文献[10]、文献[11]所提算法,其FPGA资源使用比3种算法平均高13.7%,相较于一阶微分算法有大幅度下降,仅为一阶微分算法的57.1%。
结合图像还原结果、CPSNR数据以及FPGA的资源使用,改进后的色彩插值算法得到的图像质量比常规插值算法还原出的图像质量要好。相较于一阶微分边缘导向插值算法,其使用FPGA资源使用大幅度减少。在保证图像还原质量的前提下,本文算法还原出的图像更加清晰,边缘细节较好,图像色彩还原真实,细节丰富,FPGA资源使用较少。
最后,本文将设计验证完成的色彩插值IP进行板级验证,在Zynq平台上结合摄像头采集模组完成实时的图像色彩插值计算,如图8所示,图8(a)为Zynq图像采集平台,图8(b)为实际采集到的Bayer图像,图8(c)使用本文色彩插值IP在Zynq平台上实际拍摄彩色还原图像。
图8 采集模块与板上还原结果Fig.8 Acquisition module and restore results
5 结 论
提出了一种改进的色彩插值算法,该算法融合了双线性插值算法和一阶微分边缘导向插值算法。由于绿色分量所包含图像信息量较多,当被插值像素点为R分量或B分量时,使用一阶微分算法插值恢复缺失的颜色分量,可有效减少图像边缘模糊与锯齿现象。考虑到FPGA资源使用与硬件成本,当被插值像素点为G分量时,使用双线性插值算法插值恢复缺失的颜色分量。实验结果表明,本文算法的彩色峰值信噪比相较于常规算法高4~6 dB。使用HLS开发可快速完成算法的设计与实现,提高开发效率。将设计实现的算法打包生成IP核,可多次重复使用,提高了算法的复用性。