图像旋转的FPGA实现(一)

  继续图像处理专题,此次写的是图像旋转。若要说小分辨率的图像旋转倒也简单,直接将原始图像存储在BRAM中,而后按照旋转后的位置关系取出即是。可是对于高分辨的图像(720P及以上)就必须得用DDR3或者DDR4缓存了,而DDR是突发传输,对连续视频流十分友好。因此在旋转180°时倒也问题不大,可是若旋转90°或者270°的话,每取出一个数据,缓存

就要跨行一次,而DDR跨行传输的效率极低,经测量大概是10%左右,根本没法知足实时性要求。设计

  那么,又该怎么解决旋转90°或者270°DDR传输效率低的问题呢?我查阅了大量资料,有一种方法是改用sram存储图像,这样便没有跨行传输效率低下的问题。可是如今FPGA的开发板广泛带的是DDR,也没有必要为了图像旋转这个功能从新设计电路,增长sram芯片。另外一种方法则是改变DDR读写图像的方式,这里也有两种方案。方案1是对DDR进行分块,DDR的一块存储一行有效图像数据,这样就使得DDR跨行次数减小。同时因为DDR位宽大于像素数据位宽,因此每读取一个数据就能得到数个像素点,可供几回旋转90°或者270°使用。视频

方案2是对图像进行分块,写入DDR时按照分块尺寸对应关系,每一行写入一个分块,这个方法一样会使得旋转操做后读取DDR跨行变少。有些人或许就会疑问,连续的视频流怎么分块呢?视频的确是连续进入的,但是咱们能够控制写入的地址,假如分辨率是1920*1080,分块是192*10,那么在DDR写到192-8地址时,就直接跳转到0+DDR列长度处了,进而实现DDR的一块存储原图像的一行数据。开发

  这里的话,我选择的是第一种方案,即DDR的一块存储原图像一行有效数据,并在720P和1080P各类制式下验证经过,具体实现细节见下一篇博客。博客

       事实上,我只实现了直角旋转,即旋转90°,旋转180°,旋转270°。而想实现任意角度旋转的话则思路一致,即从新排列图像写入DDR顺序,使得读DDR跨行操做次数下降,而关于这一点,万方上有一篇名叫“基于FPGA的数字图像旋转引擎设计”(李杰明)的论文,你们有兴趣的能够去查阅观看。图像处理

相关文章
相关标签/搜索