【FPGA/图像处理】局部滤波器-均值滤波器

少女dtysky

世界Skill

时刻2015.05.20

图像处理理系列文章基本都是我本科毕设论文同步发布,这个项目以LGPL许可被发布在F-I-L。均值滤波器是局部滤波器的一种,又称为平滑线性滤波器[15],它通常用于去除图像中高斯噪声[16],其具有对图像的模糊效果。均值滤波器有两种,一种是算术均值滤波器,一种是加权均值滤波器,前者可以看做是后者的特例,但考虑到加权均值滤波需要消耗大量乘法运算,并且除法运算难以避免,对FPGA并不友好,故这里只讨论算术均值滤波器的实现,本节将说明如何用FPGA实现一个均值滤波器。
这个IP核的资源在这里:
MeanFilter


3 算法实现

明确了设计和架构,便可以进行算法的实现。本章将会说明如何实现图像处理的算法,以及如何运用它们。

3.10 局部滤波器-均值滤波器

均值滤波器是局部滤波器的一种,又称为平滑线性滤波器[15],它通常用于去除图像中高斯噪声[16],其具有对图像的模糊效果。均值滤波器有两种,一种是算术均值滤波器,一种是加权均值滤波器,前者可以看做是后者的特例,但考虑到加权均值滤波需要消耗大量乘法运算,并且除法运算难以避免,对FPGA并不友好,故这里只讨论算术均值滤波器的实现,本节将说明如何用FPGA实现一个均值滤波器。

3.10.1 原理

算术均值滤波器的基本原理见图3-10-1,这是一个3x3的均值滤波器,它对窗口中所有的像素求和,之后除以像素个数,最终得到的是整个窗口中像素的算术平均值,即式3-10-1所示,之后用这个均值来取代窗口的中心像素点。所以可知,一次均值运算需要若干次加法和一次除法,在FPGA中一个周期内实现这么多次加法对于FMax很不友好,所以需要考虑将其拆分,同时除法运算如果可以避免尽量避免,因为除法消耗的资源比较多,如果不使用DSP其对FMax的影响也会比较大。综上,本设计应当重点关注加法分段和除法替代的算法。

图3-10-1 算术均值滤波器原理
图3-10-1 算术均值滤波器原理

Q=1n2i=0n2Ii        (3101)Q=\frac{1}{n^2}\sum_{i=0}^{n^2}I_i\ \ \ \ \ \ \ \ (3-10-1)

3.10.1.1 加法

将像素视为基本元素,一个窗口可以看作是从左上到右下的元素构成的一个列表。当N为偶数时,列表中的N个元素的一次求和运算,可以用若干级求和运算来代替,每一级求和运算由若干组的两个元素的求和运算组成,每一级的求和运算次数为n2\frac{n}2n22\frac{n}{2^2}n23\frac{n}{2^3}......直到某一级的运算次数为1,该级的这唯一的运算结果便是列表中所有元素的和,此时求和结束。当N为奇数时,只需要让列表中的最后一个元素参与到第一组加法中即可,图3-10-2演示了3x3的窗口的求和过程。

图3-10-2 3x3窗口求和
图3-10-2 3x3窗口求和

可见,一个N个元素的列表求和需要分为的级数S如式3-10-2。

Q=log2N        (3102)Q=\log_2N\ \ \ \ \ \ \ \ (3-10-2)

3.10.1.2 除法

由于本库限定窗口大小为2-15,个数不多,所以除法运算替代为若干次的移位相加操作是可以接受的。综合考虑到FPGA加法操作的延迟和运算消耗的周期,以三次移位两次加法为上限,同时为了防止最终的运算结果溢出,需要保证使用替代后的算法计算出来的结果不大于标准操作的结果,经过试验和删选,最终确定的替代算法如下:

case (window_width)
    2 : reg_out_data <= sum_all >> 2;
    3 : reg_out_data <= (sum_all >> 4) + (sum_all >> 5) + (sum_all >> 6);
    4 : reg_out_data <= sum_all >> 4;
    5 : reg_out_data <= (sum_all >> 5) + (sum_all >> 7) + (sum_all >> 10);
    6 : reg_out_data <= (sum_all >> 6) + (sum_all >> 7) + (sum_all >> 8);
    7 : reg_out_data <= (sum_all >> 6) + (sum_all >> 8) + (sum_all >> 10);
    8 : reg_out_data <= sum_all >> 6;
    9 : reg_out_data <= (sum_all >> 7) + (sum_all >> 8) + (sum_all >> 11);
    10 : reg_out_data <= (sum_all >> 7) + (sum_all >> 9) + (sum_all >> 13);
    11 : reg_out_data <= (sum_all >> 7) + (sum_all >> 12) + (sum_all >> 13);
    12 : reg_out_data <= (sum_all >> 8) + (sum_all >> 9) + (sum_all >> 10);
    13 : reg_out_data <= (sum_all >> 8) + (sum_all >> 9) + (sum_all >> 14);
    14 : reg_out_data <= (sum_all >> 8) + (sum_all >> 10) + (sum_all >> 12);
    15 : reg_out_data <= (sum_all >> 8) + (sum_all >> 11);
    default : /* default */;
endcase

使用Python进行软件测试,每个窗口大小所对应的误差为如表3-10-1。可见最大误差在2%左右,对于此应用可以接受。

窗口宽度 误差
2 0.00%
3 2.35%
4 0.00%
5 0.39%
6 2.35%
7 0.00%
8 0.00%
9 1.57%
10 1.57%
11 1.57%
12 2.35%
13 0.39%
14 0.00%
15 1.18%
表3-10-1 除法误差

3.10.2 设计

根据原理可知,MeanFilter核(以下简称MF核)核心是若干级的加法和最后的除法,加法的分级可以使用verilog中的generate语句来批量生成,生成的流水线级数依赖于根据窗口宽度计算得出的某个参数,我将此参数命名为sum_stage。综上,一个MF核需要的配置参数和端口如表3-10-2与表3-10-3。

名字 类型 范围 默认值 说明
work_mode 无符号 0为流水线模式,1为请求响应模式 0 工作模式
window_width 无符号 2 - 15 3 窗口的宽度和高度。
color_width 无符号 1 - 12 8 色彩位宽。
sum_stage 无符号 取决于窗口宽度,为log2(window_width^2)。 3 加法级数。
表3-10-2 配置参数


名字 端口 类型 范围 默认值 说明
clk 输入 无符号 Clock.
rst_n 输入 无符号 复位,低有效。
in_enable 输入 无符号 输入数据使能,在流水线模式下,它是另一个复位信号,在请求响应模式下,只有在它有效的时候in_data才会被真正地改变。
in_data 输入 无符号 color_width * window_width * window_width - 1 : 0 输入数据,必须和in_enable同步输入。
out_ready output 无符号 输出数据有效,在两种模式下,这个信号都会在out_data可以被读取的时候有效。
out_data output 无符号 color_width - 1 : 0 输出数据,将会和out_ready同步输出。
表3-10-3 端口

3.10.3 实现

根据3.10.2的设计便可以实现一个MF核,流水线模式和请求响应模式实现如下。

3.10.3.1 流水线模式

保证地址和数据同步流水化输出,在复位时二者皆输出为0,实现如下:
in_enable或rst_n为低时,系统复位,输出无效;否则加法级数加2个周期后第一个结果被输出,并且每一个clk的上升沿都会送入一个窗口进行处理,第一个输出有效之后,每一个周期都将送出一个结果,波形如图3-10-3。

图3-10-3 流水线模式时序
图3-10-3 流水线模式时序

3.10.3.2 请求响应模式

基本与3.10.3.1一致,但只有in_enable的上升沿时才会有窗口被输入,波形如图3-10-3。

图3-10-4 请求响应模式时序
图3-10-4 请求响应模式时序

3.10.3.3 IP核GUI

完成功能后对MF核进行了封装,封装如图3-10-5。

图3-10-5 MF核的GUI
图3-10-5 MF核的GUI

3.10.4 仿真

MF核虽然对于所有图像都有意义,但一般用于灰度图像的处理,所以我选取了两张灰度图像仿真源,并且考虑到仿真压力,仅测试了宽度为3和5的窗口,原始图像如图3-10-6。

图3-10-6 原始测试图像
图3-10-6 原始测试图像

使用HDL功能仿真和软件仿真的结果进行PSNR的计算,仿真结果如图3-10-7所示。

图3-10-7 仿真结果
图3-10-7 仿真结果,左侧为流水线模式下的HDL功能仿真结果,中间为请求响应模式下的HDL功能仿真结果,右侧为软件仿真结果

仿真结果的清晰图像如图3-10-8与3-10-9,可见均值滤波的确有模糊图像的效果,窗口越大越明显,同时需要注意由于使用了窗口,所以图像出现了缺行现象,在实际使用时可以在写入帧缓存时利用row_init参数来配置初始写入行,当系统实际运行时,从第二张图像开始这个问题将会被自动弥补。

图3-10-8 3x3窗口的滤波结果
图3-10-8 3x3窗口的滤波结果

图3-10-9 5x5窗口的滤波结果
图3-10-9 5x5窗口的滤波结果

3.10.5 资源和时序

最终实现与窗口大小关系很大,色彩位宽为8,窗口大小为3时的情况进行分析,根据Vivado生成的报表,主要资源耗费如表3-10-4。

Slice LUTs* Slice Registers
83 78
表3-10-4 主要资源耗费

同时由于根据时序报告,最大的Data Path Delay(数据路径延迟)为2.085ns,即:

FMax = 479.61MHz

即说明,MF核在流水线模式下,理论上在处理1080p全高清图像时可以达到231帧。
由于数据路径延迟和应用的最终约束设置强相关,所以仅供参考。

3.10.6 分析与结论

PSNR如表3-10-5。

1-3 1-5 2-3 2-5 Total
1000000.00 1000000.00 1000000.00 1000000.00 1000000.00
表3-10-5 PSNR

PSNR均值为最大值,MF核与软件等效,同时可以达到很高的FMax,设计成功。


参考文献

[15] Rafael C. Gonzales, Richard E. Woods.数字图像处理(第三版)[M].阮秋琦,阮宇智等译.北京:电子工业出版社,2011.6
[16] 关新平,赵立兴,唐英干等.图像去噪混合滤波方法[J].中国图象图形学报,2005,10(3):332-337.DOI:10.3969/j.issn.1006-8961.2005.03.013.)


感谢

仿真图像来源:
おにねこ-クロス.ホエン
月岡月穂-春爛漫

如果不是自己的创作,少女是会标识出来的,所以要告诉别人是少女写的哦。