【FPGA/图像处理】局部滤波器-局部阈值化
世界Skill
图像处理理系列文章基本都是我本科毕设论文同步发布,这个项目以LGPL许可被发布在F-I-L。局部阈值化有别于全局阈值化,它并非利用一个全局的阈值作用于整张图像,而是对每一个单独的像素都使用一个单独的阈值,这个阈值通常来源于局部滤波器的输出。不同局部滤波器给出的阈值会产生非常不同的效果,而无论是哪一种阈值,最终的目的都是给出一个比较清晰而明确的边缘,通常这个效果比较容易达到,所以局部阈值化是一个不错的边缘检测子,本节将会说明如何实现一个局部阈值化的IP核。
这个IP核的资源在这里:
ThresholdLocal
3 算法实现
明确了设计和架构,便可以进行算法的实现。本章将会说明如何实现图像处理的算法,以及如何运用它们。
3.12 局部滤波器-局部阈值化
局部阈值化有别于全局阈值化,它并非利用一个全局的阈值作用于整张图像,而是对每一个单独的像素都使用一个单独的阈值,这属于自适应二值化的一种[3]这个阈值通常来源于局部滤波器的输出。不同局部滤波器给出的阈值会产生非常不同的效果,而无论是哪一种阈值,最终的目的都是给出一个比较清晰而明确的边缘,通常这个效果比较容易达到,所以局部阈值化是一个不错的边缘检测子,本节将会说明如何实现一个局部阈值化的IP核。
3.12.1 原理
局部阈值化大致与全局阈值化相同,唯一不同的是其阈值并非静态而是随着像素的输入而变化的。对于流水线模式,这个动态的变换有两种处理方式,要么要求外部提供的像素和该像素对应的阈值是同步的,要么将同步做到模块的内部,内建缓存进行同步。考虑到对用户的便利性,本模块选择了第二种模式,提供额外的配置参数来确定缓存级数,并且由额外的使能信号来确定输出值。如图3-12-1,buffer是缓冲器,ConOut是输出计数器的输出值,当像素数据输入使能时计数器开始计数,直到阈值数据输入使能计数停止,并由当前的ConOut确定选择Buffer中的哪一个数据与输入的阈值进行比较,之后流水化输出。
图3-12-1 内建缓存流水线
3.12.2 设计
根据原理可知,ThresholdLocal核(以下简称THL核)还需要有一个用于确定从像素数据有效到阈值数据有效的最大周期的配置参数max_delay,一个阈值数据输入端口ref_data,阈值数据使能端口ref_enable,故一个THL核需要的配置参数和端口如表3-12-1与表3-12-2。
名字 | 类型 | 范围 | 默认值 | 说明 |
---|---|---|---|---|
work_mode | 无符号 | 0为流水线模式,1为请求响应模式 | 0 | 工作模式 |
in_window_width | 无符号 | 1 - 15 | 1 | 如果输入像素以窗口中心的形式输入,则是窗口宽度,否则为1。 |
color_width | 无符号 | 1 - 12 | 8 | 色彩位宽。 |
max_delay | 无符号 | 取决于可能的延迟 | 8 | 像素使能到阈值使能之间可能的最大延迟周期。 |
max_delay_bits | 无符号 | 取决于延迟周期 | 4 | 延迟周期的位宽。 |
名字 | 端口 | 类型 | 范围 | 默认值 | 说明 | clk | 输入 | 无符号 | 无 | 无 | Clock. |
---|---|---|---|---|---|
rst_n | 输入 | 无符号 | 无 | 无 | 复位,低有效。 |
in_enable | 输入 | 无符号 | 无 | 无 | 输入数据使能,在流水线模式下,它是另一个复位信号,在请求响应模式下,只有在它有效的时候in_data才会被真正地改变。 |
in_data | 输入 | 无符号 | color_width * in_window_width * in_window_width - 1 : 0 | 无 | 输入数据,必须和in_enable同步输入。 |
ref_enable | 输入 | 无符号 | 无 | 无 | 阈值数据使能。 |
ref_data | 输入 | 无符号 | color_width - 1 : 0 | 无 | 阈值数据,必须和ref_enable同步输入。 |
out_ready | output | 无符号 | 无 | 无 | 输出数据有效,在两种模式下,这个信号都会在out_data可以被读取的时候有效。 |
out_data | output | 无符号 | color_width - 1 : 0 | 无 | 输出数据,将会和out_ready同步输出。 |
3.12.3 实现
根据3.12.2的设计便可以实现一个THL核,流水线模式和请求响应模式实现如下。
3.12.3.1 流水线模式
保证地址和数据同步流水化输出,在复位时二者皆输出为0,实现如下:
in_enable或rst_n为低时,系统复位,输出无效;否则阈值使能后1个周期第一个结果被输出,并且每一个clk的上升沿都会送入一个窗口进行处理,第一个输出有效之后,每一个周期都将送出一个结果,波形如图3-12-2。
图3-12-2 流水线模式时序
3.12.3.2 请求响应模式
基本与3.12.3.1一致,但只有in_enable的上升沿时才会有窗口被输入,波形如图3-12-3。
图3-12-3 请求响应模式时序
3.12.3.3 IP核GUI
完成功能后对THL核进行了封装,封装如图3-12-4。
图3-12-4 THL核的GUI
3.12.4 仿真
THL核只对灰度图有意义,我选取了两张灰度图像仿真源,分别测试了3x3和5x5窗口、均值滤波和中值滤波作为阈值来源的情况,原始图像如图3-12-5。
图3-12-5 原始测试图像
使用HDL功能仿真和软件仿真的结果进行PSNR的计算,仿真结果如图3-12-6所示。
图3-12-6 仿真结果,从左上依次为流水线模式下的HDL功能仿真结果,请求响应模式下的HDL功能仿真结果,软件仿真结果
仿真结果的清晰图像如图3-12-7与3-12-8,并且同样用软件仿真进行了大窗口的测试,结果如图3-12-9。可见无论是哪一种阈值来源,对边缘的保留都比3.4中基本的阈值化算法的效果要好,同时中值滤波作为阈值来源时边缘保留的更好,但不如均值滤波干净,而均值滤波的干净是以牺牲某些细节换来的,但对于突出主体的应用很有效。同时,窗口并非越大越好,也并非越小越好,应当根据需求适当选取。
图3-12-7 均值滤波来源阈值,左侧为3x3窗口,右侧为5x5窗口
图3-12-8 中值滤波来源阈值,左侧为3x3窗口,右侧为5x5窗口
图3-12-9 11x11的窗口滤波来源阈值,左侧为均值滤波,右侧为中值滤波
3.12.5 资源和时序
最终实现与窗口大小关系很大,此处只对色彩位宽为8,最大延迟为8的状况分析,根据Vivado生成的报表,主要资源耗费如表3-12-3。
Slice LUTs* | Slice Registers |
---|---|
39 | 70 |
同时根据时序报告,最大的Data Path Delay(数据路径延迟)为3.187ns,即:
FMax = 313.77MHz
即说明,THL核在流水线模式下,理论上在处理1080p全高清图像时可以达到151帧。
由于数据路径延迟和应用的最终约束设置强相关,所以仅供参考。
3.12.6 分析与结论
PSNR如表3-12-5。
1-3-mean | 1-3-mid | 1-5-mean | 1-5-mid | 2-3-mean | 2-3-mid | 2-5-mean | 2-5-mid | Total |
---|---|---|---|---|---|---|---|---|
1000000.00 | 1000000.00 | 1000000.00 | 1000000.00 | 1000000.00 | 1000000.00 | 1000000.00 | 1000000.00 | 1000000.00 |
PSNR均值为最大值,THL核与软件等效,同时可以达到不错的FMax,设计成功。
参考文献
[3] Donald G.Bailey.基于FPGA的嵌入式图像处理系统设计[M].原魁,何文浩,肖晗译.北京:电子工业出版社,2013
感谢
仿真图像来源:
H2SO4-蝶
パセリ-Favour