设窗口的数据分别为:
W11 W12 W13 W21 W22 W23 W31 W32 W33 第一步:
可以将这9个数据按行数分成3组( L1 , L2 ,L3 ) ,分别进行排序。
L1min = min{W1y} L1med = med{W1y} L1max = max{W1y} L2min = min{W2y} L2med = med{W2y} L2max = max{W2y} L3min = min{W3y} L3med = med{W3y} L3max = max{W3y} 第二步:
重新分组,将每组中的最大值,共3个值,选出组成大值组V1 ,类似地组成中值组V2和小值组V3,再次分别排序。
V1min = min{ L x max } V1med = med{ L x max } V1max = max{ L x max }
V2min = min{ L x med } V2med = med{ L x med } V2max = max{ L x med }
V3min = min{L x min } V3med = med{ L x min } V3max = max{ L x min }
经过分析可得到:
V1max是九个值中最大的,不可能是中间值;
V1med是由小到大排列的九个值中至少是处于第六的位置,不可能是中间值; V2min是由小到大排列的九个值中至多是处于第四的位置,不可能是中间值; V2max是由小到大排列的九个值中至少是处于第六的位置,不可能是中间值; V3min是由小到大排列的九个值中是处于最小的位置,不可能是中间值; V3med是由小到大排列的九个值中至多是处于第四的位置,不可能是中间值。 第三步:
排除了以上六个值,还剩下大值组的V1 min ,中值组的V2med和小值组V3 max的三个值可能是中间值。将这三个值排序,可以证明这三个值的中间值med{V1min ,
V2med ,V3max }就是这九个值中的中间值,用Smed表示。 证明如下:
这三个值在由这九个数值组成的矩阵中的位置如下:
V1min V1med V1max V2min V2med V2max V3min V3med V3max
31 假设max{ V1min , V2med ,V3max } 是这九个数值中的中间值Smed 那么Smed 是矩阵中包括主对角线在内的左下角六个值中最大的,在九点由小到大的排序中至少处于第六的位置,所以不可能是中间值;同理,假设min{ V1min ,V2med ,
V3max } 是这九个数值中的中间值Smed , 那么Smed在这九个值的由小到大的排序中至多是处于第四的位置, 也不可能是中间值。由于奇数点的中值一定存在, 则唯一的可能就是事实,所以med{ V1min ,V2med ,V3max }一定是这九个值的中间值Smed。如图7-5所示(a,b,c为比较器):
W11 W12 W13 a b V1min W21 W22 W23 a b V2med c S med W31 W32 W33 a b V3max
图7-5 3 ×3中值滤波
整个算法可以分成以上三个步骤,而且每个步骤在硬件平台上完全可以并行执行, 这样可以大大提高排序的效率。另外, 算法不是对9点数据的完整排序,而是采用分组比较的办法找到中值,简化了排序的过程,从而提高了效率。
7.5 FPGA 的设计实现
7.5.1 FPGA的选取
FPGA是一种基于查找表结构的可编程逻辑器件,其面世给电子设计带来了极大的方便,在实时图像处理领域也获得了广泛的应用。FPGA具有大量灵活的逻
32 辑单元,很好的在线可编程性和高速并行的结构特点使其可以取代分离元件和中小规模逻辑电路成为电子设计的主流和发展方向。本设计采用XILINX公司的Virtex2E系列FPGA来实现上述中值滤波算法。Virtex2E系列FPGA主要包括可编程逻辑块(CLB) ,用于实现用户的逻辑功能;输入输出块(IOBs) ,用于提供封装引脚和内部信号的接口,完成不同电气特性的输入输出要求;丰富的布线资源用于可编程逻辑块和输入输出块之间的连接;大量的片上RAM 资源,包括分布式的Select RAM和块状的Block RAM ,可以配置成为双口RAM 、FIFO 等数据结构。FPGA可以方便地实现组合逻辑和时序逻辑功能。FPGA具有较小的基本逻辑单元(LC),逻辑单元可以通过级连实现较长的数据通路,适合实现流水线结构。FPGA的逻辑单元可以按功能进行更细的划分,设计中可以充分利用单元内的资源实现各种逻辑功能。
7.5.2中值滤波算法硬件实现分析
FPGA灵活的结构和丰富的资源为完成算法的提供了保障。FPGA内部的查找表(Look2Up2Ta2ble)简称为LU T ,也称为函数发生器,本质上就是一个RAM。目前FPGA中多使用4输入的LUT,所以每一个LUT可以看成一个有4位地址线的RAM。当用户通过原理图或VHDL语言描述了一个逻辑电路以后,PLD/FPGA开发软件会自动计算逻辑电路的所有可能的结果,并把结果事先写入RAM中,输入信号作为地址查找相应的数据,然后输出,,这样可以实现大多数组合逻辑。查找表的结构决定了组合逻辑的实现只与输入信号的数量有关而与逻辑的复杂程度无关,而且输入信号的数量可以通过进位逻辑加以扩展。
本设计中应用的二值数据的比较,完全可以由查找表来实现。进位链可以实现比较器的位数扩展。同步电路是直接利用LUT后面D触发器来实现,同步时钟信号由专用的全局时钟引脚输入后进入芯片内部的时钟专用通道,直接连接到触发器的时钟端,触发器的输出与I/O脚相连,把结果输出到芯片管脚。片上的Block RAM可以实现FIFO来存储整行的图像数据,将视频数据流并行化来实现二维图像处理。摄像机输出的数字视频图像是逐点送数的,所以FPGA可以按照摄像机数据传输的速率进行处理,这样可以使得一幅图像传输结束后就处理完毕。图7.6为中值滤波的硬件方框图[24]。
33 Pix in FIFO1 视频图像输入 Pix b FIFO2 Pix c 存储窗口 快速算法 滤波输出 控制信号 图7.6 中值滤波的硬件方框图
7.5.3FPGA程序的设计
设计采用XILINX公司的Vertex-E系列FPGA芯片,ISE6.2集成开发环境为软件开发工具。程序采用VHDL语言编写,自上而下模块化设计,增加了程序的可读性和可维护性并易于综合器综合。充分利用FPGA的结构特点设计程序。为了能够达到较好的综合效果,利用编译环境提供的参数化的宏模块实现工具CORE generator 实现行数据存储缓冲器FIFO1和FIFO2。在FPGA中定义由九个寄存(W11,W12,W13,W21,W22,W23,W31,W32,W33)组成的3×3 模板寄存器组来暂时存放3×3窗口中的视频数据。存放的数据随着图像数据实时更新。FPGA内部电路工作流程如图7.7 所示。
34 图像数据 N+1行数据缓冲器FIFO2 N行数据缓冲器FIFO1 3×3模板寄存器组 L1min L1med L1max L2min L2med L2max L3min L3med L3max 数据重新分组 V1max V2med V3min S med-med {V1min,V2med,V3max} 输出数据
图7.7 FPGA 内部工作流程图
图像的第N(N>=1)行数据以数据流的形式在像素时钟同步下存入N+1行数据缓冲器FIFO2中,当第N行数据结束后,在行同步信号的控制下,第N行数据在时钟同步下依次从FIFO2中读出写入到N 行数据缓冲器FIFO1中,同时第N +1行数据依次存入FIFO2中。当摄像机输出图像的N+2行数据时, FIFO1中存放的图像的第N行数据;FIFO2中存放的是图像的第N+1行数据。这样图像的3×3窗口数据就可以存入模板寄存器组中来进行求中间值的运算了。
本设计采用VHDL语言设计电路,编译器的标准库中带有比较操作符很容易实现数据的两两比较。按照上述算法将模板寄存器组的数据分成3组(L1,L2,L3) ,每组三个数值很容易求得每组的最大值、中间值和最小值。然后重新分组,将每组的最大值、中间值和最小值分成3组,依次为V1、V2、V3。只要求得V1组的最大值V1max ;V2 组的中间值V2med和V3组的最小值V3min 。最后通过比较
35