概要[Abstract]将RGB格式转为YCbCr格式对于图像的处理更为方便。在集创赛作品中,几乎所有的参赛项目都涉及到图像处理领域,比较常见的有颜色识别、图像二值化、膨胀腐蚀算法消除多余的阴影、边缘检测等等。
实现功能:
此模块实现将RGB888色彩格式转为YCbCr格式。
实现原理:
RGB888转YCbCr的数学公式里涉及到较多的浮点运算,这并非FPGA所擅长的领域,因此我们需要将标准数学公式转换和化简:
以下为RGB888转YCbCr的标准数学公式:
Y = 0.299R +0.587G + 0.114B
Cb = 0.568(B - Y) + 128 = -0.172R - 0.339G + 0.511B + 128
Cr = 0.713(R - Y) + 128 = 0.511R-0.428G -0.083B + 128
我们通过先乘后除的方式将小数部分去掉,注意这里乘与除的值最好是2n,
方便除法可以直接转化为移位运算,效率更高。去掉小数的公式如下:
Y = (77*R + 150*G + 29 *B) >> 8
Cb = (-43*R - 85 *G + 128*B) >> 8 + 128
Cr = (128*R - 107*G - 21*B) >> 8 + 128
我们将公式形式化简为一致,方便后续使用三级流水将加法、乘法和除法(移位运算)分开同时计算,保证FPGA处理的速度。化简后的公式如下:
Y = (77 *R + 150*G + 29 *B) >> 8
Cb = (-43*R - 85*G + 128*B + 32768) >> 8
Cr = (128*R - 107*G - 21*B + 32768) >> 8
最后,使用Verilog代码将公式实现即可,具体实现参考模块源码。