基于FPGA 的含噪图像边缘检测系统的设计与实现

2023-11-19 09:20:42胡雪梅吴占敏
电子制作 2023年21期
关键词:寄存器算子边缘

胡雪梅,吴占敏

(瑞芯微电子股份有限公司,福建福州,350003)

0 引言

图像边缘检测是数字图像处理中的一项关键技术,是模式识别、目标跟踪、运动检测及图像分割等技术的基础,其识别的准确性及速度将直接影响后续图像分析的效果。传统的边缘检测算法大多依靠软件程序,一些普通的图像处理软件在提取图像边缘时无法满足实时性[1],因此实用性不高。基于现场可编程门阵列(Field Programmable Gate Array,FPGA)芯片以其独特的并行可编程处理信号的方式,成为图像处理的重要器件[2]。

为了提高检测精度和解决实时性问题,在文献[3]中,作者通过增加Sobel 算子的检测方向获得了更清晰的边缘,且展示了FPGA 优秀的并行处理能力,在文献[4]中,作者使用改进的DoG 算子提高了检测精度,但是这些算法都没有考虑到sensor 噪声和镜头暗影(Lens Shading)对边缘检测的影响,导致离图像中心越远边缘检测越容易丢失关键细节信息的问题。为了解决这些问题,本文使用改进的中值滤波对输入图像进行第一级滤波计算,在去除颗粒噪声的同时兼顾边界的连续性,然后采用高斯差分(DoG,Difference of Gaussian)算子对中值滤波后的图像进行第二级边缘检测计算,为了进一步解决镜头暗影带来的图像降质影响,设置径向力度对阈值进行调整后再输出最终的边缘检测结果。此外,为了满足现代数字图像处理中对实时性的需求,本文基于FPGA 硬件平台,利用其高速并行处理、高性能运算能力及高灵活性等特点,通过两级RAM 存储控制及简化计算大幅提升图像数据实时处理速度。实验结果表明,本算法可用于含噪图像的边缘检测且具有实用性的优点。

1 算法分析

边缘通常指图像灰度值变化剧烈的像素点集合,其理论上是由灰度值的瞬间跳变产生,但在实际图像区域中,由明变暗或由暗变明是一个渐变过程,灰度曲线存在一定的斜率[5]。由于其突变的时间非常快,因此一阶微分和二阶微分对这种突变的检测有很好的效果。一阶边缘检测算子有Prewitt 算子、Sobel 算子、罗盘算子等,二阶边缘检测算子有Canny 算子、Laplacian 算子等,但是二阶微分算子对噪声太敏感,会产生大量伪边缘。此外,在实际应用中,Sensor 的镜头暗影和数据传输中电子元器件产生的白噪声都一定程度上造成了图像降质[6],这些都会影响图像边缘的提取。

为了解决上述问题,本文提出了一种可抗噪的边缘检测算法,先对输入的图像做一个3×3 的改进版的梯度权重中值滤波,然后再用高斯差分[7]算子提取图像边缘信息,最后为了缓解Sensor 镜头暗影的影响,针对镜头暗影产生的规律计算出一个径向系数,对输入的阈值做一个调整,以达到抑制噪声且提取连续清晰的图像边缘的目的。

■1.1 改进的中值滤波

中值滤波对一些孤立的椒盐噪声有很好的去噪效果,但是也会模糊图像边缘,对后续的边缘提取非常不利[8],为了缓解这个问题,本文提出一种方向权重混合的中值滤波改进算法,这种算法充分考虑到了边缘降噪需保边的需求,在去除颗粒噪声的同时保护了边缘的连续性,且本算法利用了FPGA 并行计算的优势,可以快速得出结果。具体算法步骤如下:

(1)对一个如式(1)所示的3×3 的矩阵,对垂直、水平、45 度和135 度四个方向分别计算其梯度的绝对值和中值,以垂直方向为例,其梯度为diff0=abs(data0_1-data2_1),中值med0 为data0_1、data1_1 和data2_1 的中间值,其他三个方向计算相同。

(2)对垂直、水平、45 度和135 度四个方向的梯度diff0、diff1、diff2 和diff3 做exp 曲线映射,梯度的值越小的地方其权重分配越大,梯度的值越大的地方其权重分配越小,exp 曲线映射如公式(2)所示,映射后的权重分别记为weight0、weight1、weight2 和weight3。

(3)用第二步计算出的权重分别乘以各个方向的中值,再除以权重的和得到归一化输出,权重归一化如公式(3)所示:

■1.2 DoG 算子

一阶微分算子如Sobel 需要计算多个方向的一阶导并做混合才能提取出足够的图像边缘,二阶微分算子如Laplacian 算子虽然拥有各向同性的优势,可以直接计算出各个方向的边缘,无需像Sobel 算子那样,需要计算各个方向的边缘然后做混合,但是二阶微分算子普遍对噪声又过于敏感,尤其是如果噪点在图像边缘上,会造成图像边缘不够连续[9]。

为了解决这个问题,选择使用高斯差分(DoG,Difference of Gaussian)算子来代替Laplacian 算子,DoG 算子是两个Gauss 算子相减获得的,Gauss 算子配置不同的均值和方差,可以获得不同频段的图像边缘信息,本文需要检测出所有频段的边缘信息且抗噪,因此第一个Gauss 算子就用3×3 来代替,考虑到3×3 的窗口太小,一些弱边缘可能会不容易检测到,因此第二个Gauss 算子加大窗口,选择5×5 的窗口来进行计算,5×5 的DoG 算子如公式如(4)所示:

■1.3 径向阈值

镜头类似一个凸透镜,由于凸透镜中心的聚光能力远大于其边缘,从而导致Sensor 中心的光线强度大于四周,此种现象也称之为镜头暗影[10]。对于一个没有畸变的Sensor来说,物体到镜头中心的距离越亮,图像越亮,离中心距离越远,图像越暗,其规律整体呈从圆心位置沿半径方向逐步递减。由于亮度递变的影响,使得边缘检测中越靠近中心区域噪声越小,越靠近图像四周边缘噪声越大,为了缓解这个问题,对输入的阈值乘以径向力度系数,达到抑制图像周围噪声的作用。

设图像中心点坐标为(row,col),当前pixel 的像素坐标为(x,y),则距离如公式(5)所示,用外部配置的阈值除以distance 就得到径向阈值,根据这个阈值对边缘检测的图像进行二值化,可以抑制图像周围的噪声。

2 系统设计

■2.1 硬件整体设计

在图像边缘检测中,所需要处理的数据量较大,为了提升数据处理速度,通常都会利用DDR3 DRAM 的高速运行速度(运行速度可达800 MHz,数据速率达1 600 Mb/s)来完成读写数据的操作,这样就占用了一定的DDR 带宽,一定程度上限制了处理速度。为了提升数据处理速度,本论文用sensor 直接接入FPGA 中的Video Capture 模块,Video Capture 的按照光栅输入模式将数据直接输入到边缘检测模块中的Med RAM 读写控制模块,不写入DDR3 可以节省带宽并提高边缘检测处理速度。Med RAM 模块凑够3×3 窗口数据即输出至4 方向权重和4 方向均值模块,这两个模块并行计算出结果,然后按照权重计算归一化输出中值滤波结果至Med RAM 读写控制,该模块凑够5×5 窗口数据即输出至5×5 DoG 计算模块,此时按照窗口数据输出的数据个数Col_cnt 和Row_cnt 分别计数,按照公式(5)计算出径向阈值,对DoG 的输出结果做二值化操作,得到的边缘检测结果存入DDR3 中,最后通过VGA 输出至显示器上,整体设计如图1 所示。

图1 系统框图

■2.2 RAM 的读写及数据控制

以5×5 窗口大小的DoG RAM 为例(3×3 窗口类似),对于5×5 的窗口大小来说,能进行5×5 窗口滤波的条件是必须凑够5 行数据。假设第4 行为正在实时输入的数据,前4 行数据为历史数据,为了同时满足读历史数据和写新数据的需求,需要一个能容纳4 行数据的双口RAM。开一个能容纳4 行数据的双口RAM,前4 行数据在RAM 中的存储方式如图2 所示(为了便于说明,data 的后缀分别代表图像的行数和列数)。

图2 RAM 数据存储方式示意图

RAM 中的每一个地址的数据位宽都是40 bit,这40 bit包含了4行数据,以Addr0为例,其中存储了图像第0行~第3 行的第0 列数据,data0_0 占据位宽[9:0],data1_0 占据位宽[19:10],data2_0 占据位宽[29:20],data3_0 占据位宽[39:0]。这种存储方式读Addr0 可以获得一列共4个数据,加上正在输入的data4_0 就会构成完整的一列数据,把这列数据存进二维寄存器中,然后把RAM 读出数据的[39:10]和data4_0 拼起来组成一个新的40 bit 数据再写回Addr0 中,就完成了一次数据读和写更新,一行做完后RAM 中每个地址的[9:0]是新写入的第4 行数据,下一行更新的位置是[19:10],如此循环往复,可存完一整幅图像。

对于5×5 的窗口,需要一个5×5 的二维寄存器缓存读出来列数据和输入的当前数据,每产生一列新数据就写入二维寄存器中最左边的一列寄存器中,同时每列寄存器中的数据向右一列寄存器中移位一次,最右边的一列寄存器数据被覆盖。用这种方法读3次RAM 即可凑够一个完整的窗口计算一次,后续每读出一列新数据,旧数据依次覆盖右列数据即可获得一个新的5×5 数据。

此外窗口数据还存在扩边需求,当中心点在图像边界的时候,上下左右各需要2 行2 列的扩边,分以下4 种情况进行扩边:

(1)上扩边,在第0 行写RAM 的时候就把data0_x的数据复制3 次,即[9:0]、[19:10]和[29:20]中的数据都是data0_x。

(2)下扩边,在RAM 读数据的时候,把最后一行数据复制到第一列二维寄存器中。

(3)左扩边,在每行第0 列数据读出写5×5 二维矩阵的时候,就同时写最左边的3 列数据,即二维寄存器的前3 列中的数据都是第0 列的数据,更新两次数据之后即可获得一个完整的5×5 数据。

(4)右扩边,在每行的最后两列的时候,不读RAM,只做寄存器的移位,即可获得右扩边。

用上述方法做图像扩边可大大节省硬件面积,且逻辑控制非常简单。

3 实验结果及仿真分析

为验证各个模块算法的正确性,在型号为Xilinx Virtex UltraScale XCVU440FLGA2892 的FPGA 上进行测试,得到的实验结果如图3 和4 所示。

图3 图标边缘检测结果

图4 分辨率卡边缘检测结果

由实验结果分析可知,Sobel 算子的边缘连续性差,检测不到弱边缘。Canny 算子在边缘连续性上表现较好,但是无法对抗噪声的干扰,在图像周围噪声比较大的区域,其检测出的边缘淹没于噪声中。而本论文的边缘检测结果在连续性和抗噪方面均优于前两个算法,且在图像四周区域对图像噪声的抑制性较好。结合FPGA 可以达到实时性的需求,从图像采集到最终显示的时间小于25 ms。

4 结论

本文通过两级窗口串联的方式设计了一种可抗噪的边缘滤波算法,通过改进的中值滤波和高斯差分滤波的级联抑制噪声提取连贯的边缘,结合径向阈值,进一步解决了Sensor 镜头暗影带来的图像四周噪声过大的问题。通过RAM 对窗口数据的缓存,解决了硬件实时处理中开销大的问题,利用FPGA 的流水线和并行处理的特点,使得图像数据的处理速度远远高于使用传统软件程序处理图像的速度,满足了实际应用中实时获得图像边缘的需求。并通过对比不同算法的图片检测效果,本文算法边缘清晰且抗噪能力较好,在高速图像处理领域具有较高的实用价值。

猜你喜欢
寄存器算子边缘
拟微分算子在Hp(ω)上的有界性
各向异性次Laplace算子和拟p-次Laplace算子的Picone恒等式及其应用
应用数学(2020年2期)2020-06-24 06:02:44
Lite寄存器模型的设计与实现
计算机应用(2020年5期)2020-06-07 07:06:44
一类Markov模算子半群与相应的算子值Dirichlet型刻画
分簇结构向量寄存器分配策略研究*
一张图看懂边缘计算
Roper-Suffridge延拓算子与Loewner链
高速数模转换器AD9779/AD9788的应用
一种可重构线性反馈移位寄存器设计
通信技术(2010年8期)2010-08-06 09:29:16
在边缘寻找自我
雕塑(1999年2期)1999-06-28 05:01:42