CrazyBingo

【连载6.2.2.5】3X3 Bayer阵列恢复的HDL-VIP实现

0
阅读(86) 评论(0)

由于Bayer阵列的恢复,密切关系到奇偶行、即奇偶像素的坐标,因此如果没有处理好这方面的参数,势必会导致Bayer阵列恢复的失败。这里通过奇偶行、像素的地址,来实现Bayer阵列的恢复算法,如下所示:

4.jpg

其中OddLINE_OddPOINT为奇数行奇数像素,OddLINE_Even_POINT为奇数行偶数像素,EvenLINE_OddPOINT为偶数行,奇数像素,EvenLINE_EvenPOINT为偶数行,偶数像素。通过CASE语句,描述了最简单的3X3的Bayer阵列恢复,因此如果Sensor输出的顺序发生改变,只需要修改这几个参数就OK了。

不过分析前文中,我们优化过的3X3阵列生成方案,得到的波形如下所示:

4.jpg

由于我们只进行了行边缘像素的镜像操作,列边缘像素的镜像操作略复杂,这里没有做处理,因此从图中可知,输出的3X3阵列,奇数行的中心实际上为原图像的偶数行。因此我们人为的修改奇、偶行的参数,如下所示:

4.jpg

此时刚好将列对换了,但由于我们的行为完整的镜像操作,因此保持可以直接转换过去。再次我们只需修改localparam参数即可。。。这一步非常的重要!!

最后,由于Bayer阵列的恢复消耗了2个时钟,因为认为的将行场信号偏移2个时钟,如下所示:

4.jpg

这样,我们便得到了完整的,Bayer阵列恢复后的,RGB888的视频流数据。这部分的Modelsim仿真波形,如下所示:

4.jpg

VIP_RAW8_RGB888的例化如下所示:

4.jpg

最后,将Video_Image_Processor模块输出的RGB888,转换为RGB565(因为VIP Mini板卡的SDRAM只有16bit;VIP Big支持32bit可以直接连续存储RGB888 24bit的像素)后输出给SDRAM输入端口。全编译并下载测试,得到恢复后的RGB图像。这里Bingo通过Bayer阵列图像的显示、恢复后的彩色图像显示,以及RGB565采集、PC RAW8Bit图像采集的显示进行对比分析,如下所示:

(1)    Bayer阵列图像通过灰度显示:

4.jpg

从图中可见,直接将RAW,通过R = G = B = RAW也能显示,近似于灰度的图像,但由于相邻像素的彩色深度不同,会有网格的现象。这种方式用来验证CMOS Sensor输出的Bayer阵列图像是否正确,是一种有效的方法。

如果想更透彻的研究Bayer,可以借助Matlab来做实验,如下是Bingo将通过RGB图像转换你的Bayer阵列图像,以及原图(仅做参考):

4.jpg

(2)    Bayer阵列恢复后的RGB888→RGB565图像

4.jpg

通过3X3阵列恢复,将得到的Bayer阵列恢复成了彩色图像。

(3)  直接输出的RGB565图像

6.jpg

上图为CMOS直接输出的RGB565图像,与(2)中由Bayer阵列恢复得到的彩色图像对比,可见恢复后的图像色彩更鲜艳,而CMOS直接输出的RGB565图像,细节略显模糊。。。这主要是传感器由于面积功耗等局限性,不能在里面做较为复杂的算法,只是简单的2行插值,因此恢复结果有较大的局限性。虽然我们目前也只是实现了简单的Bayer恢复,但竟然已经比Sensor输出的RGB565好了,真的是无语。。。

(4)    PC端RAW8Bit图像采集

4.jpg

最后,通过USB_VIP_Panle软件,采集8Bit的RAW阵列,通过软件恢复后的图像如上所示。可见该图质量明显优于FPGA Bayer恢复的图像。这个原因主要是由于PC端得到的是RGB888的24Bit的彩色图像,而在板卡这边,由于硬件资源的局限,得到的是16Bit的RGB565图像;并且更重要的,为了更优秀的画质,在PC端考了了Bayer恢复方向梯度上的因素,因此PC的效果秒败了FPGA。如果想要知道这部分算法实现的内容,请参考配套软件的源代码,谢谢!

但从算法层面考虑,我们已经实现了基本的3*3 Bayer阵列的恢复算法。至于这种算法的优越性,是否有提升的空间,毋庸置疑,美好的未来是你们的。