当前位置:文档之家› 基于OpenCV的边缘检测算法在仪表识别中的应用与改进

基于OpenCV的边缘检测算法在仪表识别中的应用与改进

基于OpenCV的边缘

检测算法在仪表识别中的应用与改进

岳利军,汪仁煌,刘洪江

(广东工业大学自动化学院 广州,510090)

摘 要:介绍一种Canny边缘检测算法的改进方法,采用自适应确定阈值,研究了在仪表LCD数字显示图像的边缘检测应用, Visual C++使用OpenCV类库作为基础函数库,程序经测试,边缘检测处理效果好,处理速度快。

关键词:图像处理;边缘检测;仪表识别

Abstract: This text introduces one kind of improvement solution to Canny edage detection, adopting adaptation to assure threshold value, studying application in LCD digital display of instrument by edge detection. And Visual C++ uses OpenCV datebase as basic function library. Through testing, the processing of edge detection is more effective and quicker.

Key words: Image processing; Edge detection; Instruments identification

中图分类号: TP317.4 文献标识码: B 文章编号:1001-9227(2008)0068-04

0 引 言

仪器仪表被广泛应用于各行各业,但是部分仪器仪表没有提供数据输出的接口,特别是在某些操作人员无法进入的恶劣的环境中,要实现对这些仪器仪表进行读数、校表,或者由读数反馈到前端,对控制器进行参数调整时,大多采用基于机器视觉的仪表自动识别方法,LCD七段码的边缘提取是数显仪表数字识别中很重要的一部分。

边缘检测作为图象处理一个重要特征,受到了人们的广泛研究,提出了许多相关算法,如Sobel、Canny、Prewitt、Roberts等。其中Canny算子[1]自从提出以来,在对各种边缘的检测中表现出良好性能[2],已经成为评估其它新的边缘检测算子的标准,并随之产生了许多改进的Canny算法[3,4],使其性能获得显著提高。使用传统Canny算子进行边缘检测时,高、低阈值和高斯滤波方差参数都需要人为确定,不同的参数对于边缘检测的结果影响很大,实际图象易受到光照不均和噪声等干扰,使图象存在噪声和模糊的边缘,甚至会出现假边缘,且处理速度比较慢,对一副普通大小的图片(800×600)处理时间需要100ms以上。

本文提出一种选用Canny算子,调用OpenCV的类库开发仪表识别中的边缘检测程序方法,并仿照MATLAB中的做法,根据图像自身的统计信息自适应生成边缘检测阈值,缩短了开发时间,达到了很好的处理效果,处理速度较传统Visual C++编写Canny算法有了很大的提高。

1 Visual C++和OpenCV简介

Microsoft公司开发的Visual C++一直是一种具有高度综合性能的软件开发工具。用它开发出的程序具有运行速度快、可移值能力强等优点,在对数字图象进行处理时经常是采用Visua C++进行编程。

OpenCV(Open Source Computer Vision Library)是一种用于数字图象处理和计算机视觉方面功能强大的类库,由Intel微处理器研究实验(Intel’s Mi-croprocessor Research Lab)的视觉交互组(TheVisual Interactivity Group)开发。

OpenCV可以从Intel公司的网站免费下载得到,该函数库是开放源代码,可以在Windows系统、Linux系统下和Qt中使用。OpenCV由一系列C函数和少量C++类构成,实现了图象处理和计算机视觉方面的很多通用算法。只需调用OpenCV的基础函数库并添加自己编写的程序,即可完成十分复杂、庞大的开发任务,达到事半功倍的效果。

2 Canny边缘检测算子应满足的准则

John Canny提出了关于边缘检测算子的三个最佳准则。

(1)信噪比准则。即低错误率,既要少将边缘像

收稿日期:2007-11-27

68

素漏掉,也要少将非边缘点误判为边缘点。信噪比的数学表达式为:

其中,为边界是[-ω,ω]滤波器的脉冲响应: G(x)代表边缘;n

是高斯噪声的均方根。若信噪比越大,则边缘提取质量越好。

(2)定位精度准则。即检测位置精度高,检测出来的边缘点位于真正的边界上。定位精度的数学表达式为:

其中,、

分别是,的一

阶导数。若localization的值越大,则定位精度越大。

(3)单边缘响应准则。即要求每个边缘的响应是唯一的,得到的边缘宽度为单像素。要求f对噪声的响应中两个相邻最大值间距离为 , f的零交叉点平均距离为x,两者关系是:

其中,k为小于1的系数。

若满足此准则,就能保证单边缘只有一个响应。对一个算法的性能评价可分为两阶段进行:计算假边缘与丢失边缘的数目;测量用于估计位置和方向的误差(或误差分布)。边缘检测算法的优劣也可用品质因数(Figure of Merit)来描述。Pratt品质因数是其中一种,它着重考虑了丢失有效的边缘、边缘定位误差和将噪声判断为边缘等三种误差。

其中,I

A、I

、d

、a分别是检测到的边缘、理想

边缘、实际边缘与理想边缘间的距离和用于修正错位边缘的设计常数。

Canny算子从算法本身来讲,主要包括:

(1)一条边界的出始点选取;

(2)跟踪准则,也就是阈值设定问题;

(3)可能的边界点选取。

3 Visual C++6.0下OpenCV的安装与配置

(1)安装OpenCV应用程序。在安装时选择"将\OpenCV\bin加入系统变量"(Add<…>\OpenCV\bin tothe systerm PATH);

(2)配置Windows环境变量。检查C:\ProgramFiles\OpenCV\bin是否已经被加入到环境变量PATH,如果没有,请加入;

(3)配置Visual C++6.0。

全局设置:

菜单Tools->Options->Directories:先设置lib路径,选择Library files,在下方填入路径:C:\Program Files\OpenCV\lib

然后选择include files,在下方填入路径:

C:\Program Files\OpenCV\cxcore\include

C:\Program Files\OpenCV\cv\include

C:\Program Files\OpenCV\cvaux\include

C:\Program Files\OpenCV\ml\include

C:\Program Files\OpenCV\otherlibs\highgui

C:\Program Files\OpenCV\otherlibs\cvcam\include

项目设置:

每创建一个将要使用OpenCV的VC Project,都需要给它指定需要的lib。菜单Project->Settings,然后将Setting for选为All Configurations,然后选择右边的link标签,在Object/library modules附加上:

cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib;

如果你不需要这么多lib,你可以只添加工程需要的lib;

正确安装好Visual C++6.0和OpenCV,并按上述步骤设置好系统和软件配置,即可编写程序,并可在程序中随意调用OpenCV类库中的函数。

4 基于OpenCV的Canny边缘检测在仪表识别应用中的实现

OpenCV类库中对应的Canny边缘检测的函数为:cvCanny函数。用这个函数就能实现仪表识别中的边缘检测。

cvCanny( const void* srcarr, void*dstarr,double low_thresh, double high_thresh, intaperture_size )

srcarr为输入图像;

dstarr为输出的边缘图像;

low_thresh为低阈值,来控制边缘连接。high_thresh为高阈值,用来控制强边缘的初始分割。

aperture_size为扩展Sobel

核的大小,必须是

69

70

1,3,5或7。除了尺寸为1,其他情况下aperture_size×aperture_size可分离内核将用来计算差分。在进行边缘检测前,首先对原始图像进行高斯模糊平滑。OpenCV中的平滑函数如下:

cvSmooth( const void* srcarr, void* dstarr,int smooth_type, int param1, int param2, doubleparam3, double param4 )

srcarr为输入图像;

Dstarr为输出图像;

smooth_type为平滑方法:在本程序中用的是高斯模糊平滑CV_GAUSSIAN(gaussian blur)对图像进行核大小为param1×param2 的高斯卷积 ;

param1 平滑操作的第一个参数;

param2 平滑操作的第二个参数,对于简单/非尺度变换的高斯模糊的情况,如param2的值为零,则表示其被设定为param1;

param3 对应高斯参数的 Gaussian sigma (标准差),如果为零,则标准差由下面的核尺寸计算:sigma = (n/2 - 1)×0.3 + 0.8, 其中 n=param1对应水平核,n=param2 对应垂直核。

Param4 平滑操作的第四个参数。

原始仪表图像如图1所示:图2 ̄5分别为用Robert、Kirsch、Sobel、Gauss-Laplace等边缘检测算子处理后的图象,图6为用传统的方法编写的Canny程序处理的图象;经高斯模糊平滑后,用上述基于0penCV 的选用Canny算子,边缘检测方法对原始图像进行处理后得到的边缘检测结果如图7所示,从图中可以看出,检测出的边缘连续、清晰。通过对50幅图象(800×600)进行检测实验,每幅图像所用平均处理时间为15ms。

图1 切割后的体温计图

图2 Robert算子处理后的图象

图3 Kirsch算子处理后的图象

图4 Sobel算子处理后的图象图5 Gauss-Laplace算子处理后的图象

图6 传统Canny程序处理后的图象图7 本文程序处理后的图像

5 基于OpenCV的Canny边缘检测函数的改进在OpenCV中用canny算子进行边缘检测速度很快,不过高低阈值需要输入,在matlab中,如果不指

定阈值的话,由函数自适应确定,因此仿照matlab中的做法,对canny

函数进行了修改,以便当没有指定

高低阈值时,由函数自适应确定阈值。

因为像素的梯度幅值与图象边缘强度成正比,则像素自身的梯度值与检测边缘的阈值之间也一定存在对应关系。

在OpenCv原码库中增加了一个函数,用于确定高低阈值。

CV_IMPL void AdaptiveFindThreshold(CvMat*dx, CvMat *dy, double *low, double *high)其中,dx为cvCanny函数中用sobel算子计算完水平方向的梯度强度,dy为cvCanny函数中用sobel算子计算完垂直方向的梯度强度,low为低阈值,high为高阈值。

函数具体实现如下:

首先以梯度幅值直方图的形式描述图象像素,在梯度幅值直方图中找出一个对应于背景区域像素集合

的极值,设该幅值为,则大于的像素点认为是边缘区域,通过式(1)计算出边缘区域像素点的梯度幅值相对于MAX的均方差:

(1)

其中,l为像素数不为零的最大梯度幅值,M为边缘区域内的像素总数。m

反映了边缘区域像素的梯度幅值相对于的平均离散程度。

本文认为大于 一倍m

以上的像素点为强边缘区域,可以有效抑制检测出虚假边缘[5],因此确定

高阈值为:high=+m

然后去掉强边缘区域对应的像素点,余下大于m

o的梯度幅值所对应的像素点为弱边缘区域。和确定高阈值类似,通过计算弱边缘区域梯度幅值直方图的均方差,确定低阈值。

再把cvCanny函数进行以下修改。在函数体中,当程序用两个sobel算子计算完水平和垂直两个方向的梯度强度过后加入以下代码:

// 自适应确定阈值

 if(low_thresh == -1 && high_thresh == -1) {

AdaptiveFindThreshold(dx, dy, &low_thresh,&high_thresh);

 }

重新编译cv库,对lib和dll库进行更新。这样,在调用cvCanny函数时,指定高低门限为-1,则cvCanny函数就自适应确定门限。高低阈值根据图象自身的变化信息确定,动态地随图象梯度幅值变化而变化,因此具有较好的自适应性。

6 结 论

Canny边缘检测算子是一种十分有效的边缘检测方法,本文介绍一种的Canny边缘检测算法的改进方法,根据图像自身的统计信息自适应生成边缘检测阈值, 研究了在仪表LCD数字显示图像的边缘检测应用,Visual C++使用OpenCV类库作为基础函数库,利用基于OpenCV的Canny对仪器仪表数字图象进行边缘检测。程序经测试,能够有效抑制光照或噪声对图象的影响,采用自适应确定阈值,其抗噪性能好,定位确度高;检测出的边缘连续、清晰,边缘检测处理效果好,处理速度快,具有一定的实用价值。

参考文献

1Canny J.A computational approach to edge detection[J].JEEE Transactions on Patten Analysis and Ma-

chine Intelligence,1986,8(6):679-698.

Bowyer K,Kranenburg C,Dougherty S.Edge Detector

Evaluation Using Empircal Roc Curves[C]//CVPR’99,

1999-06

Health M D,Sarkar S,Sanocki T,et al.A robust visual

method for assessing the relative performance of

edge-detection algorithms[J].IEEE Transaction on Pat-

tern Analysis and Machine Intelligence,1997.19(12)

Washington P L.Enhanced Canny Edge Detection Using

Curvature Consistency[C]//2002 Proceedings 16th In-

ternational Conference on Pattern Recogniton,2002,1

(11):596-599

邢 果,戚文芽,李 萍,陈季安.灰度图象的自适应边缘检

测[J].计算机工程与应用,2007,43(5)

中国自动化学会理事徐扬生教授新当选为中国工程院院士

中国工程院12月29日在北京宣布,该院2007年院士增选结果揭晓,33人新当选为中国工程院院士,其中,香港特别行政区2位科学家、台湾省1位科学家当选。

在增选的院士中,我学会理事、香港中文大学徐扬生教授新当选为信息与电子工程学部院士,至此,我学会理事会成员中,院士总数达到16位,其中中国科学院院士和中国工程院院士各占8位。

(中国自动化学会供稿)

71

相关主题
文本预览
相关文档 最新文档