FPGA ISP Bayer与常见颜色空间转换-FPGA常见问题社区-FPGA CPLD-ChipDebug

FPGA ISP Bayer与常见颜色空间转换

  1. 前言

    FPGA实现ISPImage Signal Processor)过程中,在图像接收、处理、传输过程中往往会接触到各种各样的图像格式,比如接收图像可能是原始RAW数据,驱动LCD显示器需要RGB格式,HDMI/SDI显示需要YUV格式等。各种图像格式之间可能涉及到相互转换,本文简单介绍几种常见的图像格式以及Xilinx FPGA实现方式。

  2. Bayer图像
    ISP通常是从接收到CMOS/CCD的图像信号开始,对于彩色图像传感器,输出图像格式可能是RGBYUVBayer。为了降低成本,绝大部分的彩色图像传感器采用彩色滤镜阵列(color filter arrayCFA)的方式捕获彩色图像,因此输出Bayer格式的Sensor最为常见。
    典型Bayer图像的成像过程如下图所示。

     

    图片[1]-FPGA ISP Bayer与常见颜色空间转换-FPGA常见问题社区-FPGA CPLD-ChipDebug

    图2-1 CFA示意图(图片来自wikipedia

    随着技术的发展,也有一些其他滤镜的Sensor出现,如RGBWEXRX-Trans等,如下图所示。

    图片[2]-FPGA ISP Bayer与常见颜色空间转换-FPGA常见问题社区-FPGA CPLD-ChipDebug

    图2-2 RGBWFujifilm EXR”、“X-Trans”示意图(图片来自wikipedia

    通过上图可以发现,这些滤镜中,绿色的分量最多。这是因为人眼对绿色最为敏感,所以保留最多的绿色分量。

  3. Demosaic
    Bayer图像采集到FPGA以后,每个像素只有一种颜色分量。以Sony IMX290为例,输出图像的bayer格式如下图所示:

     

    图片[3]-FPGA ISP Bayer与常见颜色空间转换-FPGA常见问题社区-FPGA CPLD-ChipDebug

    图3-1 Sony IMX290 Pixel Arrangement

    此时,如果将采集到的1920×1080图像以灰度展示,由于CFA的原因,图像会呈现一种马赛克现象,如下图所示:

    图片[4]-FPGA ISP Bayer与常见颜色空间转换-FPGA常见问题社区-FPGA CPLD-ChipDebug

    图3-2 Bayer image

    所以将Bayer转成RGB的过程又称为Demosaic(去马赛克)。
    每一个像素仅包含光谱的一部分,需要通过插值来填充每个像素的RGB分值。为了从Bayer格式得到每个像素的RGB格式,需要通过插值对每个像素填补缺失的两个颜色分量。插值的方法有很多(包括近邻、双线性等)。
    插值后可以得到RGB图像:

    图片[5]-FPGA ISP Bayer与常见颜色空间转换-FPGA常见问题社区-FPGA CPLD-ChipDebug

    图3-3 Bayer to RGB

    需要注意的是,Bayer图像根据第一个像素的颜色分量有4种排列方式,分别为GRBG、RGGB、BGGR、GBRG:

    图片[6]-FPGA ISP Bayer与常见颜色空间转换-FPGA常见问题社区-FPGA CPLD-ChipDebug

    图2-4 Bayer 4种排列方式

    如果输入Bayer的排列与IP core配置中插值的排列方式不同,则图像颜色会错乱。

    图片[7]-FPGA ISP Bayer与常见颜色空间转换-FPGA常见问题社区-FPGA CPLD-ChipDebug

    图3-5 Bayer排列方式与Demosaic配置不一致
  4. RGB/YUV颜色空间转换
    YUV是一种颜色模型。它对彩色图像或视频进行编码时考虑到了人类的感知,与 “直接 “的RGB表示相比,允许减少色度成分的带宽。YUV模型定义了一个亮度分量(Y),代表物理线性空间的亮度,以及两个色度分量,分别称为U和V。它可以用来与RGB或其他色域空间进行相互转换。
    同样常见的还有YCbCr,但是在实际中,往往是把YUV和YCbCr认为是同一种色域,只有模拟和数字的区别。我们一般也统称为YUV。
    由于YUV色域相比于RGB带宽更低,所以经常见于图像接口,如BT656、BT1120、HDMI等。也由于YUV亮度与色度分开的特性,许多图像增强算法也基于YUV来设计,如3D降噪、边沿增强等。
    YUV于RGB颜色空间的转换可由公式表现,不同的标准如ITU601.SDTV、ITU709.PAL/NTSC参数略有不同。

     

    图片[8]-FPGA ISP Bayer与常见颜色空间转换-FPGA常见问题社区-FPGA CPLD-ChipDebug

    图4-1 BT.601标准

    图片[9]-FPGA ISP Bayer与常见颜色空间转换-FPGA常见问题社区-FPGA CPLD-ChipDebug

    图4-2 BT.709标准

    根据以上公式,可以由RGB图像得到YUV,此时YUV有三个通道,图像大小相比于RGB没有变化,我们通常称之为YUV444。

    图片[10]-FPGA ISP Bayer与常见颜色空间转换-FPGA常见问题社区-FPGA CPLD-ChipDebug

    图4-3 RGB to YUV444

    由于人眼对亮度敏感而对色度不敏感的特点,因此在YUV格式中减少了UV的数据量,在不影响用户观看的情况下有效的压缩了总体的数据量。所以YUVRGB格式相比,占用更少的存储空间,相对应的在传输过程中也会减少带宽的消耗量。常见的YUV格式有YUV444YUV422YUV420等。

    图片[11]-FPGA ISP Bayer与常见颜色空间转换-FPGA常见问题社区-FPGA CPLD-ChipDebug

    图4-4 Chroma subsampling示意图(图片来自wikipedia
  5. 延伸
    在RGB转YUV的过程中,我们通常可以加一个系数,作为比例因子放大和缩小UV的分量,达到调节图像饱和度的目的。以8bit图像深度为例,比例因子为r,公式如下:

    Cb=U*r+128;

    Cr= V*r+128;

    调整比例因子r,能得到不同色彩饱和度的图像。

     

    图片[12]-FPGA ISP Bayer与常见颜色空间转换-FPGA常见问题社区-FPGA CPLD-ChipDebug

    图5-1 饱和度设置效果

    RGB/YUV的颜色空间转换并非完全无损。FPGA运算精度有限,多次转换可能导致颜色失真,尤其是当转入转出标准不同时,会引入累积误差。
    比如网络上流传的有趣的表情包、梗图,在传来传去的过程中,网络平台可能会反复压缩、解压,而显示基于RGB,压缩基于YUV,所以对图片不断地进行RGB/YUV转换。虽然每次转换损失轻微,但久而久之,在不断取整的过程中,Y、U、V三个值就会不断减小,Y让图像越来越暗,UV让图像越来越向绿偏移。

    图片[13]-FPGA ISP Bayer与常见颜色空间转换-FPGA常见问题社区-FPGA CPLD-ChipDebug

    图5-2 模拟“电子包浆”
  6. AMD-Xilinx FPGA实现
    对于Demosaic,Xilinx提供IP core供用户调用,用户可根据应用场景以及资源开销选择对应的插值方式,Fringe Tolerant Interpolation或者High Resolution Interpolation,支持RGB bayer和CMY bayer两种格式。详细说明参考Xilinx官网PG286。
    IP接口如下图所示:

     

    图片[14]-FPGA ISP Bayer与常见颜色空间转换-FPGA常见问题社区-FPGA CPLD-ChipDebug

    图6-1 Xilinx Demosaic IP core

    对于RGB与YUV的颜色空间转换或YUV444/YUV422/YUV420之间的转换,Xilinx也提供了IP core供用户调用。详细说明参考Xilinx官网PG231。

    IP接口以及配置方式如下图所示:

    图片[15]-FPGA ISP Bayer与常见颜色空间转换-FPGA常见问题社区-FPGA CPLD-ChipDebug

    图片[16]-FPGA ISP Bayer与常见颜色空间转换-FPGA常见问题社区-FPGA CPLD-ChipDebug

    图6-2 Xilinx VPSS IP core

    Xilinx提供的VPSS(Video Processing Subsystem),可以很方便地对RGB、YUV444、YUV422、YUV420进行互转。RGB与YUV的互转公式如下:

    YUV to RGB:

    B = Y + ((Cb * 2081) >> 10)

    Cr = V – (1<<(HSC_BITS_PER_COMPONENT-1))

    Cb = U – (1<<(HSC_BITS_PER_COMPONENT-1))

    R = Y + ((Cr * 1733) >> 10)

    G = Y – ((Cb * 404 + Cr * 595) >> 10)

    RGB to YUV:

    V = (1<<(HSC_BITS_PER_COMPONENT-1)) + (((R-Y)*898)>>10)

    Y = (306*R + 601*G + 117*B)>>10

    U = (1<<(HSC_BITS_PER_COMPONENT-1)) + (((B-Y)*504)>>10)

    其中HSC_BITS_PER_COMPONENT = C_MAX_DATA_WIDTH (这里C_MAX_DATA_WIDTH可以由用户通过GUI设置。)

    综上,使用这两个IP即可基于Xilinx FPGA快速实现Bayer与常见颜色空间转换。

 

请登录后发表评论

    没有回复内容