摘 要: 阐述了灰度形态学滤波的原理和基本操作,给出了3×3结构元素灰度形态学滤波器的硬件结构,详细描述了该滤波器在Xilinx公司的XC2S400E芯片上实现的过程和仿真的方法,并说明了需要注意的问题。
数学形态学滤波是数字图像处理和计算机视觉研究中的一种新方法,已广泛应用于计算机视觉、图像处理、视觉检测、纹理和场景分析等方面。上述这些应用都有时间限制,要求实时处理。数学形态学滤波作为一种非线性滤波技术,其理论基础是集合论,具有天然的并行结构,便于硬件电路实现[1]。但形态学滤波的硬件实现是以牺牲硬件资源为代价的。对于一幅较大的灰度图像,如果采用常规器件实现,硬件结构会相当庞大。
随着微电子技术的发展,现场可编程门阵列(Field Program Gates Array,FPGA)器件已经朝着高密度、低压、低功耗的方向发展。由于FPGA芯片门数不断增加,PLL/DLL、Distributed RAM、Block RAM等片内资源以及设计所需的IP库越来越丰富,所有这些使得基于FPGA的数学形态学滤波器实现成为可能。本文综合考虑了数学形态学滤波器的并行特性和FPGA器件的特点,在Xilinx公司的XC2S400E芯片上实现了灰度图像的开操作形态学滤波器。
1 灰度形态学滤波基本知识[2]
数学形态学是一种数字图像处理的新方法,其研究的主要目的在于描述图像的基本结构和特征,主要内容是在积分几何和随机集合论的基础上,设计一整套变换、概念和算法,以描述图像的各个象素之间的关系。它的基本思想是用具有一定形态的结构元去度量和提取图像中的对应形态以达到对图像分析和识别的目的。形态学的应用可以简化图像数据,保持它们基本的形状特性,并除去不相干的结构。
形态学的基本运算有4种:膨胀、腐蚀、开和闭。灰度图像的腐蚀和膨胀过程可直接从图像及结构元素的灰度级函数计算出来。对图像中的某一点f(x,y),灰度形态学腐蚀运算的定义为:
灰度形态膨胀即以结构元素g(i,j)为模板,搜寻图像在结构基元大小范围内的灰度和的极大值。腐蚀运算过程则是以结构元素g(i,j)为模板,搜寻图像在结构基元大小范围内的灰度差的极小值。灰度的形态膨胀和形态腐蚀运算的表达式与图像处理中的卷积积分非常相似(即以和、差代替连乘,用最小、最大运算代替求总和)。
灰度形态学开运算的定义为:
开运算是采用相同的结构元先做腐蚀再做膨胀的迭代运算。闭运算是采用相同的结构元先做膨胀再做腐蚀的迭代运算。开运算和闭运算的基本作用是对图像进行平滑处理:开运算可以去掉图像中的一些孤立子域和毛刺,闭运算可以填充一些小洞和将2个邻近的目标连接起来。
在形态算法设计中,结构元素的选择十分重要,其形状和尺寸的选择是能否有效地提取信息的关键。一般情况下,结构元素的选择按照下面原则进行:
(1)结构元素必须在几何上比原图像简单,且有界。
(2)结构元素的凸性非常重要,一般选择凸性子集。
2 灰度形态学滤波器的硬件实现
2.1 结构元素选择及简化[3]
本文所述形态学滤波的目的是检测256×256大小12位灰度图像f中的弱小目标,选择3×3大小的扁平结构元素和原始图像做开操作,其结构为:
2.2 电路原理设计[4][5]
输入图像f与结构元素g1腐蚀就是求f中每行相邻3个象素的灰度最小值。对于1幅静止图像,可以采用1个1×3的窗体从图像第1行第1列开始,自左向右滑动,依次取出窗口内的3个象素灰度值,比较得到灰度最小值并按顺序存储。第1行做完后,再在第2行滑动,直至图像的最后1行的最后3个象素。存储后的图像即为f与g1腐蚀的结果图像。对于实时串行输入图像,只需让图像灰度数据流从1×3的窗体通过,取出窗体内的3个象素灰度值,比较后得到的最小值数据流就是腐蚀后的图像灰度数据。
求3个数的最小值可以先求2个数的较小值,将结果再与第3个数比较即可得到最小值。设计的关键是如何利用第1组数据的中间结果快速完成第2组数据的比较。针对图像是串行输入流以及FPGA内部资源足够丰富的特点,设计了二级流水比较器,其逻辑框图如图1所示。图像第1行第1列的灰度值输入后锁存到12位的触发器,待第2个数据输入后与之比较,较小值锁存到中间的12位触发器,而第2个数据存储到左边的12位触发器。当第3个数据输入后与前2个数据的较小值比较,得到第1组数据的最小值,同时第1组数据中的第2个值作为第2组数据的第1个值,将与第3个数据(第2组数据的第2个值)比较。这样,图像数据输入到1×3腐蚀单元,2个象素周期之后即可得到最小值输出数据流。
将图1中的12位锁存器替换深度为256字节的FIFO,即可得到1×3腐蚀逻辑框图。与1×3腐蚀过程类似,f与g1腐蚀的最小值数据流输入到1×3腐蚀单元,2行延迟时间之后即可得到f与g腐蚀的图像灰度数据流。
膨胀的结构图与腐蚀的结构图类似,只不过是求相应的最大值。在图1中,A、B二处分别加入非门即可得到膨胀单元的结构图。将腐蚀单元和膨胀单元级联即可得到如图2所示的f与g开操作结构图。整个结构采用流水线方式设计,使串行输入的灰度数据能够得到并行处理,这样就极大地满足了图像处理的实时性要求。
将腐蚀结构图和膨胀结构图次序交换即可得到形态学滤波闭操作结构图。对于不同大小的结构元模板,其结构图与3×3的结构类似,在此不再赘述。
2.3 FPGA实现
虽然开操作结构图很复杂,但图中实际用到的器件只有12位比较器、12位2选1选择器、深度为256的FIFO以及12位锁存器等。本文选用Xilinx公司的ISE5.2软件为设计平台,以上器件均可以由ISE5.2自带的CORE Generator生成。鉴于开操作的结构特点,整个滤波器采用元件例化的方式设计。求3×3最小值和3×3最大值的部分元件例化VHDL代码如下:
选用XC2S400E芯片,综合后所用主要资源如下:
Number of Slice Flip Flops: 212 out of 9 600 2%
Number of 4 input LUTs: 306 out of 9 600 3%
Number of occupied Slices: 260 out of 4 800 5%
Number of Block RAMs: 4 out of 40 10%
Total equivalent gate count for design: 69 920
3 仿真设计及注意事项
本设计在ModelSim SE 5.6e软件平台下仿真。输入图像大小为256×256,仿真需要的数据量相当大,而且还要求各输入数据的时序一致,仿真测试文件中数据输入采用读文件的方法无法保证数据输入的时序同步。同样,滤波输出的数据量也非常大,直接看波形显然行不通。因此本设计先在C++ Builder环境下将图像文件中的灰度数据转换为测试向量,然后拷贝到仿真测试文件中。虽然测试文件相当大,但可以保证图像灰度值同步输入。对于仿真结果输出,采用写文件的方法,将形态学滤波的输出写入到文件中。通过计算机比较仿真输出文件和同一幅图像在C++ Builder环境下生成的滤波结果文件是否有差异,即可判断功能仿真的正确性。时序仿真时数据输出的时间也要保存到仿真结果文件中。
设计时要注意以下问题:
(1)滤波器要求严格的时序关系,宜采用同步设计。
(2)实际使用时图像是连续输入的,需要用场信号将滤波器复位。
(3)行延迟FIFO宜采用XC2S400E片内的Block RAM生成。
(4)对于256×256的输入图像和3×3的结构元,理论上的有效结果图像大小是254×254。在实际使用中,对于不同大小的结构元,滤波结果输出会滞后几个行周期,在图像输入完以后,象素时钟信号也会撤销,而此时形态学滤波还没有结束,所以输出的图像大小比理论值还要小。不过没有输出的滤波结果数据绝大部分都是无效数据,只有几个象素是有效的。如果需要得到未能输出的几个有效数据,可以在一帧图像输入结束之后再人为地加入几个时钟脉冲。
(5)为了方便下一级处理单元接收滤波数据,输出图像的大小也应设为256×256,相应的地址生成器也应设为256×256,同时需要将无效数据设置为某个定值。
4 结束语
根据实际应用要求,本文设计了3×3结构元素的形态学开操作滤波器,将其简化后设计了相应的硬件原理框图,并在XC2S400E上实现。该设计已经成功地应用到实际中。在本文设计的开操作滤波器基础上,通过简单地改变结构元素或改变滤波子模块次序,即可得到其他性能的形态学滤波器。同时FPGA器件的可编程特性,可以方便地对电路进行改进,以进一步提高电路的性能。
本视频基于Xilinx公司的Artix-7FPGA器件以及各种丰富的入门和进阶外设,提供了一些典型的工程实例,帮助读者从FPGA基础知识、逻辑设计概念
本课程为“从零开始大战FPGA”系列课程的基础篇。课程通俗易懂、逻辑性强、示例丰富,课程中尤其强调在设计过程中对“时序”和“逻辑”的把控,以及硬件描述语言与硬件电路相对应的“
课程中首先会给大家讲解在企业中一般数字电路从算法到流片这整个过程中会涉及到哪些流程,都分别使用什么工具,以及其中每个流程都分别做了
@2003-2020 中国电子顶级开发网