APP下载

基于图像的物体尺寸测量算法研究

2016-12-22赵明

软件导刊 2016年11期
关键词:边缘检测图像识别

赵明

摘 要:提出了基于多通道色彩下的边缘检测和目标识别方法,以及后期的以圆为参照的目标尺寸计算方法。在前期预处理中采用卷积运算和锐化等图像增强手段,利用Canny 算子检测边缘,然后通过目标的几何特征高效识别,以近似曲线逼近算法减小边界点数据量。对于已经透视变形目标,立体识别模式采用余弦修正法,平面识别模式采用最小包围矩形法进行校正,提高了目标的计算精度。最后在 PC 端和Android 平台下进行算法实现。实验结果表明,该预处理及检测识别方法行之有效,能在移动设备上进行快捷有效的图像识别处理。

关键词关键词:图像识别;边缘检测;物体测量

DOIDOI:10.11907/rjdk.162445

中图分类号:TP312

文献标识码:A 文章编号文章编号:16727800(2016)011004805

0 引言

在数字化和自动化时代,人们倾向于用更快捷有效的方法替代传统的手工工作,如在一些自动化生产车间、物流公司的配送系统,往往需要便捷获取

物体(如箱子)尺寸,方法是手工测量或肉眼估计,效率和精度不高。目前,国内外已开展了物体识别、图像矫正等方面的研究,但是

直接通过参照物标定未知目标尺寸的例子还比较少[15]。在物体识别方面,常见的是用数据训练识别器,然后再对物体进行识别(比如人脸识别)。

在图像处理方面,透视变形是最常见也是影响较大的因素,对透视变形的矫正,已经有一些技术[68],但只是对已知物体尺寸进行校正(如 A4 文档矫正)或者同比例(保持长宽比)情况下对目标进行矫正,而针对一张张独立图片还没有适合的方法。

本文开发了一款基于 Android 手机平台的物体长度测量 APP。运用图像处理技术,直接对手机相册里的图片进行目标识别、矫正和计算,得到物体尺寸。

1 算法设计

为实现从任意给定的一张图片中识别出目标物体并计算尺寸,需要经过图片预处理(过滤去噪)、边缘检测、目标识别匹配、透视变形矫正和参照对比等步骤。每一环节的处理效果及速度,都会对最终结果产生明显影响。

1.1 预处理

图像处理中,首先需要对给定图片数据进行预处理,预处理主要是进行去噪、锐化、图像增强等操作,目的是为后期处理减少干扰,突出目标。本文处理的图片随机拍照生成,拍摄背景、拍摄条件不尽相同,可能导致背景噪声干扰淹没目标物,因而预处理目标是确保原始信息不丢失且关键信息得到增强。

1.1.1 卷积运算

对图像进行卷积运算,可突出图像细节,增强对比度。卷积运算是利用一个矩阵核对一个小区域进行操作,即掩码运算。

要得到图像某个特定位置的卷积值,可用下列方法计算:①将核的锚点放在该特定位置像素上,同时,核内其它值与该像素邻域的各像素重合;②将核内各值与相应像素值相乘,并将乘积相加;③将所得结果放到与锚点对应的像素上;④对图像所有像素重复上述过程。

1.1.2 锐化

图像锐化是补偿图像的轮廓,增强图像边缘及灰度跳变部分,使图像变得清晰。在计算机图像处理中可用微分运算和高通滤波器来实现图像锐化,即对空间域和频域进行锐化。

根据频率分析,任何一幅图像都是由决定图像反差的低频信号和决定图像细节的高频信号组成,所以频率域图像的锐化可以采用高通滤波器滤波,以加强图像所需的高频信号。

1.1.3 降采样和插值

对图片进行一次降采样,可以降低图片的数据量,减少计算量,然后进行插值恢复,保持图像关键信息的完整性。可以去噪滤波,消除背景噪声和预处理带来的部分噪声。

1.2 边缘检测

边缘检测是目标识别的前提,也是整个算法流程中非常重要的一环。边缘是指其周围像素灰度急剧变化的那些像素集合,它是图像最基本的特征。边缘存在于目标、背景和区域之间,所以,它是图像分割的重要依据。有许多方法用于边缘检测,一般分为基于查找和基于零穿越两类方法。基于查找方法通过寻找图像一阶导数中最大和最小值来检测边界,通常是将边界定位在梯度最大的方向。

在边缘检测算法中,大多数情况下仅仅需要边缘检测器指出边缘出现在图像某一像素点附近,而没有必要指出边缘的精确位置或方向。本文只需要确定目标轮廓,不需要具体位置信息,步骤如下:

1.2.1 图像色彩通道提取

检测算子操作的都是单通道灰度图或二值图,传统做法是直接对源图像进行灰度化或者二值化处理,通过一定的阈值截断数据,这就丢失了不同色彩通道下的目标信息。不同拍照环境下,目标与背景的色彩区分度较大。比如目标是黄色,而背景是蓝色,综合进行二值化的结果是目标与背景的边界没那么明显。如果进行色彩通道提取然后再处理,在一种色彩通道下,能很好地将目标与背景分割开。

常见的图片只涉及 RGB 三原色,所以本文做法是每次提取3种颜色的一种,然后再进行边缘检测处理。

1.2.2 检测算子选取

常见的边缘检测算子有Roberts Cross算子、 Prewitt算子、 Sobel算子、 Canny算子等。其中,Sobel算子和Canny算子效果较好。

Sobel算子是一阶微分算子,它利用像素邻近区域的梯度值来计算1个像素的梯度,然后根据一定的阈值来取舍。Sobel 算子是算子模板,它由两个算子核构成,一个核对垂直边缘响应最大,另一个核对水平边缘响应最大。2个卷积的最大值作为该点的输出值。本文给出2个算子对同一图像的边缘检测效果。

图1 实物照片

从图1-图3可以看出,Canny算子对图像的边缘信息保留较好,出现的轮廓断裂或缺失情况小,而Sobel算子检测后的轮廓图很模糊,边缘信息丢失很厉害。本文检测算子采用Canny算子。

1.2.3 阈值自适应获取

Canny使用了滞后阈值。滞后阈值需要两个阈值——高阈值与低阈值。假设图像中的重要边缘都是连续曲线,这样就可以跟踪给定曲线中的模糊部分,避免将没有组成曲线的噪声像素当成边缘。从一个较大阈值开始,标识出比较确信的真实边缘,使用前面导出的方向信息,从这些真正的边缘开始在图像中跟踪整个边缘。跟踪时本文使用一个较小阈值,这样就可以跟踪曲线的模糊部分直至回到起点。

图2 Canny 算子效果图3 Sobel 算子效果

设置阈值过高可能会漏掉重要信息;阈值过低,枝节信息又变得很重要,很难给出一个适用于所有图像的通用阈值。传统方法是让用户根据经验手动输入两个阈值,这不但麻烦,而且同样的阈值对不同的图片检测效果不一样,缺乏泛化能力。本文提出了基于类间距的自适应阈值算法。该算法一般都能求出两个高低阈值,如果自适应获取失败,就采用最常用的经验值作为默认值。

1.3 目标识别

确定好目标轮廓线后就可对目标进行识别处理。识别之前,还应考虑实际情况对轮廓线进一步筛选。实际应用中目标物的尺寸在整个图片中属于大物体,前面步骤处理后,一些类似的小物体也保留下来,而这些需要剔除。剔除方法是面积筛选法,只有当闭合轮廓线面积满足某个面积阈值时才被保留。这样既排除了干扰,也加快了处理速度。

轮廓线由许多点组成,轮廓线保存的就是这些点,这些点存在着大量冗余。例如确定一个矩形,只需要4个点。对已经保留下来的轮廓线进行一次几何曲线拟合,用一个只包含最少点的几何曲线来表示原来的轮廓线,会大大降低数据量,减少存储空间,同时也加快了后续处理速度。

拟合算法采用的是RamerDouglasPeucker algorithm (RDP)算法。该算法递归地从原始点集选取两点作为线段,然后找离线段最远的点。如果这个点到线段的距离大于阈值就保留,否则剔除。阈值一般采用比较常用的经验值0.02。

目标识别方法很多,图像纹理特征、几何特征、模式分类器都可以作为识别依据,其中几何特征法针对规则目标的识别具有高效快捷、数据量小的优点。因此,本文采用几何特征法进行识别。

一张包含参照物和目标物的图片经过预处理、边缘检测、轮廓拾取等步骤,将参照物和目标同时进行识别,提高了处理效率。

采用了多通道的分别检测识别方法,同一个目标物会被多次识别,解决此问题的方法是去重:如果两次识别的目标物大小一样,特定点(如中心或左顶角)的坐标位置一样,那么就认为是同一物体,只保留一份即可。

1.3.1 参照物识别

(1)参照物选取。

参照物选取原则:①不能和待识别的矩形或立方体混淆干扰;②参照物自身应当易识别,且始终保持一致。基于上述考虑,本文选择圆(球)作为参照物。圆(球)的投影能保持很好的一致性。

(2)参照物几何特性。

对于圆来说,它的几何特性比较特殊,具有“1”的特性:任何小于1的几何图形都不是圆。考虑到实际情况,图片的拍摄质量、透视形变等原因,在实际识别过程中,阈值设置为0.8,当大于这个值时就判定为圆。

图片除了参照物的圆外还可能存在多个干扰圆,解决方法是确保参照物圆是所有圆里最大的一个。

1.3.2 平面目标(矩形)识别

平面目标识别主要是对一个照片里多个目标物(矩形)进行识别,这些矩形可以任意角度旋转,推荐最大个数不超过10个,否则会导致取景框装不下,需要将拉长距缩小,导致识别和计算精度下降。

识别过程:

①判断拟合曲线的顶点数是否为4;

②计算4个角的余弦值。 由于只知道4个顶点坐标,所以需要3个1组分别计算余弦值;

③筛选。 理想情况下,如果4个余弦值都为0,则代表目标物是一个矩形。考虑到实际情况下图片的拍摄质量和透视变形,4个余弦值只会与 0 很接近。解决方法是求4个余弦值的最大值,然后判断最大值是否小于阈值0.3。如果是,则目标物是一个矩形;

④去重。 如果同一个目标已被检测,则以后直接跳过,不更新矩形集合;

⑤排序。经过以上步骤,可以获得一个矩形集合,但是这个集合里可能还有一些边边角角的干扰小矩形被收录。这时可根据面积,对所有矩形进行排序,把面积大的用户感兴趣的目标列出来,其它的剔除或者跳过处理。

1.3.3 立体目标(长方体)识别

对于立体目标,从一个角度拍最多只能看到3个面,透视变形现象较严重。正对着相机的2个面会变形拉伸为梯形,而顶部的一个面则直接变形为菱形。基于以上考虑,需将识别规则进行修改:

(1)单个识别。一张图片里只能保留一个立体目标(长方体),且尽量居于图片正中央,这样可以减轻透视变形。

(2)判定拟合几何曲线的顶点是否为4 ,透视现象导致矩形退化为一般的四边形。

(3)去重。 同平面目标一样,立体目标也会由于多通道提取检测识别而出现多次检测,解决方法也是及时去重,保留一份结果。

(4)排序定位 。经过上述步骤识别出的目标,可能包含顶部已经废掉的菱形及其它四边形,此时需要对这些四边形进行一个基于面积的排序,只取面积最大的和次最大的两个,这就是本文后续计算尺寸需要的2个面。

1.4 透视矫正

物体成像过程是一个单点投影过程,该过程无可避免地产生了透视变形。透视变形最直接的效应是远小近大、平行线相交。落脚到目标物上,导致目标的几何形状发生改变,或水平或竖直方向进行了拉伸或缩小。如果仅仅为了识别出目标物,则可通过一定算法将变形后的目标识别出来,但是目标在像素空间的尺寸已经发生了改变;如果要进一步计算目标的实际尺寸,就必须对目标进行校正,才能保证结果的精确性。

目前国内外对透视校正有一些研究,针对的是一些特定目标的校正,复杂度高,缺乏通用性。例如袁国栋[9]的“逆向投影点绘制算法”、郑全新[10]的“基于消失线的长方体表面透视变形校正方法”等,需要事先知道相机的内部参数、拍摄时的距离角度等外部条件,计算过程复杂。苗立刚[11]的“基于形态学的文档图像透视校正算法”需要事先知道目标物大小,如A4纸的尺寸。代秦[12]的 “基于改进变换和透视变换的透视图像矫正”则需要事先知道几个不变的坐标,求出转换矩阵,同样不适合本文的研究目标。

基于上述考虑,必须在便捷简易和精度上折中,并且不可能有 100%的矫正效果。所以在拍摄之前,为了获得更高的精度,拍照过程应尽量减小透视变形。在平面目标(矩形)模式下,物体变形不是很严重,本文采用最小包围矩形来进行校正。

在靠近相机的一端,目标物几乎没有形变,可以这些像素点为基点,逐步向外扩展,构造一个可以最小包围目标物的外接矩形,这样就可以将缩小的边拉回到正常尺寸。为了提高计算效率,可以直接以这个外接矩形尺寸为准,省去将目标物进行校正拉伸的过程。

在平面目标识别过程中,由于目标可以旋转,所以这个最小包围矩形不是水平的,而是根据目标物最靠近相机的2条直线进行逐步扩展,构造一个最小外接矩形。

在立体目标识别模式下,由于观察角度问题,立体物体的两个面不能同时正对相机,必会导致某个面透视变形严重。通过观察图像可知,正对相机的目标高边几乎没有形变,而目标的宽边和长边则变形严重。

针对这种变形,本文采用余弦纠正法。首先计算形变的面靠近低端和水平线的夹角,然后以低端的那条边和水平线构成一个直角三角形。低端的那条边可以根据形变面的顶点坐标距离求得,然后根据余弦值,再反推出斜边的长度,即为校正后的边长。最后强调一点的是,在拍摄立体目标图片时,相机最好稍微仰视目标拍照,这样校正效果比较好。对于一些立体识别变形严重情况,推荐采用平面目标识别,每次识别立体目标的一个面,这样可提高精度。

1.5 参照计算

经过上述步骤处理,可以得到经过校正的参照物和目标物的像素空间尺寸。此时只需要进行一个等比计算,即可获得目标尺寸。

2 实验结果

目前,图像处理比较流行和成熟的第三方库是OpenCV[1314],它是一个开源的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它是轻量级的,而且高效,由一系列 C 函数和少量 C++ 类构成,主要使用C/C++编程,同时提供了Python、Java 等语言接口,实现图像处理和计算机视觉的很多通用算法。

OpenCV 提供了Point、Rect、Mat等基本数据结构,可以省去结构设计和底层操作,开发程序时专注于问题域自身算法的设计和实现,降低了实现复杂度,提高了灵活度。本文基于OpenCV 2加以实现。

为了设定核心算法和框架,便于优化修改,本文先在PC端实现算法。图像处理代码实现注重效率和检测效果,本文采用的是经典的面向过程编程方法,对关键算法的函数实现进行封装和优化。下面以立体目标识别计算为例,介绍几个核心函数的实现。

2.1 目标物去重

多通道的反复检测处理,对同一个目标可能会多次检测,但是只能保留一份,其它的需要排除掉。采用方法是基于位置和面积的判别。

2.2 自适应法确定高低

采用OSTU算法实现一个自适应算法。

2.3 目标检测识别

目标检测识别是较关键部分,综合了很多其它算法过程。其中多通道提取算法可以用OpenCV的 mixChannels()函数实现,边缘搜索可以用 findContours()实现。实现过程中关键是算法的组合及库函数的参数选取。

2.4 尺寸计算

识别过程中可能会收录一些小尺寸目标,这些需要剔除。部分图片是矩形,有时会错误地识别,这也需要剔除。剔除方法是如果目标物尺寸跟图片尺寸相仿,那么目标其实是整个图片,应当剔除。

在找到计算尺寸需要的目标两个面后,需要对每个面的 4 个顶点按纵坐标 y 为序进行排序,再根据这4个点进行余弦值求解以及实际边长计算。

2.5 手动辅助

面对一些质量很差的图片,在自动的3D和2D都无法识别时,就需要引入人工干预。干预方法很简单,用户只需指定要识别的物体关键顶点即可。

本文在PC机上对一些核心算法进行了优化和改进,最终目标是部署到Android平台上运行。从一个平台迁移到另一个平台,需要考虑很多因素。其中,核心算法都是基于OpenCV库,而OpenCV虽然提供Java接口,但Java接口是OpenCV2.3版本以后才有,稳定性和提供的支持不够完善。支持最好、效率最高的还是C/C++代码,而Android系统的前端是Java语言,目前很成熟、灵活,平台移植需要在不影响效率的情况下进行。

采用Java的JNI接口机制(java native interface)。该机制提供了C/C++原生代码和Java代码的混合编程机制,与本文所需一致。 选好接口后,要考虑数据的传递。数据在不同模块间传递,然后处理,数据结构的选取也影响程序运行效率。 在Android前端,通过拍照或选图,初始化一个位图对象,然后将位图的像素数据以数组形式通过JNI传递给后台的C/C++模块,C/C++模块再以这个像素数组重构出一个图片的Mat对象,然后按照PC端的预处理、检测、识别、校正等操作,将目标尺寸以数组形式返回,在前端显示。

为了便于后续功能拓展及更好地追踪后台模块处理情况,在返回值数组加了一个小技巧,保证正常情况下可返回尺寸。如果出现异常,如参照物识别、目标识别失败等,会返回错误标志及已经成功完成的操作,这样前端可以在了解错误原因的同时获取已经成功的操作,不必重复原来的过程,提高了效率。

3 结语

通过以上测试和结果分析,本文方法在大多数场景下

可以正确快捷地实现平面及立体目标物的识别和尺寸计算(见图4)。目标尺寸的计算结果精确到小数点后4位,识别和计算过程简捷,实现了开发简便快捷手机端APP的目标。

在预处理、检测识别、校正等关键步骤中,本文算法优化处理效果明显。即使在使用 JNI 的接口机制下,手机移动端的响应速度仍然较快。

参考文献:

[1] J R COZAR, N GUIL, E L ZAPATA.Detection of arbitrary planar shapes with 3D pose[M]. Elsevier Image and Vision Computing , 2001(19): 10571070 .

[2] DMITRY LAGUNOVSKY,SERGEY ABLAMEYKO. Fast line and rectangle detection by clustering and grouping[EB/OL].http://link.springer.com/chapter/10.1007%2F3540634606_156.

[3] ZI QIANG LI.Generalized hough transform:fast detection for hybrid multicircle and multirectangle[C].Proceedings of the 6th World Congress on Intelligent Control and Automation, Dalian,China,2006(6):2123.

[4] JUNG C R,SCHRAMM R. Rectangle detection based on a windowed hough transform[C].Computer Graphics and Image Processing, Proceedings, 2004.

[5] BAZIN J C,INSO KWEON,DEMONCEAUX, et al. Rectangle extraction in catadioptric images[C].Computer Vision, ICCV 2007, IEEE 11th International Conference,2007.

[6] GEETHA KIRAN ,MURALI.Automatic rectification of perspective distortion from a single image using plane homography[J]. International Journal on Computational Sciences & Applications (IJCSA), 2013(10):35.

[7] ZHENGYOU ZHANG. Weak perspective projection[Z].Microsoft Research, Redmond, WA, USA.

[8] DENNIS PARK,DEVA RAMANAN,CHARLESS FOWLKES.Multiresolution models for object detection[C].Lecture Notes in Computer Science,2010(6413):241254.

[9] 袁国栋, 秦开怀, 孙汉秋. 逆向投影点绘制算法[J]. 计算机辅助设计与图形学学报,2005 (2):25142521.

[10] 郑全新, 杨明强, 李文辉. 基于消失线的长方体表面透视变形校正方法[J]. 计算机工程,2013(5):162169.

[11] 苗立刚. 基于形态学的文档图像透视校正算法[J]. 光电子激光,2009(10):112116.

[12] 代勤, 王延杰, 韩广良. 基于改进霍夫变换和透视变换的透视图像矫正[J]. 中国液晶与显示,2012(6):2629.

[13] GARY BRADSKI ,ADRIAN KAEBLER. Learning OpenCV [M]. 中文版.北京:清华大学出版社,2009.

[14] Nash.Automatic perspective correction for quadrilateral objects[EB/OL].http://opencvcode.com/tutorials/automaticperspectivecorrectionforquadrilateralobjects/.

(责任编辑:杜能钢)

猜你喜欢

边缘检测图像识别
基于Resnet-50的猫狗图像识别
高速公路图像识别技术应用探讨
图像识别在物联网上的应用
图像识别在水质检测中的应用
浅谈模式识别在图像识别中的应用
基于多组合内容的图像识别机制