【FPGA/图像处理】局部滤波器-二值形态学滤波
世界Skill
图像处理理系列文章基本都是我本科毕设论文同步发布,这个项目以LGPL许可被发布在F-I-L。形态学滤波器是很常用的一种局部滤波器,顾名思义,它针对图像的形态进行操作,关注的是“形状”。形态学滤波一般分为腐蚀和膨胀,而在其之上又可以叠加为开运算和闭运算,它对二值图像、灰度图像均有效,但二者实现的方式不同,一般最常用的是二值形态学滤波,针对灰度的本质上是极大值和极小值排序滤波器,暂时不再赘述。形态学滤波常用于图像细化、骨架提取等[21,22,23,24],可以作为图像识别的一种基本的预处理操作。本节将会说明FPGA的形态学滤波模块实现。
这个IP核的资源在这里:
ErosionDilationBin
3 算法实现
明确了设计和架构,便可以进行算法的实现。本章将会说明如何实现图像处理的算法,以及如何运用它们。
3.13 局部滤波器-二值形态学滤波
形态学滤波器是很常用的一种局部滤波器,顾名思义,它针对图像的形态进行操作,关注的是“形状”。形态学滤波一般分为腐蚀和膨胀,而在其之上又可以叠加为开运算和闭运算,它对二值图像、灰度图像均有效,但二者实现的方式不同,一般最常用的是二值形态学滤波,针对灰度的本质上是极大值和极小值排序滤波器,暂时不再赘述。形态学滤波常用于图像细化、骨架提取等[21,22,23,24],可以作为图像识别的一种基本的预处理操作。本节将会说明FPGA的形态学滤波模块实现。
3.13.1 原理
二值形态学滤波的操作单元与其他局部滤波器一致,都是包含了某一个中心像素点及其邻域的窗口,但比起其他操作,它还有一个作为参照的“模板”,并根据模板和窗口的运算来得到输出。所有的二值图像都可以分为主体像素和背景像素,一般以1为主体像素,0为背景像素,这样最基本的基本的二值形态学操作-腐蚀和膨胀便可以定义为式3-13-1和3-13-2,其中I为输入,T为模板,可见腐蚀是一种收缩的变换,它将窗口与模版进行对比,如果模板中每一个主体像素都落在窗口内,则此时窗口的中心像素置1,否则为0;而膨胀则是一个扩张的变换,只要模板中的任一主体像素落在窗口内,则中心像素置1。腐蚀和膨胀的原理示意如图3-13-1,空心的点表示0,否则表示1。

图3-13-1 腐蚀膨胀原理
腐蚀和膨胀还可以结合成开运算(先腐蚀后膨胀)和闭运算(先膨胀再腐蚀),这可以利用两个基本操作的级联来完成。
在FPGA中,腐蚀膨胀可以由基本的逻辑运算来完成,并且可以用同一种结构完成[3],如图3-13-2所示,深色的方块代表窗口,浅色的代表模板,mode用于控制腐蚀和膨胀的模式,0为腐蚀,1为膨胀,Q为输出。如此,服饰和膨胀的逻辑运算形式便可以表示为式3-13-3,Q为输出,I为输入,T为模板,size为窗口宽度。可知,每一个像素点需要进行一次异或运算、一次非运算和一次或运算,之后所有的像素总共要进行NxN次的与运算,考虑FMax,所以选择和3.10一样的分级运算来完成。

图3-13-2 腐蚀膨胀逻辑结构
3.13.2 设计
根据原理可知,ErosionDilationBin核(以下简称EDB核)还需要一个用于确定与运算级数的配置参数,以及在腐蚀模式和膨胀模式之间选择的端口,还有一个用于输入模板的端口,故一个EDB核需要的配置参数和端口如表3-13-1与表3-13-2。
名字 | 类型 | 范围 | 默认值 | 说明 |
---|---|---|---|---|
work_mode | 无符号 | 0为流水线模式,1为请求响应模式 | 0 | 工作模式 |
window_width | 无符号 | 2 - 15 | 1 | 窗口宽度和高度。 |
pipe_stage | 无符号 | 取决于窗口的宽度,为log2(window_width^2) | 3 | 流水线级数。 |
名字 | 端口 | 类型 | 范围 | 默认值 | 说明 | clk | 输入 | 无符号 | 无 | 无 | Clock. |
---|---|---|---|---|---|
rst_n | 输入 | 无符号 | 无 | 无 | 复位,低有效。 |
mode | 输入 | 无符号 | 0为腐蚀,1为膨胀。 | 无 | 操作模式。 |
template | 输入 | 无符号 | window_width * window_width - 1 : 0 | 无 | 用于操作的模板。 |
in_enable | 输入 | 无符号 | 无 | 无 | 输入数据使能,在流水线模式下,它是另一个复位信号,在请求响应模式下,只有在它有效的时候in_data才会被真正地改变。 |
in_data | 输入 | 无符号 | color_width * in_window_width * in_window_width - 1 : 0 | 无 | 输入数据,必须和in_enable同步输入。 |
out_ready | output | 无符号 | 无 | 无 | 输出数据有效,在两种模式下,这个信号都会在out_data可以被读取的时候有效。 |
out_data | output | 无符号 | color_width - 1 : 0 | 无 | 输出数据,将会和out_ready同步输出。 |
3.13.3 实现
根据3.13.2的设计便可以实现一个EDB核,流水线模式和请求响应模式实现如下。
3.13.3.1 流水线模式
输入使能后pipe_stage个周期第一个结果被输出,开始流水化工作,波形如图3-13-3。

图3-13-3 流水线模式时序
3.13.3.2 请求响应模式
基本与3.13.3.1一致,但只有in_enable的上升沿时才会有窗口被输入,波形如图3-13-4。

图3-13-4 请求响应模式时序
3.13.3.3 IP核GUI
完成功能后对EDB核进行了封装,封装如图3-13-5。

图3-13-5 EDB核的GUI
3.13.4 仿真
EDB核只对二值图像有意义,我选取了两张二值图像作为仿真源,分别测试了对腐蚀和膨胀操作配置了两套模版,原始图像如图3-13-6。

图3-13-6 原始测试图像
使用HDL功能仿真和软件仿真的结果进行PSNR的计算,仿真结果如图3-13-7所示。

图3-13-7 仿真结果,从左上依次为流水线模式下的HDL功能仿真结果,请求响应模式下的HDL功能仿真结果,软件仿真结果
仿真结果的清晰图像如图3-13-8,可见膨胀的确有扩张的功能,腐蚀的确有收缩细化的功能。同时也对开运算和闭运算做了实验,结果如图3-13-9所示,开运算可以将一些原本断续的线条“打开”,使图像零散化,而闭运算则是将线条闭合,使图像连续化。

图3-13-8 部分仿真结果,左侧为膨胀,右侧为腐蚀

图3-13-9 开闭运算结果,左侧为开运算,右侧为闭运算
3.13.5 资源和时序
最终实现与窗口大小关系很大,此处只对窗口为3x3的状况分析,根据Vivado生成的报表,主要资源耗费如表3-13-3。
Slice LUTs* | Slice Registers |
---|---|
12 | 9 |
同时根据时序报告,最大的Data Path Delay(数据路径延迟)为2.529ns,即:
FMax = 395.41MHz
即说明,EDB核在流水线模式下,理论上在处理1080p全高清图像时可以达到190帧。
由于数据路径延迟和应用的最终约束设置强相关,所以仅供参考。
3.13.6 分析与结论
PSNR如表3-13-5。
1-Dilation-110110000 | 1-Dilation-111111000 | 1-Erosion-110110000 | 1-Erosion-111111000 | 2-Dilation-110110000 | 2-Dilation-111111000 | 2-Erosion-110110000 | 2-Erosion-111111000 | Total |
---|---|---|---|---|---|---|---|---|
1000000.00 | 1000000.00 | 1000000.00 | 1000000.00 | 1000000.00 | 1000000.00 | 1000000.00 | 1000000.00 | 1000000.00 |
PSNR均值为最大值,EDB核与软件等效,同时可以达到不错的FMax,设计成功。
参考文献
[3] Donald G.Bailey.基于FPGA的嵌入式图像处理系统设计[M].原魁,何文浩,肖晗译.北京:电子工业出版社,2013.
[21] 施启乐,王从军,黄树槐等.数学形态学图像细化算法在RE中的应用研究[J].华中科技大学学报(自然科学版),2004,32(7):37-39.DOI:10.3321/j.issn:1671-4512.2004.07.013.
[22] 王怀群.二值图象的细化[J].无锡轻工大学学报,2001,20(3):315-318.DOI:10.3321/j.issn:1673-1689.2001.03.021.
[23] 李娜. 基于FPGA的图像实时检测系统识别系统设计[D].长春理工大学,2013.
[24] 曹玉龙. 线划图像的细化算法研究[D].长安大学,2011.
感谢
仿真图像来源:
LM7-アイカツ
ぜろきち-Blue star