APP下载

OpenCV在“数字图像处理”课程教学中的应用

2010-08-16李树涛胡秋伟

电气电子教学学报 2010年6期
关键词:数字图像处理图像处理人脸

李树涛,胡秋伟

(湖南大学电气与信息工程学院,湖南长沙 410082)

0 引言

文献[1,2]介绍了如何把Matlab引入到“数字图像处理”教学中,Matlab能很方便对图像进行处理,提高了学习效率。笔者认为,仅偏重于学生如何使用Matlab工具箱实现图像处理的功能,学生难以深入理解算法的本质,不利于学生深刻理解数字图像的各种算法原理。同时,工程应用中大多使用C语言及其开发工具进行视频的采集、处理、传输。由于Matlab程序的移植性较差,学生学习完成后不能面对实际的开发应用,难以真正提高学生的工程实践动手能力。文献[3]利用VC++开发相应的可视化课件和教学演示系统进行教学,可以加深学生对算法原理的理解,增强学生的动手能力。但由于直接利用VC++编写图像处理算法难度较大,且对于复杂的算法学生很难编程实现,加大了教学难度。

为了让学生既能掌握基本理论和技术,又能较容易编写算法的程序,我们在“数字图像处理”的教学中引入了OpenCV。该软件是以C函数和C++类的形式实现大量图像处理算法,学生可以方便地利用OpenCV进行图像处理算法的编程和验证,进而在VC++中开发功能更强大的应用程序。相对于Matlab而言,学生不仅可以利用OpenCV开放的源代码,以函数进行图像处理,而且可以查看算法的代码实现,可以较好地培养学生的编程能力。

1 OpenCV概述

OpenCV是Intel公司支持的开源计算机视觉库[4]。它由一系列C函数和少量C++类构成,实现了图像处理和计算机视觉方面的很多通用算法,可以方便地在VC6.0、VC.net、VS2008等编译器中使用。OpenCV采用优化的C代码编写函数,执行速度快,注重实时图像处理。其包含的函数有500多个,涵盖了计算机视觉的许多应用领域,如工厂产品检测、医学成像、信息安全、用户界面、摄像机标定、立体视觉和机器人等,利用这些函数几乎可以完成所有图像处理操作。因为计算机视觉和机器学习密切相关,所以OpenCV还提供了机器学习库(MLL)。该机器学习库侧重于统计方面的模式识别和聚类。机器学习库除了用在视觉相关的任务中,还可以方便地应用于其他的机器学习场合。应用OpenCV能实现对图像数据的操作、对图像和视频的输入输出、对矩阵、向量和各种动态数据结构的操作、基本的数字图像处理、结构分析、摄像头标定、目标识别以及GUI等功能[5]。

2 OpenCV在教学中的应用实例

为了使学生能掌握图像处理的理论知识,以便提高工程实践能力。OpenCV的开源性使其成为图像处理实践能力培养的主要手段。我们在教学中引入了OpenCV的图像格式转换、边缘检测、图像分割、直方图均衡、图像平滑、距离变换、用 Hough变换检测直线、运动目标检测与跟踪和人脸检测等案例。本文仅以边缘检测、图像平滑和人脸检测来举例说明OpenCV在数字图像处理教学中的应用。

2.1 边缘检测

边缘检测是图像处理和计算机视觉中的基本问题,通过对图像上各个像素点进行一阶或二阶微分来确定边缘像素点。根据数字图像的特点,常用差分代替导数运算,由于一阶导数运算具有固定的方向性,只能检测特定方向的边缘。为了克服一阶导数的确定,可以计算图像的梯度。图像梯度的最重要性质是:梯度的方向在图像灰度最大变化率上,它恰恰可以反映出图像边缘上的灰度变化。

图像边缘提取的常用算子有Robert算子、Sobel算子 、Prewitt算子 、Krisch 算子和Canny 算子等。下面以Canny算子为例,说明OpenCV在数字图像处理中边缘检测的实现。

Canny算法的核心包括下面几个步骤:①用高斯滤波器平滑图像;②用一阶偏导的有限差分计算梯度的幅值和方向;③对梯度幅值进行非极大值抑制;④用双阈值算法检测和连接边缘;⑤采用高斯平滑函数。

在传统的理论教学中,学生很难感性理解整个过程。现在利用OpenCVVC++编写程序并一步步调试,让学生看到每一个中间结果,同时也看到整个算法的代码实现,使他们不仅明白理论知识,也了解了如何用C和C++去实现算法。在OpenCV中可以写出利用Canny算子进行边缘检测的代码:

IplImage*img=cvLoadImage("Lena.jpg",0);

IplImage*result img=cvCreateImage(cvSize(img->width,img->height),IPL DEPTH 8U,1);

cvCanny(img,result img,threshold1,threshold2);

cvNamedWindow("result",CV WINDOW A UTOSIZE);

cvShowImage("result",result img);

上面程序中,第一句利用cvLoadImage函数加载一幅图像到结构体变量img中,第二个参数0代表把加载的图像转换成灰度图像,第二句利用cvCreateImage创建一幅与img同样大小、通道数为1的图像,用于存放边缘检测的结果。下一句cv-Canny函数对img图像进行边缘检测,检测结果存放到变量result img中,threshold1和 threshold2中的小阈值用来控制边缘检测,大阈值用来控制强边缘的初始化分割。最后cvNamedWindow创建一个显示窗口,cvShowImage用于在窗口上显示图片。实验结果如图1所示。

图1 Canny边缘检测结果

通过OpenCV对Canny边缘检测进行演示,使得理论算法变得具体和简单。相对于Matlab,利用OpenCV进行Canny边缘检测并不复杂。但由于OpenCV的开源性,学生可以通过查看cvCanny函数的源代码,能更清晰地了解Canny边缘检测的实现过程,同时锻炼了学生的C语言与C++编程能力。如果在实际应用中碰到边缘检测,则可以方便地把代码移植到应用程序中,方便了图像处理在工程实际中的应用,加强了学生实践动手能力的培养。

2.2 图像平滑

图像平滑是一类简单但使用频率很高的图像处理方法。平滑处理的用途有很多,常用于去除图像上的噪声或者减少失真。图像的常见噪声主要有加性噪声、乘性噪声和量化噪声等。由于图像的能量主要集中在低频部分,而噪声所在的频段主要在高频段,因此通常都是采用低通滤波的方法消除噪声。

目前OpenCV可以提供五种不同的平滑操作方法,所有操作都由cvSmooth函数实现,该函数可以将用户所期望的平滑方式作为参数,其原型如下:

void cvSmooth(const CvArr* src,CvArr* dst,int smoothtype=CV GAUSSIAN,int param1=3,int param2=0,double param3=0,double param4=0);

参数smoothtype为CV BLUR NO SCALE、CV BLUR、CV GAUSSIAN 、CV MEDIAN 和 CV BILATERAL,分别代表简单不带尺度变换的模糊、均值滤波、高斯模糊、中值滤波和双边滤波。四个参数param1,param2,param3和param4的含义取决于smoothtype的值。

图2给出了OpenCV的均值滤波和中值滤波在图像平滑中的应用示例。图2(a)是加了强度为0.02椒盐噪声的Lena图像,图2(b)是用3×3的模板均值滤波后的结果,图2(c)是用3×3的模板中值滤波后的结果。通过OpenCV的实验演示,可以使学生看到均值滤波对椒盐噪声只能得到一定程度的抑制,而中值滤波的效果好于均值滤波。

图2 均值滤波和中值滤波结果

2.3 人脸检测

人脸检测是指对于任意一幅给定的图像,采用一定的策略对其进行搜索以确定其中是否含有人脸。如果含有人脸,则返回人脸的位置、大小和姿态。

OpenCV实现了基于Viola-Jones检测器的人脸检测技术[6]。Viola-Jones分类器使用筛选式的级联AdaBoost分类器。级联的每个节点使用Ada-Boost来学习每个高检测率低拒绝率的多层分类器,使用的是类Haar特征。在OpenCV中使用detect and draw函数进行人脸检测,在图中用不同颜色的矩形框画出人脸的位置。演示结果如图3所示。

图3 人脸检测结果

3 结语

将OpenCV引入到“数字图像处理”教学,由于OpenCV的开源特性,使得学生可以更清晰地了解算法的实现过程,加深对算法的理解。由于OpenCV可以在Visual C++等主流开发环境中运行,学生可以方便地开发功能更丰富的应用程序,这既可以提高学生的学习兴趣和自信心,也锻炼了编程能力;由于OpenCV易学易用,可以利用课程设计的机会让学生自己编写图像处理的工程应用软件,而不仅仅局限于用Matlab等工具进行仿真实验。

[1] 黎宁,徐晓波,牛征.Matlab平台下图像处理实验教学软件的实现[J].南京:电气电子教学学报,2001,23(5):55-56

[2] 张坤华,纪震.“数字图像处理”可视化教学体系探索[J].南京:电气电子教学学报,2007,29(1):113-115

[3] 盛利元,李宏言,孙克辉.“数字图像处理”实验教学探索与实验软件研[J].南京:电气电子教学学报,2005,27(3):75-77

[4] Gary Bradski,Adrian Kaebler.Learing OpenCV[M].南京:东南大学出版社,2009

[5] 刘瑞祯,于仕琪.OpenCV教程[M].北京:北京航空航天大学出版社,2008

[6] P.Viola and M.Jones.Rapid Object Detection Using a Boosted Cascade of Simple Features[C].IEEE CVPR,2001:1-8

猜你喜欢

数字图像处理图像处理人脸
有特点的人脸
一起学画人脸
基于图像处理的机器人精确抓取的设计与实现
机器学习在图像处理中的应用
三国漫——人脸解锁
信息与计算科学专业《数字图像处理》课程教学探讨与实践
微课在大学专业课中的应用研究
以应用实例为主线、以程序设计为主导的数字图像处理课程教学方法改革
基于图像处理的定位器坡度计算
长得象人脸的十种动物