首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于FPGA的图像中值滤波器设计

基于FPGA的图像中值滤波器设计

近年来, 图像处理技术迅速发展, 在视频、多媒体、遥感、航空航天、监控、工业生产、机器人视觉和军事等领域得到了广泛应用, 并已成为人们认识世界、改造世界的重要手段。图像处理应用领域的不断扩大对图像处理的速度提出了新的要求, 在很多应用中需要对图像进行实时处理。通用处理器和软件处理办法由于其串行执行的结构, 很难满足实时性的需求, 专用处理芯片也由于设计周期长且不易改变而不能在应用中灵活使用。现场可编程门阵列(FPGA) 凭借可编程性及并行计算的特点成为构建实时图像处理平台的理想选择[ 1]。
本文主要讨论了利用FPGA 进行图像的采集和实时处理, 算法部分采用Simulink 和System Generator 实现。
1 系统总体结构
由CCD 摄像头采集PAL 制式的标准模拟信号, 由A/D 转换芯片将此模拟信号转换为数字色差信号ITUR BT.656 , 该信号经解码得到有效的视频信号, 然后送入DDR SDRAM 进行帧缓存, 再由System Generator 生成的处理模块进行数据处理, 最后送到显示设备显示[ 1-2]。系统的总体结构图如图1 所示。

2 系统功能模块设计
2.1 I2C 总线模块
系统使用TVP5150 进行A/D 转换, 采用SAA7121H进行D/A 转换, 这两款芯片的工作模式都是通过I2C 总线来配置实现的。I2C 总线是一种两线式串行总线, 用于连接微控制器和外围设备。在FPGA 中, 由一个状态机模拟I2C 总线的时序, 模拟出I2C 总线上的起始信号、数据信号和停止信号, 并能接收从设备发出的应答信号。将配置的数据保存在ROM 中, 工作时,ROM 中的数据经I2C 总线发送给TVP5150 和SAA7121H, 完成对这两个芯片的配置。
2.2 异步FIFO 模块
视频解码芯片输出的视频信号频率为27 MHz , 而FPGA 内的全局时钟为50 MHz, 两者的时钟频率不匹配, 将视频数据流送入FPGA 时存在跨时钟域问题。FIFO 是一种先进先出的数据缓存器, 数据可以以任何时钟频率在发送端发送数据, 在接收端从队列中得到数据, 发送端和接收端的时钟不需要一致。与其他缓存介质相比,FIFO 的访问只需要读写线, 空/满信号线用来防止数据溢出, 结构简单、易于实现且能有效地解决跨时钟域问题。
异步FIFO 的设计利用FPGA 内部的BRAM 配合控制信号实现。FIFO 由Xilinx 公司提供的IP 核设计生成,配置信号主要通过FIFO 的almost_full 和almost_empty 信号来生成读/写信号。在本系统中,异步FIFO 一次缓存一行数据,由于数据的读取比写入快,因此先写入一部分数据后再使读信号有效,最终,一行数据的读写操作同时完成。
2.3 视频解码模块
ITU-R BT.656 格式的视频信号的行场同步信号内嵌在数据流中, 因此在进行数据处理之前需从数据流中分离出有效的图像信号。有效的视频信号是通过分析视频起始信号(SAV) 和视频结束信号(EAV) 的数据来确定的。视频解码过程如下:
(1 ) 若检测到“FF 00 00 ” 数据段, 说明是定时基准信号, 转到步骤(2 ) 对后一字节的值进行判断。
(2 ) 若bit4 为1 , 说明为EAV 信号, 返回步骤(1 ) ;若bit4 为0, 说明为SAV 信号, 后面为有效的视频数据,
转到步骤(3 ) 。
(3 ) 采集有效视频数据, 视频数据是按Cb 、Y、Cr 、Y……的顺序传输的,保留Y 信号,Cb 和Cr 信号填充为80。
(4 ) 计数器计数到720 , 采集完一行视频数据。通过此解码过程可以得到有效的视频数据,并将色差图像转换为灰度图,方便后面的图像处理模块处理。
2.4 图像帧缓存
在实时图像处理系统中, 需要高速缓存大量数据。DDR SDRAM 是双倍数据率的SDRAM, 在时钟的上升沿和下降沿都可以进行数据传输, 且容量较大, 是用作图像帧缓存的理想器件。
DDR SDRAM 控制器主要包含两部分功能: 一是在系统上电时对DDR SDRAM 进行初始化, 二是接收地址线和组地址线的信号并将其译码为读、写、预充电和自刷新等命令。DDR SDRAM 控制器的结构如图2 所示。

其中, 基础模块接收来自系统的时钟信号和重置信号, 通过一个DCM 模块生成DDR SDRAM 需要的两个正交相位的差分时钟信号、自刷新时钟和校准时钟, 并提供控制器的reset 信号。用户接口模块提供DDR 控制器、视频解码模块及图像处理模块的接口, 它主要包含地址FIFO、写数据FIFO 和读数据FIFO 3 个FIFO。其中, 地址FIFO 存储地址线传输来的信号, 并发送给控制器模块; 从视频解码模块传送来的视频数据存储在写数据FIFO 中, 送入DDR SDRAM 缓存; 从DDR SDRAM 中读出的数据缓存在读数据FIFO 中, 然后传输给图像处理模块进行处理。控制器模块负责对DDR SDRAM 进行初始化, 接收地址线(A0~A11 ) 和组地址线(BA0 和BA1) 的信号并将其译码为读、写和自动刷新等命令。Datapath 模块负责与存储器之间的数据传输, 主要功能包括存储写入的数据和计算读数据通路的值。
3 图像中值滤波器的设计
在图像采集、转换和传输的过程中, 由于受到各种因素的影响, 获取的图像往往与实际图像有差异。图像质量的下降使得从图像中获取信息产生困难, 因此需要对退化的图像进行适当的处理, 使处理后的图像更适合观察或提取有用信息。中值滤波是对图像的低通滤波,可有效滤除高频噪声, 增强图像清晰度[ 2-3]。
3.1 中值滤波算法
中值滤波算法首先对一个n×n 窗口内的数据进行排序, 然后取第(n2+1 )/2 个数作为当前像素点的新值,即用中值替换原值。因此, 选择合适的排序算法是提高滤波器性能的关键。若采用冒泡排序, 对于一个大小为n 的序列, 首先遍历整个数列, 找出最大值, 然后对除去最大值的序列再次遍历, 得到第二大的值, 如此循环直到对整个数列完成排序。整个过程需要n (n-1 )/2 次比较, 时间复杂度为O(n2) 。算法进行了大量的重复比较,效率低且不适合用FPGA 实现。
由于中值滤波只需找到中值而无需对数列完全排序, 因此结合FPGA 并行计算的特点, 可对排序算法进行改进。将3×3 二维中值滤波窗口内的数据作如表1所示的定义。

首先对窗口内的每一行进行排序, 分别得到3 行的最大值、中值和最小值, 分别记为Max 、Med 和Min 。对于窗口的第1 行数据, 有:


同理, 可得到第2 行和第3 行数据的最大值、中值和最小值。
使用传统的冒泡排序计算中值时, 需要进行n (n -1 )/2 次比较, 对于3×3 的窗口即需要比较36 次, 即使在求得中值后不再进行比较,也需要30 次,整个比较过程至少需要30 个时钟周期。而这种快速中值滤波方法只需进行19 次比较,大大减少了比较操作,且充分利用FPGA的并行处理能力,只需9 个时钟周期即可完成,节省了运算时间。其滤波操作过程如图3 所示。

3.2 中值滤波器的实现
本系统的中值滤波模块采用Xilinx 公司的集成开发工具System Generator 设计实现。System Generator 在很多方面扩展了MathWorks 公司的Simulink 平台, 在MATLAB/Simulink 环境下对算法及系统建模和软硬件协同仿真、执行和验证不需要书写HDL 代码, 构建好的工程调用ISE 进行综合、仿真和实现, 并完成最终的配置。System Generator 能快速、简易地将DSP 系统的抽象算法转化为可综合、可靠的硬件系统, 为DSP 系统的设计提供了便利。
中值滤波3×3 的窗口采用一个双端口RAM 和delay模块来实现, 计算部分主要靠多个3 值比较器来实现。3值比较器对输入的3 个数据进行排序, 得到最大值、中值和最小值, 通过7 个3 值比较器的级联即可实现快速中值滤波算法。在设计中采用MCode 模块来实现3 值比较器,MCode 模块支持MATLAB 语言的有限子集, 能有效地实现算术运算、有限状态机和逻辑控制。在MCode模块对应的.M 文件中, 编写一个3 值的排序算法, 然后将该Mcode 模块按图3 的方式连接, 形成中值滤波器,如图4 所示。

FPGA 不仅可以起到胶合逻辑的功能, 对外围模块进行控制和连接, 而且可以取代数字信号处理器(DSP)实现图像处理算法。采用FPGA 实现图像处理是一种稳定、有效、经济的方案。
继承事业,薪火相传
返回列表