基于FPGA的图像镜像

       图像镜像,一种较为常见的图像处理操作,分为水平镜像、垂直镜像、对角镜像。水平镜像即处理后的图像与原图像关于垂直线对称,垂直镜像为处理后的图像与

原图像关于水平线对称,对角镜像则关于对角线对称。

      关于低分辨率的图像,直接使用BRAM缓存,然后按照对称的关系取出即可,而高分辨率的图像则需要要到DDR缓存。本文主要讲述1080P分辨率的图像镜像,选用

DDR3缓存,使用的仍然是XILINX K7开发板。

  起初,我是将图像先缓存至DDR中,然后再按照对应的位置关系取出。后来发现实现对角镜像时逻辑极为复杂,便放弃该方案。后来根据对角镜像可以由水平镜像和

垂直镜像组合而来,将图像镜像分为两部分:水平镜像、垂直镜像,结构如图1所示。其中,水平镜像使用BRAM实现,垂直镜像使用DDR3实现。

 

       基于FPGA的图像镜像

                                                      图1 图像镜像结构

  水平镜像,即图像行的位置调转,行首变成行末,行末变成行尾。在FPGA中可选用两个bram乒乓操作,也可选择一个真双口BRAM同时读写,实现

思路一致,即:先写入一行有效图像数据,然后开启读,根据是否水平镜像读取已经存入的一行数据,如果需要水平镜像则逆序读bram,否则顺序读。关键

代码如下所示:

if(neg_vid_data_valid_image)begin//一行有效数据写完
    state_bram_ctrl<=BRAM_WR_RD;//读写同时进行
    bram0_addra<=bram0_part2_addr;                
    line_length<=bram0_addra;                    
    bram0_eab<=1b1;
    bram0_addrb<=bram_reverse_flag? (bram0_addra+d1):d0;//1-1920为有效数据段
    bram_init_done<=1b1;
end

       垂直镜像,即原图像列的位置翻转,列首变成列尾,列尾变成列首。对于高分辨的图像只能选用DDR缓存,即在图像已经缓存至DDR一帧的基础上开启读操作,行内顺序,列内逆序读。

       而对角镜像,则是水平镜像和垂直镜像的组合,所以需同时开启水平镜像以及垂直镜像使能,通过两个部分的处理以得到最终结果。最后实现的效果如下图所示:

  基于FPGA的图像镜像

                                                                      图2 原图像

 基于FPGA的图像镜像

                                                          图3 垂直镜像

基于FPGA的图像镜像

                                                              图4 对角镜像

基于FPGA的图像镜像

                                                                 图5 水平镜像

 

基于FPGA的图像镜像

上一篇:服务器硬件和RAID配置


下一篇:方法重载