基于FPGA的一种改进Sobel边缘检测算法设计与实现

2024-12-31 00:00:00孟祥意刘德全管浩洋
电脑知识与技术 2024年33期

关键词:Sobel边缘检测;FPGA;自适应阈值

0 引言

边缘检测被广泛运用于车牌识别、人脸检测、药用植物形态研究、医学影像等领域[1]。图像边缘是图像最重要的特征之一,是图像处理的基础,图像的大多数信息都储存在图像边缘中。边缘检测的目的是标识数字图像中灰度变化明显的点,在计算机视觉和图形分析等应用中起着重要作用[2]。常见的边缘检测算法可以分为一阶和二阶边缘检测算法,一阶算法有Roberts 算法、Sobel 算法和Prewitt 算法;二阶算法有Laplacian算法、Canny算法和LOG算法[3]等。

随着现场可编程门阵列(Field Programmable GateArray,FPGA) 技术的快速发展,利用FPGA平台设计的边缘检测系统由于其并行流水线、高速数据处理的特点而被广泛采用[4]。传统的Soble边沿检测算法只进行水平(0°) 和垂直(90°) 两个方向进行检测,因此,定位精度不够高;并且特征点检测阈值人为设定后再不能变,算法自适应差。为解决上述两个问题,本文对传统算法进行改进,主要表现在以下3个方面。第一,采用FPGA平台并行执行Sobel算子;第二,采用0°、45°、90°和135° 4个方向进行梯度检测,提高边缘检测定位精度。第三,采用3×3中值滤波滑动窗口的中间值为阈值,使得Sobel算子具有自适应。

最后在FPGA 平台上,通过使用Verilog 编程语言,进行系统的设计和验证。实验表明,与传统的Soble算子相比,本文提出的算法更具有边沿检测精度更高,鲁棒性更高,能更好地捕捉图像的边缘信息。

1 Sobel 算法

1.1 传统的Sobel 算法

Sobel算法是一阶边缘检测算法,优点是算法简单、计算量小,但是对图像的处理容易出现边缘过于粗糙,产生伪边缘从而导致定位不准确等问题。传统的Sobel算子仅有水平和垂直两个方向算子,水平算子和垂直算子的梯度计算公式如公式(1)、(2)所示,梯度幅值G 计算公式,如公式(3)所示,图1(a)和(b)分别为水平方向和垂直方向的梯度算子,(c)为3×3像素窗口矩阵。

公式(3)和(4)中:G 为局部边缘强度即梯度幅值,θ为梯度方向角[5]。通过将梯度幅值G 与人为设定的阈值进行比较,进行图像的二值化处理,如果梯度幅值G大于设定的阈值,该像素点被处理为边缘点,并赋予其最大灰度值255;如果梯度幅值G小于等于阈值,则将该像素点的灰度值设为0。

传统的Sobel边缘检测算法梯度计算模板有限,存在着以下的缺点:

(1) 计算方向比较单一,只检测水平和垂直两个方向,对其他方向的边缘信息没有考虑,如果其他方向上的幅值较高,但是水平方向和垂直方向合成的梯度幅值较低,导致图像部分边缘细节的丢失。

(2) 阈值需要人为设定,不具备自适应性。如果阈值设置不当,可能会导致边缘信息的缺失或者增加虚假的边缘信息。

1.2 改进的Sobel 算法

对于传统Sobel算法存在的缺点,本文从3个方面来改进:

(1) 采用FPGA 平台并行执行Sobel算子,以提高处理速度。

(2) 增加梯度计算模板,增加了45°和135°方向算子,将3×3 像素窗口矩阵分别与四方向进行卷积计算,得到对应方向的梯度幅值。

(3) 采用基于中值滤波思想的自适应阈值选取策略,采用3×3中值滤波滑动窗口的中间值作为阈值,提高计算效率的同时使得Sobel算子具有自适应。

2 硬件设计及实现

图2为该系统的整体架构,首先通过Matlab工具进行图像预处理先将图片进行双边滤波去噪,然后再进行灰度转换,将灰度转换后的图片数据通过串口发送给FPGA,FPGA进行Sobel边缘处理和自适应阈值处理,最后将边缘检测的结果输出到VGA显示器上。

2.1 图像预处理

在图像传输或者采集的过程中,不可避免地会因为传输环境等因素对图像数据造成影响,产生噪声[6]。噪声的存在可能导致在边缘检测的过程中,产生错误的边缘信息,将噪声误认为是边缘,或者将真实的边缘与噪声混淆。所以,在进行边缘检测前,首先要对图像数据进行降噪处理。

双边滤波算法可以有效去除图像的各种噪声,包括高斯噪声和均匀噪声,既可以达到降噪平滑的作用,同时还能很好地保持边缘[7],因此本文通过双边滤波算法对图像进行降噪的预处理。

由于边缘检测算法是在灰度域进行处理[8],所以在进行边缘检测前需要将图像转换为灰度图,由RGB 图像转换成YCbCr图像的公式如公式(5)所示:

由于本文设计没有采用摄像头模块,而是选择收集现场图像作为图像数据来进行边缘检测,因此采用Matlab工具进行图像预处理。Matlab读取图片后先对图像进行双边滤波,然后再将图像进行灰度图像处理,最后将图像数据输出,之后将图像数据通过串口发送给FPGA进行边缘处理。

2.2 边缘处理模块

Sobel边缘处理模块采用的FIFO求和的思想。本文选取一个3×3的窗口数据,因此采用FIFO来处理数据[9]。两个FIFO的作用是缓存两行,可以得到三行数据。这里用到了FPGA的流水线特性,其优势在于能够实现数据的连续缓存与处理,这不仅有效减少了缓存空间的占用,而且提高了数据流的处理速度[10]。

将数据写入寄存器之后,需要将寄存器里的数据进行Sobel处理,因此,再次定义一个读出标志信号,当行计数器计数到第三行的时候,将缓存的数据往外读出,对数据进行Sobel运算和阈值计算[11]。

为了获得更多的边缘信息,将增加的45°和135° 方向的Sobel算子参与计算,计算模板如图3所示,其中图3(a)为45°方向算子、图3(b)为135°方向算子。

将水平方向和垂直方向算子以及45°和135°算子分别与像素窗口进行卷积计算,改进的梯度计算公式如公式(6)所示:

使用ModelSim SE-64 10.5对边缘处理模块进行仿真验证,其结果如图4所示。a1-c3是要进行Sobel 运算的像素点,初值为0,当使能信号rd_en_reg有效时,将dout_1_reg、dout_2_reg、pi_data_reg分别赋值给a3、b3、c3,a3、b3、c3赋值给a2、b2、c2,a2、b2、c2赋值给a1、b1、c1。

2.3 自适应阈值分割模块

在自适应阈值模块中,采用快速中值滤波的思想,利用FPGA并行计算的特点,对3×3像素窗口的9 个像素并行计算,计算流程如图5所示,其具体操作如下:

1) 分别对每行3个像素进行两两比较,得到最大值Max、中间值Mid、最小值Min;

2) 求3个最大值的最小值Max_Min、求3个中间值的中间值Mid_Mid 以及求3 个最小值的最大值Min_Max;

3) 求Max_Min、Mid_Mid、Min_Max 的中间值,即为我们所需要的中间值。

图像分割可以根据公式(8),通过比较梯度幅值G与最后得到的中值Mid_Z来区分是否是边缘点。

使用ModelSim SE-64 10.5对自适应阈值模块进行仿真验证,其结果如图6所示。当19出现2个时钟周期后,窗口更新为36,129,9,136,174,155,74,185,19,再经过3个时钟周期的中值滤波流水线操作,输出为129,手算结果也为129,验证正确,算法在FPGA上的正确性得以验证。

2.4 图像显示模块

视频图形阵列(Video Graphics Array,VGA) 使用模拟信号的电脑显示标准,支持640×480,1024×768等多种分辨率,是目前常用的图像标准之一[12]。

VGA显示器显示图像,是采用扫描的方式,将构成图像的像素点,在行同步信号和场同步信号的同步下,按照从上到下、由左到右的顺序扫描到显示屏上。VGA显示器扫描方式,如图7所示。

hsync表示行同步信号,hsync自上升沿起到下一个上升沿止为一个完整周期,这段时间被称为行扫描周期,同理,vsync场同步信号一个完整周期被称为场扫描周期,VGA 扫描时序图如图8 所示。其中,以VGA分辨率640×480为例,640是指有效示显数据每一行有640个像素点,480是指每一帧图像有480行。一个行扫描周期为(图8(a)行扫描时序中的行扫描周期)为800个像素时间,一个场扫描周期(图8(b))场扫描时序中的场扫描周期)为525行时间[13]。

使用ModelSim SE-64 10.5对图像模块进行仿真验证,其结果如图9所示。pix_x信号在图像显示有效区域循环计数,计数周期为像素时钟周期,计数范围0~639,计数640 次,与图像行显示有效区域参数一致;pix_y信号在图像显示有效区b53c1c6b3080124afe0ed8bec4c22c17域循环计数,计数周期为完整的pix_x计数周期,计数范围0~479,计数480 次。rgb 信号在rgb_valid 信号有效时,被赋值为pix_data,rgb_valid信号无效时,赋值为0。

3 结果与分析

本文通过FPGA对图像进行边缘检测。所处操作环境是Windows11系统,CPU为i7-13650HX,GPU为4060Ti。首先使用MatlabR2022b版本对图像进行预处理,经过QuartusⅡ 18.ef4490ecfb840082006d2e5fa019d5cf 0软件编写Verilog HDL语言来实现数据的传递、处理,通过ModelSim SE-64 10.5 验证算法的可行性。最后采用Alter 公司的EP4CE10F17C8型号的FPGA开发板进行上板验证。

对图片大小为160×160尺寸的图片进行测试,传统Sobel边缘检测算法使用人工设定的阈值60。

图10(a)为实验lena帽檐原图;图10(b)为经过双边滤波和灰度化原图;图10(c)为经过传统Sobel边缘检测的效果图;图10(d)为经过四方向的Sobel边缘检测效果图;图10(e)为本文经过四方向和自适应阈值So⁃bel边缘检测效果图。本文算法提取了更多的边缘信息,较四方向Sobel的边缘连续性更加完整,提高了边缘检测的准确性。

表1给出了本文算法和传统Sobel算法在FPGA 上的资源占用情况。

通过表1可以看出,本文算法与传统Sobel边缘检测算法比较,可以看出本文算法在硬件消耗的逻辑资源上有所增加,主要用于实现四方向梯度计算和自适应阈值的功能。

同时根据QuartusⅡ提供的功耗报告可知,本文算法系统的总功耗为69.58 mW,其中静态功耗为48.30mW,I/O口功耗为21.28 mW,系统满足低功耗的要求。

4 总结

本文分析了传统Sobel边缘检测算法的优缺点,并针对传统Sobel算法存在的缺点做了改进。一是增加的梯度计算模板,由水平和垂直2个方向增加45° 和90°到4个方向。二是对阈值的获取做出改进,将原来需要人为设定阈值改为自适应阈值。通过Mat⁃lab对图像预处理后,板级验证结果表明,本文算法在提高边缘检测精度的同时,也满足了实时性和低功耗的要求,具有一定的应用价值。