摘要 :本文设计了一种 基于 FPGA 的实时边缘检测系统 ,使用OV5640 摄像头模块获取实时的视频图像数据,提取图像边缘信息并通过 VGA显示。FPGA 内部使用流水线设计和 并行运算加速算法 ,利用乒乓操作和 SDRAM 缓存图像,可以实时提取视频图像的边缘特征。文中对比了 MATLAB 和 FPGA 的处理效果,由于 FPGA 对算法采取了硬件加速,所以相较于 MATLAB 等计算机软件实现方式有更快的处理速度。 经验证,系统工作稳定,满足实时性要求 。
MATLAB 与 FPGA无线通信、图像处理、数字信号处理系列
引言
图像的边缘包含一副图像的大部分信息,是图像分析和模式识别的主要特征提取手段 。由于实时视频图像的边缘检测需要处理的数据量非常大,所以采用一般的软件方法实现起来处理速度慢,无法满足实时性的要求。
随着可编程逻辑器件(FPGA)的高速发展,使用 FPGA 芯片搭建图像处理硬件平台成为图像处理的发展趋势。FPGA在运算性能方面的具有较大优势,使用FPGA并行加速图像处理算法,既满足了运算量和运行速度的要求,又具有较高的集成度。
所以,研究基于 FPGA 的图像边缘检测解决方案具有重要的实际意义,在医学影像处理、工业器件探伤、目标识别等边缘检测领域有着非常广阔的应用。
1 系统方案与设计
本系统基于 Altera 公司 Cyclone IV 系列的 EP4CE6F17C8 型号的 FPGA ,系统整体框图如图1所示,主要包括 FPGA 并行运算平台、摄像头采集模块、存储模块和显示模块,设计时采用自顶向下的设计模式,使用全局复位和跨时钟域处理。
系统运行时, FPGA 并行运算平台首先完成对摄像头的初始化和寄存器配置,配置完成之后读取实时的图像数据存入 SDRAM 存储器中,在 FPGA 芯片内部并行实现图像处理算法,对从 SDRAM 中读出的数据进行 Sobel 边缘检测并送入 VGA 显示,通过独立按键可以切换显示模式和设定边缘检测阈值。
2 图像预处理
由于 Sobel 算子是针对灰度图像的边缘检测,所以先把彩色图像转为灰度图像。 将 RGB565 转化为 RGB888,再将 RGB888 转为 YCbCr 格式,最后提取其中的 Y 分量即可得到灰度图像 。RGB888与 YCbCr 转换公式如下:
由于 FPGA 无法直接运算浮点数,所以先扩大系数近似为整数再运算。此处扩大256 倍后取整,将运算结果右移 8 位,提取 Y 分量即可得到灰度图像,即
3 边缘检测算法设计
如图4所示为待处理的3×3 像素点,使用 Sobel 算子处理中心像素点 P5,
使用 X、Y 方向的算子处理可得X、Y方向的梯度值 GX1、GY1 分别为:
整体梯度值 G 为:
在 FPGA 中,开平方运算非常消耗资源,可以使用绝对值近似开平方,即:
由于P1 ~ P9均为灰度像素点,范围在0 ~ 255,可用无符号数左移代替乘法,即:
由上式可知GX11、GX12、GY11、GY12 均为正值,因此简化绝对值:
由上可计算GX11、GX12、GY11、GY12,继而求 G,当 G 大于设定的阈值时判定为图像的边缘。使用3个 Shift_ram 实现移位操作,使用三级流水线计算边缘检测值 G。判断 G 是否大于阈值,若大于阈值则输出0(8位数据0X00)否则输出 255(8位数据0XFF),即边缘处为黑色其余位置为白色。
4 边缘检测算法性能对比
(1)MATLAB与FPGA处理效果对比
使用 MATLAB读取一张1024*768分辨率的灰度图片如图6所示,对比MATLAB 与 FPGA 处理效果的不同。MATLAB和 FPGA进行边缘检测后的均以 40 为阈值进行二值化,对应的二值化图像如图7(a)和(b)所示,两者均以 60 为阈值得到图8(a)和(b)。
通过对比可以看出,使用 FPGA 进行Sobel边缘检测能够实现与 MATLAB 相近的检测效果,验证了算法的可行性。相对于 MATLAB,FPGA检测在同样的与之情况下检测出更多的边缘和噪声,在阈值为40时的图片右上角和在建筑物顶部球状物、针状物处比较明显,分析其原因和 FPGA 在计算时候的数据舍入有关。总体评价来看,FPGA能够实现较好的边缘检测效果。
(2)MATLAB与FPGA运行时间对比
在MATLAB使用本文所述的 Sobel 边缘检测算法,提取一张1024720分辨率的灰度图像的边缘,经过计时发现仅实现 Sobel 边缘检测需要597.451 ms(使用 MATLAB 2016a,CPU主频1.8GHz),即每秒钟仅能处理约 1.67 张图片。
使用 FPGA运行本文所述的 Sobel边缘检测算法,使用50 MHz时钟(周期20 us),在1024个时钟周期后得到 LineBuffer 缓冲出的第一行数据,4个时钟周期后开始输出边缘检测后的数据,处理完一副1024720分辨率的图片需要的时间 T 为
由以上对比可知,FPGA并行运算在算法加速上面有着非常好的性能,处理速度远超 MATLAB 这种串行处理方式,使用FPGA方式每秒钟大约可以处理67张图片, 满足实时性的要求 。
总结
本文在 FPGA 平台上中并行实现了实时图像的 Sobel 边缘检测算法,从公式上进行化简近似得到本系统所用的Sobel实现方式;通过对比MATLAB和FPGA的计算用时,可以看出FPGA的并行运算将速度提升了40倍以上,实现了算法的硬件加速,处理效果也能够满足系统的实时性要求。使用该算法处理摄像头获取的实时图像,能够达到良好的检测效果。
当然,本系统仍然后很多的不足,比如在抗噪声性能以及边缘的连续性方面仍有很大的改进空间,后续可以在这方面继续进行优化。
https://www.zhihu.com/question/391993015
作者:FPGA探索者,DengFengLai123