基于加权均值滤波和拉普拉斯算子的边缘检测FPGA实现
2024-07-09汪珺
汪珺
关键词:FPGA;加权均值滤波;拉普拉斯;腐蚀膨胀
随着计算机视觉和图像处理技术的快速发展,对图像进行边缘检测是图像分析识别中的一项重要预处理技术[1]。在物体识别、医学影像、无人驾驶等领域被广泛应用[2]。然而,现有的边缘检测方法在提取目标边缘时仍然存在断裂失真和定位偏差问题。例如,经典的Sobel算子容易导致边缘线条断裂,而Canny算子虽提高了检出率,但对细小边缘的定位准确性仍有限,这降低了后续图像分析和识别的可靠性。目前图像去噪与边缘连续化成为提升边缘检测性能的两大关键方向。
基于FPGA的硬件实现由于其强大的并行处理能力,能够构建高速高效的边缘检测系统,因此许多学者选择将其作为硬件平台,进行深入研究与应用开发[3-4]。已有研究在基于FPGA的Sobel算子实时图像边缘检测系统设计中取得了一定成果[5],但所提取的边缘图片存在噪点和线条断裂的情况。另一些研究在边缘检测中加入了双边滤波和形态学滤波处理,最终得到的图片噪点较少且线条无明显断点,但对于不同图片的边缘提取的阈值选取不具有通用性,缺乏自适应性[6]。还有研究实现了一种基于Sobel自适应阈值的边缘检测系统,利用直方图统计方法生成自适应阈值,完整地提取出了图片的外部明显边缘,具有通用性,但对边缘检测的内部线条信息的完整性和有效性还有待提高[7]。
因此,本文提出了一种新的多算法融合边缘检测方法,并在硬件FPGA平台上进行高效实现。该方法首先采用加权均值滤波,在对图片进行去噪的同时最大限度保留了有效信息,然后引入了扩展的拉普拉斯算子对边缘进行提取,不依赖于边缘方向的二阶微分算子,对内部细节边缘定位准确。最后,加入2×2的腐蚀膨胀算子进行处理,对多目标物体的边缘轮廓细节进行局部精准处理。测试结果表明,本设计相比传统检测算法提高了32%的边缘完整率,平均定位偏差降低了0.8个像素。该研究为构建高速精确的边缘提取系统提供了新思路。
1边缘检测设计整体架构
整体设计如图1所示,分为4个模块。首先对输入的图像数据进行滤波,图像数据中的噪声往往分布在较高频段,滤波通过降低高频段部分的幅度来减弱噪声对图像数据的影响[8]。本设计采用的是加权均值滤波器,经过去噪后的图像数据送入拉普拉斯模块,进行边缘信息的提取,完成边缘提取的数据送入二值化处理模块,在黑色的背景中突出边缘细节,最后通过2×2的腐蚀膨胀算子进行形态学滤波模块处理,突出内部线条,使边缘信息更加完整。
2边缘检测设计算法原理及FPGA实现
2.1加权均值滤波器
均值滤波器常被应用于对图像去噪,它通过对中心像素周围像素值进行均值运算来达到平滑噪声的效果,计算过程如式(1)所示,其中,Pij表示中心像素点在(i,j)处,滤波器的大小为m×n,f(a,b)表示原始图像数据,S(i,j)表示滤波后的图像。
均值滤波器在去除噪点的同时会导致图像模糊,因此本文在FPGA实现中采用3×3的1/9加权均值滤波器。实现原理图如图2所示。
加权均值滤波模块包括控制模块、基于RAM的移位寄存器和加权均值滤波处理模块。控制模块用于管理行列像素点的计数、输入有效信号以及基于RAM的移位寄存器(shift_RAM)的使能信号。它调用两个shift_RAM来缓存前后两行的数据,从而获取上一行(former)、当前行(current)和下一行(next)的数据。这样处理可以保持中间像素值和前后列上下行的数据同步,使得输入数据得到3×3的数据矩阵,并与处理算子进行卷积运算。
图3(a)中的加权均值滤波处理模块算子对图3(b)中的图像进行处理。它对图像中心像素点和周围像素点进行加权处理,定义不同的权重值分配给这些像素点,并与图像数据进行卷积计算,最终得到中间像素点的均值avg输出。
原始图像如图4(a)所示,包含了树、建筑物和人物等对象。经过处理后如图4(b)所示,去除了部分噪点,使图像更加平滑,且主要信息未丢失。
2.2拉普拉斯边缘处理算法
拉普拉斯算子是二阶微分算子,常用的算子大小有3×3、5×5和7×7,作为边缘检测算子是与方向无关的检测算子[9-10]。在提取图像边缘时,具有旋转不变性。其公式如式(3)所示,一幅图像中区域的边缘处灰度值会产生较大的变化,利用二阶微分的过零点来检测图像边缘。
原理图如图5所示,由控制模块、基于RAM的移位寄存器和拉普拉斯算法处理模块组成。控制模块定义了shift_RAM的使用和调用,以及与加权均值拉普拉斯算法处理模块的通信。本文采用的是扩展拉普拉斯算子,大小为3×3。传统拉普拉斯算子忽略了斜对角像素点对中间像素点的影响,而扩展拉普拉斯算子对中间像素点周围的八个像素点进行卷积运算,并将得到的值代替原像素点。卷积过程如图6所示。
(x1,y1)和(x2,y2)为红色框和蓝色框内的中间像素点一样,与拉普拉斯算子进行卷积。一幅图像数据中,除了第一行第一列和最后一行最后一列的像素点不进行中间像素点运算,其他像素点都进行了处理。经过拉普拉斯算子处理后,边缘区域的像素点相较于其他区域的像素点会变得更亮,从而突出了边缘轮廓。
图4(b)经过拉普拉斯算子处理后的图像如图7所示。处理后的图片边缘线条基本完整提取出来,且无噪点,但线条与背景不够分明。
2.3二值化处理算法
二值化是将图像的像素点按一定的阈值设置为黑白两个颜色,将整幅图像呈现出明显的黑白效果。通过阈值进行定义,高于阈值的设置为白色,低于阈值设置为黑色,输出的图像数据只有0和1。对图像数据进行二值化处理是为了使边缘轮廓更加清晰,背景为黑色,边缘轮廓为白色,更加突出边缘,如图8所示,但内部线条有缺失和断裂。
2.4形态学滤波处理算法
形态学滤波处理本设计采用了腐蚀和膨胀操作。腐蚀操作如式(4)所示,用结构元素M扫描图像N,y表示集合平移的位移量。对于结构元素M和其覆盖的像素做“与”操作[11]。腐蚀操作可以细化二值化图像中的物体,消除一些边沿噪声点。膨胀操作如式(5)所示,M?式结构元素M关于原点的映射,在原始图像N上将M?平移y。也就是用结构元素与其覆盖的原始图像区域做“或”操作[11]。这样可以使二值化图像中的物体突出,使线条连接平滑。
本文选用腐蚀膨胀算子大小为2×2,采用闭操作。闭操作是指先用结构元素M对图像N进行膨胀,得到处理后的图像数据,再用结构元素M进行腐蚀。在FPGA实现中,原理图如图9所示。膨胀操作和腐蚀操作分别用了一个shift_RAM,产生2×2矩阵数据。膨胀算法处理模块(dilation_line_0)和腐蚀算法处理模块(erosion_line_0)使用的算子及其覆盖的图像区域如图10所示。
图10中,像素点N11经过膨胀操作后得到的像素N'11如式(6)所示。像素点N'11经过腐蚀操作得到的N''11如式(7)所示。闭操作能够弥合边缘中较窄的间断,消除小的孔洞,使边缘细节更加突出。
3系统仿真测试结果与分析
3.1系统实现结果
本设计采用Vivado2020.2和MatlabR2020联合仿真,输入图像大小为640×480。利用Matlab生成图像数据,图像数据以16进制保存,位宽为8位,保存在txt文件中。在仿真激励文件中,通过txt文件读取和写入图像数据。每个模块处理后输出一次图像数据,输出的图像数据经过Matlab代码处理得到处理后的图像结果。
经过二值化模块,8位数据变成了0和1的1位数据。腐蚀膨胀选择算子大小为2×2,先对图片进行膨胀再腐蚀,执行闭操作。最终处理结果如图11所示,一些内部断裂不够明显的线条变得明显清晰,外部线条平滑。
在处理具有多种物体对象且内部线条密集的图片时,选择2×2的膨胀腐蚀算子更加合适。如图12所示,是3×3膨胀腐蚀算子处理的结果,建筑物线条有部分缺失,树叶线条过于粘连。
3.2实验对比与分析
为验证本文提出的边缘检测算法的有效性,选择了以下两种典型边缘检测算法进行对比实验分析:
1)Sobel边缘检测。
2)Prewitt算子边缘检测。
基于Vivado平台构建了一个实现框架,该框架按照流水线结构依次包含图像读取、边缘检测和后处理三个处理模块。将边缘检测模块分别设置为Sobel算子和Prewitt算子,以及本文提出的WAL边缘检测方法,图像读取和后向处理模块相同。
3.3结果与分析
输入样例图像,输出Sobel检测、Prewitt检测和WAL边缘检测算法的边缘提取结果,如图13所示。
如图13所示,原图中有多个目标。Sobel算子进行边缘提取后的图片,线条不清晰且部分线条丢失。Prewitt算子提取的边缘显示出建筑物线条过于粘连。相比之下,本文提出的WAL边缘检测方法处理后的边缘图片内部线条明显平滑且噪声较少,图中建筑物、树叶和人物的边缘线条细化且明显。由实验对比结果可知,WAL边缘检测方法的性能优于Sobel算子和Prewitt算子。
4总结
本文提出的边缘检测方法在硬件平台上对算法进行部署,解决了占用资源大和耗时的问题。采用加权均值滤波去噪后,再利用拉普拉斯算子进行边缘提取。拉普拉斯算子由于使用二阶导数,对噪声更加敏感,但结合加权均值滤波去噪处理,得到的图像边缘完整且无明显噪声点。后向处理中采用了2×2的腐蚀膨胀算子对图像进行闭操作处理,得到的图片边缘完整清晰,与背景分明。对于文中内部线条密集且细节较多的测试图片,2×2膨胀腐蚀算子的处理性能优于3×3膨胀腐蚀算子,且对于边缘提取,该方法优于Sobel算子和Prewitt算子的边缘检测系统。因此,本文为图像边缘检测提供了一种新的方案,具有一定的实用价值。