郭志彪,段为
(中国移动通信集团广东有限公司,广州 510623)
基于OpenCV的边缘检测技术研究
郭志彪,段为
(中国移动通信集团广东有限公司,广州 510623)
边缘检测是图像分析识别前必不可少的环节,是一种重要的图像预处理技术。回顾图像边缘检测技术的发展历程,讨论一些典型的边缘检测算法的特点,分析其机理和优劣,并对其中的Canny算法进行优化并通过OpenCV实现。
边缘检测;机器视觉;图像处理;OpenCV
数字图像边缘检测技术是信息科学近年来发展最为迅速的学科之一。而图像边缘作为图像最基本的特征之一,在图像分割、图像识别以及其他图像相关的各个领域有着广泛的应用,边缘检测是图像处理和机器视觉中的一个重要分支,在图像分析中有着重要的意义。
随着计算机技术的发展和普及,数字图像处理也迎来了迅猛发展的时期。对数字图像的处理已广泛应用到各个领域。而边缘信息作为重要的图像特征信息,许多学者采用不同的方法研究如何提取图像的边缘。目前,常用的边缘检测算子有以下几种:Sobel算子、Isotropic Sobel算子、Roberts算子、Prewitt算子。
1.1 Sobel 算子
Sobel算子基本步骤是先对图像进行平滑处理,消除噪声的影响,然后再作微分运算。Sobel算子平滑处理时使用的积卷核如图1。选择中心点为锚点,对周围像素的灰度进行加权平均,找出变化明显的边缘点。但使用该算子容易造成边缘不连续,丢失细节。
图1 Sobel算子的卷积因子
1.2 Isotropic Sobel 算子
Isotropic Sobel算子是Sobel算子的另一种形式,基本原理与Sobel算子相似,主要区别在于Isotropic Sobel算子在检测不同方向的边沿时使用同一梯度幅值。
1.3 算子Roberts
Roberts算子是利用局部差分算子寻找边缘的算子,使用2×2的卷积模板对图像进行加权平均。由图2可知,该算子是利用对角线方向相邻的两像素之差进行梯度幅值检测的。但该算法只考虑对角线方向的像素,忽略了水平方向与垂直方向。无法检测水平相邻像素或垂直相邻像素灰度值变化的局部边缘。而且,在该算子中像素点是直接参与运算,导致该算子对噪声较敏感。
图2 Roberts算子的卷积因子
1.4 算子Prewitt
Prewitt算子与Sobel算子相似,同样利用3×3模板计算差分算子,根据在边缘点处达到极值这一现象进行边缘的检测。卷积因子如图3。Prewitt算子需要人为指定阈值,对噪声有抑制作用,但同时容易造成边缘误判,边缘定位精度不是很高。
图3 Prewitt算子的卷积因子
综上所述,现有的边缘检测算子各有优缺点,本研究利用OpenCV函数库中的函数,力求提高边缘检测的精度。本研究主要实现的目标是对边缘复杂的物体进行精准的边缘检测。
边缘检测系统主要由加载源图像、图像转成灰度并模糊化降噪、用Canny算子检测边缘、寻找轮廓、绘出轮廓组成。
图4 系统结构框图
系统首先加载源图像,其次,对图像进行灰度化以及模糊化去噪,然后利用Canny算子检测边缘,最后不断逼近边缘寻找轮廓并将轮廓绘出。
3.1 灰度化及模糊化去噪
研究使用cvtColor函数实现图像的灰度化。函数声明为:
void cvtColor(InputArray src,OutputArray dst,int code,int dstCn=0)
src和dst分别是源图像和输出图像;code是一个掩码,表示源图像和输出图像之间的转化模式。最后的dstCn表示dst图像的波段数,默认值为0,可从参数code中推断。
code的模式包括:CV_RGB2GRAY,CV_BGR2YCrCb,CV_RGB2YCrCb,CV_YCrCb2BGR,CV_YCrb2-RGB,CV_BGR2HSV,CV_RGB2HSV,CV_HSV2BGR, CV_HSV2RGB
研究使用blur函数实现图像的归一化块平滑操作。函数声明为:
void blur(InputArray src,OutputArray dst,Size ksize,Point an⁃chor=Point(-1,-1),int borderType=BORDER_DEFAULT);
src和dst分别是源图像和输出图像;ksize用于定义内核大小;anchor表示锚点坐标,如果为负数,则取核的中心为锚点,borderType用于推断图像外部像素的某种边界模式。默认为BORDER_DEFAULT。
本函数使用归一化滤波器对图像进行降噪处理,基本原理为获取图像某一像素点相邻的像素值,对相邻像素值进行加权平均计算,最后输出的像素值为相邻像素的加权平均值。
3.2 利用Canny 算子检测边缘
研究使用Canny函数实现图像的边缘检测。函数声明为:
void Canny(InputArray image,OutputArray edges,double threshold1,double threshold2,int apertureSize=3,bool L2gradi⁃ent=false);
其中image和edges分别是源图像和输出图像;threshold1表示第一个阈值,threshold2表示第二个阈值;apertureSize表示应用Sobel算子的孔径大小,默认为3;L2gradient为计算图像梯度的标识,默认为false。
Canny边缘算子基本原理是先利用高斯平滑滤波器降噪,然后采用“非极大抑制”技术确定边缘。基本步骤为消除噪声,计算梯度幅值和方向,非极大值抑制,滞后阈值。
首先,Canny算子对图像使用高斯平滑滤波滤波器进行降噪。然后使用一阶偏导的有限差分来计算梯度的幅值和方向,使用卷积模板图5。接着使用非极大值抑制技术来保留局部梯度最大的点以确定边缘,先将中心点像素M与沿着梯度线的像素相比。如果M的梯度值低于沿梯度线的两个相邻像素梯度值则令M=0(见式(3))。最后对图像进行滞后阈值。指定高低两个阈值作用于非极大值抑制图像,获取两个阈值边缘图像。对于高阈值边缘图像,假边缘较少,但不连续,可在高阈值边缘图像的8邻点位置寻找可连接边缘,利用在高阈值边缘图像收集的边缘在低阈值边缘图像上连接成轮廓。
图5 Canny算子的卷积因子
3.3 寻找轮廓
研究使用findContours函数来寻找物体轮廓,函数声明为:
void findContours(InputOutputArray image,OutputArrayO⁃fArrays contours,OutputArray hierarchy,int mode,int method, Point offset=Point());
其中image表示源图像;contours为轮廓数组,每个轮廓contours[i]对应4个hierarchy元素;mode为轮廓的检索模式;method为轮廓的近似办法;offset为轮廓点的偏移量,可设置为任意值。
首先,用多个顶点表达轮廓。然后用Freeman链码记录起点,以及从起点出发的连续位移。接着,在查找到轮廓后,用三种方式组织轮廓根(1)列表;(2)双层结构;(3)树型结构。对于纵向,列表只有一层,双层结构有一或两层,而树型结构可能有一层或多层。要遍历所有的轮廓,可以使用递归的方式,基本原理为无限逼近Canny算子提取的边缘。
本研究首先加载源图像,对源图像进行灰度化、模糊化(使用归一化滤波器)降噪。接着使用Canny算子检测边缘,最后以不断逼近边缘的方式提取轮廓并画出来。算法的具体实现如下:建立一个Mat类型对象,加载源图像。调用灰度化函数cvtColor(),模糊化函数blur()进行降噪。调用轮廓提取函数findcontours()函数,提取轮廓并保存在轮廓数组中。调用drawcontours ()函数,将轮廓画出。
本研究改写并调用OpenCV函数库中的函数,在Visual Studio 2015平台编程实现了物体的边缘检测,实验结果见下图。
图6 源图像
图7 去噪后的图像
图8 边缘检测效果图
图9 绘制轮廓
图6所示为源图像,图7为灰度化、模拟化后的图像,经多次实验得出降噪时,内核大小为3,锚点位于中心时效果最好。图8为使用Canny算子的边缘检测效果图。经实验当初第一滞后性阈值与第二滞后性阈值比值为1:2时效果最好。图9为轮廓提取的效果图。由以上图得出,本边缘检测法精确度较高,抗噪能力和边缘定位能力都比较好,抑制了虚假边缘。
本研究利用OpenCV函数库中的函数。运用Can⁃ny算子,实现物体的边缘检测,研究注重于解决边缘复杂的物体检测精度低,误判率高的问题,提高抗干扰能力和边缘定位能力。得到比较理想的检测效果。具有一定的实用价值。
[1]Rivero-Castillo D,Pijeira H,Assunçao P.Edge Detection Based on Krawtchouk Polynomials.Journal of Computational and Applied Mathematics,2015,284:244-250.
[2]Liu X,Fang S.A Convenient and Robust Edge Detection Method Based on Ant Colony Optimization.Optics Communications,2015, 353:147-157.
[3]Hao F,Shi JF,Zhang ZS,Chen RW,Zhu SQ.Canny Edge Detection Enhancement By General Auto-regression Model and Bi-dimensional Maximum Conditional Entropy.Optik,2014,125(15):3946-3953.
[4]Li H,Liao X,Li C,et al.Edge Detection of Noisy Images Based on Cellular Neural Networks.Communications in Nonlinear Science and Numerical Simulation,2011,16(9):3746-3759.
[5]Li HQ,Liao XF,Li CD,Huang HY,Li CJ.Edge Detection Of Noisy Images Based on Cellular Neural Networks.Communications in Nonlinear Science and Numerical Simulation,2011,16(9):3746-3759.
[6]郭平,赵刚,张晶.基于Matlab数字图像处理的方法应用教学[J].山东工业技术,2015(8):270-271.
[7]许宏科,秦严严,陈会茹.一种基于改进Canny的边缘检测算法[J].红外技术,2014,36(3):210-214
Research on Edge Detection Based on OpenCV
GUO Zhi-biao,DUAN Wei
(China Mobile Communications Group Guangdong Co.,Ltd.,Guangzhou 510623)
Edge detection is an indispensable step before image analysis and recognition,which is an important technology in the image preprocessing procedure.Chiefly reviews the development of the edge detection methods,discusses the characteristic of some typical edge detection algo⁃rithms.The Canny algorithm is optimized and implemented with OpenCV.
郭志彪(1977-),男,广东广州人,工程师,硕士,研究方向为计算机、物联网及ICT行业应用等
2017-02-20
2017-05-20
1007-1423(2017)15-0029-04
10.3969/j.issn.1007-1423.2017.15.007
段为(1981-),男,山西人,工程师,硕士,研究方向为ICT、物联网、大数据、云计算技术等
Edge Detection;Machine Vision;Image Processing;OpenCV