随着HDTV的普及,以LCD-TV为主的高清数字电视逐渐进入蓬勃发展时期。与传统CRT电视不同的是,这些高清数字电视需要较复杂的视频处理电路来驱动,比如:模数转换(A/D Converter)、去隔行(De-interlacer)、视频缩放(Scaler)和视频图像增强(Video Enhancement)等等。由于HDTV的带宽较高,720p信号(1280×720@60Hz)的像素速率达到74MHz,因此针对HDTV的视频处理算法需要更高性能的器件。采用大规模高工艺的ASIC芯片是目前这个问题的主要解决方案,Pixelworks、Genesis等公司均推出了基于大规模ASIC的解决方案。但是,随着FPGA工艺的不断改善,其性价比与日俱增,尤其是Xilinx、Altera等厂商纷纷采用90nm工艺量产后,其价格不断降低,Xilinx推出的Spartan-3E系列FPGA 120万门的售价只有9美元,已经在小量产品的IC设计中开始替代结构化ASIC,在数字高清电视这类价格敏感型消费类电子产品中也开始大量采用。

  本文介绍了如何在FPGA中利用Block RAM的特殊结构实现HDTV视频增强算法中灰度直方图统计。

灰度直方图统计

灰度直方图统计是图像处理过程中很常用的一个步骤,简单来讲,就是对一幅图像各个灰度的像素进行计数,得到一张灰度分布表。例如,8位量化的灰度图像统计结果就是256个值,分别代表0-255 每个灰度像素的数量,如图1 所示为Lena图像的灰度直方图统计结果。直方图是分析一幅图像亮度分布特性有力的工具,根据它的结果可以进行诸如灰度拉伸、自动对比度、动态伽马调整等操作。

图1 Lena图像的灰度直方图统计

FPGA算法统计

  在计算机或者DSP上实现直方图统计时,我们通常会使用数组结构,即在内存中开辟一个整数数组来进行计数,但是在FPGA中定义数组是非常消耗资源的,尤其是当数组成员的位宽很大时。例如用触发器来统计256灰度的720p图像的直方图,将消耗4000个逻辑单元(每个逻辑单元是一个四输入查找表),这几乎消耗了一个Spartan-3E 25万门器件(XC3S250E)80%的逻辑资源。

  幸运的是,FPGA器件提供了一个很好的结构可以处理这类问题,这就是Block RAM.在Altera和Xilinx的各型号FPGA器件上都集成了一种称为Block RAM的片上内存,它们以若干Kbits为一块,不同型号集成不同数量的块,例如在Spartan-3E系列中以18Kbits为一块,在规模最小的型号XC3S100E上集成了4块这样的内存,如图2 所示:

图2 Spartan-3E系列FPGA集成的Block RAM

这种内存很容易实现数组类型的结构,而且这种内存被设计成双端口方式,即可以用两组独立的地址数据总线来读写,因此可以用不到一块的Block RAM就实现256×24这样的高位宽计数器阵列来进行HDTV视频图像的直方图统计,如图3所示:

图3 用Block RAM实现计数器阵列

  以Block RAM的结构为核心,按照以下几点来设计直方图统计算法:

  1.Block RAM使用双端口方式,端口A用来将内存单元计数值读出,端口B将计数值加一后写回该内存单元。

  2.内存的地址在像素有效时由像素灰度值选择,在行同步期间不计数,在场同步期间使用一个递增计数器在前256个时钟将统计结果输出,在之后的256个时钟将RAM 块清零。

  3.双端口读写时钟相位相差180度,以避免双端口读写冲突。

  4.数据的读出、加一和写入采用了流水线结构以提高性能,所以在地址控制上要进行适当暂存以保证数据同步。

  图4为256级灰度720p视频图像直方图统计的算法实现功能框图:

图4 用FPGA的Block RAM实现直方图统计

  该算法借助FPGA??上的高性能Block RAM(读写速度可以到200 兆以上),可以实现SMPTE定义的从720p到1080p的各种HDTV视频图像的实时直方图统计,仅占用FPGA不到一百个逻辑单元和一块Block RAM,是一种性价比较高的FPGA实现直方图统计的算法,而且该算法具有很好的通用性,可以应用到各种需要大量高位宽计数器的高速FPGA设计中。

参考文献:

  1.Xilinx,Spartan-3E FPGA datasheet,2005.3
  2.Xilinx,Using Block RAM in Spartan-3 Generation FPGAs,2005.3

基于FPGA的HDTV视频图像灰度直方图统计算法设计的更多相关文章

  1. 基于Modelsim的直方图统计算法仿真

    一.前言 本篇主要针对牟新刚编著<基于FPGA的数字图像处理及应用>第六章第五节中直方图统计相关类容进行总结,包括代码实现及 基于Modelsim的仿真.书读百遍,其意自现. 2020-0 ...

  2. 基于FPGA的Uart接收图像数据至VGA显示

    系统框图 前面我们设计了基于FPGA的静态图片显示,接下来我们来做做基于FPGA的动态图片显示,本实验内容为:由PC端上位机软件通过串口发送一幅图像数据至FPGA,FPGA内部将图像数据存储,最后扫描 ...

  3. FPGA+VGA+OV7725 视频图像FPGA开发板 图像采集板CP511A使用

     

  4. 基于FPGA的Sobel边缘检测的实现

    前面我们实现了使用PC端上位机串口发送图像数据到VGA显示,通过MATLAB处理的图像数据直接是灰度图像,后面我们在此基础上修改,从而实现,基于FPGA的动态图片的Sobel边缘检测.中值滤波.Can ...

  5. 基于FPGA的肤色识别算法实现

    大家好,给大家介绍一下,这是基于FPGA的肤色识别算法实现. 我们今天这篇文章有两个内容一是实现基于FPGA的彩色图片转灰度实现,然后在这个基础上实现基于FPGA的肤色检测算法实现. 将彩色图像转化为 ...

  6. 【转】基于FPGA的Sobel边缘检测的实现

    前面我们实现了使用PC端上位机串口发送图像数据到VGA显示,通过MATLAB处理的图像数据直接是灰度图像,后面我们在此基础上修改,从而实现,基于FPGA的动态图片的Sobel边缘检测.中值滤波.Can ...

  7. 基于FPGA的中值滤波算法实现

    在这一篇开篇之前,我需要解决一个问题,上一篇我们实现了基于FPGA的均值滤波算法的实现,最后的显示效果图上发现有一些黑白色的斑点,我以为是椒盐噪声,然后在做基于FPGA的中值滤波算法的实验时,我发现黑 ...

  8. 基于FPGA的腐蚀膨胀算法实现

    本篇文章我要写的是基于的腐蚀膨胀算法实现,腐蚀膨胀是形态学图像处理的基础,,腐蚀在二值图像的基础上做"收缩"或"细化"操作,膨胀在二值图像的基础上做" ...

  9. 深入学习OpenCV中图像灰度化原理,图像相似度的算法

    最近一段时间学习并做的都是对图像进行处理,其实自己也是新手,各种尝试,所以我这个门外汉想总结一下自己学习的东西,图像处理的流程.但是动起笔来想总结,一下却不知道自己要写什么,那就把自己做过的相似图片搜 ...

随机推荐

  1. 福大软工1816:Alpha(9/10)

    Alpha 冲刺 (9/10) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务: 文字/口头描述: 1.完善通过父子进程调用wxp ...

  2. fuck the browser mode

    使用了source insight 4有一段时间了,今天用着突然发现我的鼠标移动到变量.函数.自定义的类型上时,单击鼠标左键直接就跳到了定义处,很像是按住了Ctrl再单击鼠标,用得极其不舒服,开始怀疑 ...

  3. 重新看《JavaScript高级程序设计》

    几点心得: 1)数据是基础,一共有3种基础数据:null.undefined.和object:遵循从无到有从简单到复杂的演变过程 2)衍生数据:衍生数据是指操作符合语句,这些是基础数据产生导致的必然结 ...

  4. mysql8基本配置,差点被各种坑蒙圈

    1. 下载免安装版mysql地址 https://dev.mysql.com/downloads/mysql/ 2. 基本配置 (1)解压zip包,将bin目录添加到环境变量 (2)在mysql根目录 ...

  5. python Django框架接入微信公众平台

    1.在接入微信公众平台之前,需要在微信公众平台配置好基本信息,如下: 这个时候点击“提交”按钮,会提示“Token校验失败”,不要着急,这是必然会出现的现象,先不要退出页面,保留各项输入的数据,按第二 ...

  6. Agile.Net 组件式开发平台 - 驱动开发示例

    首先讲一下概念,此驱动非彼驱动.在Agle.Net中我们将组件规划成两种类型,一种是基于业务的窗体组件,一种是提供扩展功能的驱动组件. 打个比方例如一般系统中需要提供身份证读卡功能,然而市面上有很多种 ...

  7. VM新安装centos7无法连接网络的问题

    https://blog.csdn.net/u012110719/article/details/42264601 https://blog.csdn.net/kexiaoling/article/d ...

  8. [剑指Offer] 60.把二叉树打印成多行

    题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. [思路]使用队列实现二叉树的层次遍历. /* struct TreeNode { int val; struct TreeN ...

  9. android四大组件(一)Activity

    一.创建一个新的Activity 1.android的四大组件都要在清单文件里面配置 2.如果想让你的应用有多个启动图标,你的activity需要这样配置 <intent-filter> ...

  10. BZOJ 1066 蜥蜴(网络流)

    很普通的拆点网络流,把每个柱子拆成两个点(i,j,0)和(i,j,1).对于柱子的高度限制则加边((i,j,0),(i,j,1),height). 两个柱子能互相到达则加边((i,j,1),(i1,j ...