基于肤色质心与边缘自生长的手势分割算法
2022-03-18黄沛昱袁素真
黄沛昱 黄 岭 袁素真
(重庆邮电大学光电工程学院 重庆 400065)
0 引 言
近年来,计算机技术的发展日新月异,新一代的人机交互(Human-Computer Interface,HCI)与虚拟现实系统出现在了人们的日常生活中。手势作为一种自然直观、无需中间媒介的交互方式,对其跟踪与识别越来越成为国内外计算机视觉领域的研究热点[1]。
手势分割是手势识别的前提和基础,其分割效果的好坏直接影响下一步手势识别的结果[2]。因此,手势分割是手势识别系统中极为关键的处理步骤。手势分割就是将手势作为前景与背景进行分离,从手势分割技术的实现上来看,手势分割方法主要为:模板检测、AdaBoost分类器检测、肤色检测等[3-4]。由于肤色不随手的姿势、大小、方向的改变而改变,且肤色检测运算量小,适用于快速手势分割,同时也便于与其他算法相结合提高分割效果。因此,肤色检测在手势分割中有很大的通用性。
目前常用于肤色模型的色彩空间包括RGB空间、YUV空间、YIQ空间及YCbCr空间等[5],但一些事实证明,以上方法在检测准确率和鲁棒性上难以达到要求[6]。为解决上述问题,文献[7]中利用深度图像设备进行手势分割,分析深度图像的不同阈值,从而计算手势在图像中的位置,但深度图像设备价格成本高昂无法普及。文献[8]中利用两个CNN网络进行分割训练,再通过网络得到手势分割结果,但多个CNN网络对硬件设备要求较高,易对后续识别工作造成运算负担。文献[9]中利用AdaBoost算法对人脸区域进行检测,然后利用人脸区域的肤色自适应获得整幅图的肤色范围,但对于与肤色一致的背景无法很好地分割。文献[10]中利用肤色与运动相结合分割出手势,但该算法对于静态手势分割效果较差,适用面较低。文献[11]中利用肤色得到手势区域及质心位置,再利用分水岭算法分割出手势,但算法复杂度较高,处理时间较长。
针对传统分割方法设备相对昂贵,易受到复杂类肤色背景干扰,分割速度不足等问题,本文提出一种使用单目视觉图像且具有较高准确度和分割速度的基于肤色质心与边缘自生长的手势分割算法。
1 算法介绍
基于肤色质心与边缘自生长的手势分割算法主要步骤为手势区域提取、区域内边缘检测及边缘自生长补全、手势分割,算法流程如图1所示。
图1 算法流程
1) 在单目视觉条件下采集图像数据并检测肤色区域。
2) 利用连通域去除其他较小的肤色块并完成手势区域定位。
3) 检测手势区域内边缘并利用自生长算法对边缘进行补全。
4) 将2)、3)中结果差分运算并去除类肤色背景完成分割。
2 手势区域提取
2.1 基于YCbCr空间的肤色分割
肤色检测模型对亮度敏感度高,YCbCr空间中图像亮度与其他信息相互分离,减少亮度对其他颜色分量的影响,因此YCbCr空间是最适合肤色图像区域分割的颜色空间[12]。RGB空间与YCbCr空间的转换公式如式(1)所示。
(1)
在YCbCr空间中,人体肤色会有一个明显的类聚现象,通过文献查询以及实验验证,人体肤色在YCbCr空间中最合适的分割阈值为:133 图2 原图 图3 肤色区域图像 肤色模型从原图片中筛选出的肤色区域并不能准确代表手势区域,还需要将一些类肤色的干扰区域去除。肤色检测的过程中,人手所占的区域最大,所以,将肤色分割后的图片中最大区域块提取出来,就是手势识别中人手所在的区域。且肤色处理后的图像为二值图像,因此使用连通域标记的方式进行筛选。 对于可识别的人手,其经过肤色检测后还是一个完整的图形,都是由多像素聚集形成,不存在小区域连接,所以此时选择四连通域标记完成对手势区域的粗分割,分割效果如图4所示。 图4 经连通域处理后的手势 对初步分割后的二值图进行Hu矩[14]计算,再由Hu矩特征值计算前景图像的质心坐标,图像函数f(x,y)的几何矩计算公式如式(2)和式(3)所示。 (2) (3) 手势分割算法的最终目的是分割出手势部分,所以对于边缘的寻找只需要在人手所在区域进行就能达到目的,同时这种方式将去除大量冗余计算,大大降低后续处理的时间。 图5 手势区域边界计算 判定条件: (4) (5) (6) (7) 为去除可能存在于手势后方的类肤色背景,还需要对划定区域内图像进行边缘检测,找出人手边缘并去除非人手部分,且在边缘检测前先对划定区域内图像进行滤波以降低噪声对边缘定位的影响。 传统中值滤波的滤波窗口每次滑动都会保留部分旧数据[15],并重复对旧数据进行比较,增加了算法的运算量,而改进的中值滤波算法就是将上次窗口的比较结果保留并运用到本次滤波窗口中,从而降低算法运算量,提高单次滤波速度。 设窗口内像素组成的矩阵为: (8) 对窗口内的每一列都分别进行排序,找到每一列像素的中值,即a11~an1的中间值m1,a12~an2的中间值m2,…,a1n~ann的中间值mn,并将这些新的中值存入一个数列Xm,即Xm=[m1,m2,…,mn],再求得数列Xm的中值m,则m就是整个矩阵的近似中值。 滤波窗口每次向右滑动时均会丢弃左边一列像素并在右边加入新的一列像素,在每次移动窗口的同时将数列Xm的值同时左移一位,最右边补充新一列像素的中值。假如对分辨率为m×n的图像使用N×N的滤波窗口进行滤波,传统中值算法最坏需要[(N2-1)N2/2]×m×n次比较,而改进后的算法最坏仅需要[(N-1)N/2]×(2n+2)×m次比较,约为传统运算量的2/(N+1)N,若窗口为3×3,则约为传统运算量的17%。 传统差分算子计算梯度只计算水平x轴方向和垂直y轴方向[16-17],即四邻域梯度,为进一步改善边缘检测效果,在Sobel算子的基础上增加45°、135°方向的算子,各方向算子模板如图6所示。 图6 边缘检测模板 以图6中的模板为窗口分别对关键位置的灰度值进行卷积操作,分别计算各个方向的梯度值,其计算公式如式(9)-式(12)所示。 Gx(i,j)={[I(i+1,j-1)+2I(i+1,j)+I(i+1,j+1)]- [I(i-1,j-1)+2I(i-1,j)+I(i-1,j+1)]} (9) Gy(i,j)={[I(i-1,j+1)+2I(i,j+1)+I(i+1,j+1)]- [I(i-1,j-1)+2I(i,j-1)+I(i+1,j-1)]} (10) G45(i,j)={[I(i,j+1)+2I(i+1,j+1)+I(i+1,j)]- [I(i-1,j)+2I(i-1,j-1)+I(i,j-1)]} (11) G135(i,j)={[I(i-1,j)+2I(i-1,j+1)+I(i,j+1)]- [I(i,j-1)+2I(i+1,j-1)+I(i+1,j)]} (12) 式中:I表示该点的像素值。 当得到4个方向的梯度值后,利用坐标投影原理将梯度合成在水平垂直两个方向上,其计算方式如式(13)、式(14)所示。 GX(i,j)=Gx(i,j)+G45(i,j)cos45°+G135(i,j)cos135°= (13) GY(i,j)=Gy(i,j)+G45(i,j)sin45°+G135(i,j)sin135°= (14) 将上述计算结果代入式(15)、式(16)计算出当前像素点灰度值的梯度幅值G(i,j)和梯度角度θ(i,j)。 (15) (16) 以上述方法改进后的梯度计算方式充分考虑了各个方向的梯度,使得梯度计算更加准确,同时进行非极大值抑制时也可以直接利用梯度计算,而不需要进行内插值计算。 计算出梯度幅度和角度后,直接使用传统canny边缘检测中的非极大值抑制,利用梯度角度确定边缘方向,只保留该方向上的极大值,将边缘由粗变细便于后续处理。阈值化时利用OTSU法确定,canny高阈值使用最大类间方差,低阈值取高阈值的二分之一[18]。 边缘检测算法检测出来的边缘会因为光线照射不均匀、阈值选择不恰当等原因导致其产生断裂[19],若断裂部位刚好在需要分割掉的类肤色区域处,会导致边缘检测算法不起作用。针对边缘断裂的情况,本文提出一种边缘自生长算法,算法在区域内搜索边缘断裂点,若在一定半径的范围内存在距离最短的两个断裂点,则对其进行直连,即填充两点间的部分像素,完成对断裂边缘的生长。算法的实现步骤如下: 步骤1全局扫描判定断裂点。 对二值化边缘图像T整个图像使用3×3大小的窗口进行遍历取值: (17) 遍历方式为从左到右、从上到下,步进为1,经非极大值抑制后的边缘可能存在的边缘断裂点像素分布如图7所示,由图可知,当w(i,j)=1时,开始判定该点是否为断裂点。 图7 可能存在的断裂点处像素分布 当矩阵w的和S(w)=2时,直接判定为断裂点; 当S(w)=3时,判定条件为: (18) 式中:S(w2n)为矩阵w的第2行和,S(wn1)、S(wn3)分别为矩阵w的第1列和及第3列和,S(wn2)为矩阵w的第2列和,S(w1n)、S(w3n)分别为矩阵w的第1行和及第3行和。 当w矩阵满足上述断裂点判断条件时,即存在断裂点a(xa,ya)=w(i,j),进入步骤2;否则移动窗口,w重新取值,在步骤1中继续判定,直至完成整个窗口的遍历,进入步骤4。 步骤2设定半径R内搜寻另一断裂点。 因为窗口w遍历顺序为从上到下,故搜索断裂点周围另一断裂点时可以不用搜索该点的上方。以r=(xb+yb)为半径的圆形依次向外进行搜索,b点坐标表示为: (19) 以b点为中心得到3×3矩阵w′,搜索半径为r时,当半径为r的类圆弧上存在满足步骤1中判定条件的w′时,即存在另一断裂点,且它为最小距离点b(xb,yb)=w(i′,j′),进入步骤3;否则不存在另一断裂点,返回步骤1并移动窗口。 步骤3边缘自生长。 对断裂处的两端,即a(xa,ya)、b(xb,yb)两点进行最短距离连接。首先计算a、b两点行列值的差值xab、yab: (20) 由遍历方式可知xab≥0,当yab≥0时,b点位于a点右方,然后比较xab、yab的值,若xab≥yab,令: (21) 式中:T为二值图像像素点的值。 若xab (22) 当yab<0时,b点位于a点左方,比较xab、yab的值,若xab≥|yab|,令: (23) 若xab<|yab|,令: (24) 按式(21)-式(24)完成边缘生长后,返回步骤1并移动窗口。 步骤4完成生长并输出。 进入该步骤表明断裂边缘已完成自生长修复,此时的二值矩阵T即是最终的边缘图像,当生长半径R=10时修复效果如图8所示。 图8 边缘生长局部效果 本文的实验平台为个人计算机,使用MATLAB2016b进行仿真,采用三幅分辨率均为640×480的实拍图像进行验证,其拍摄场景分别为白天室内环境、白天室外环境和夜晚灯照环境如图9(a)所示。为增加干扰,各场景中均存在类肤色背景,且均有部分类肤色背景位于人手后方,场景3中在人手后方设置了大块类肤色背景,面积超过人手面积。本文首先利用传统肤色检测实现了对手势的分割,其分割结果如图9(b)所示,然后使用了肤色直接结合边缘检测的方式实现对手势的分割,其分割结果如图9(c)所示,还使用了文献[11]的质心分水岭算法(ICWA),分割结果如图9(d)所示,最后是本文算法,其分割结果如图9(e所示),通过对不同场景下分割结果的对比可以看出,本文算法在最终分割效果上相较其他算法均有一定优势,且能较为完整地分割出手势图像。 图9 不同背景下各算法处理结果对比 对于肤色检测算法而言,当背景中存在一定的类肤色背景时,其并不能准确地分割出手势区域。而肤色检测结合了边缘检测算法之后虽然能分割掉其他类肤色背景,但对于手势正后方的类肤色区域却无法有效分割。对于文献[11]的ICWA,其有时存在过分割现象。而本文算法可以较为准确地分割出手势,其原因在于使用了边缘自生长算法对边缘信息进行补全,同时采用了OTSU和双阈值,有效地减少了静态手势分割算法中存在的过分割或者无法完全分割的问题。 算法运行时间与硬件的优劣和实现的环境关联很大,而肤色检测算法是最基础的算法,其运行时间具有参考性,本文为排除软硬件影响,以肤色检测算法运行时间为基准,在相同硬件和软件条件下,计算各算法运行时间与基准的比值如图10所示。可以看出,本文算法在保证很好分割效果的情况下,运行时间明显优于其他算法,与文献[9]的ICWA相比速度提高了近一倍。其中,本文算法因为后续计算均在手势区域内进行,所以处理时间会有波动,手势所占面积越大,处理时间越长,反之则越短。由图10易得,人手区域越小本文算法越有优势,当小于整个图像的17%时,本文算法在速度上甚至比简单的肤色+边缘算法更加有优势。 图10 各算法运行时间与基准的比值 手势分割算法作为手势识别的前提,为验证本文算法的实用性和正确性,将本文算法处理后的图片(像素为28×28)作为输入数据,设计了一个1+2的简单CNN网络进行验证。网络首先使用20个核大小为9×9、步长为1的卷积层提取图像特征并使用ReLU函数激活,由核为2×2、步长为2的池化层压缩图像,再进入一层平铺层和两层大小为100的全连接层,最后使用Softmax函数进行分类输出,具体结构如图11所示。 图11 CNN网络结构 本文用于测试的手势图像数据包括部分sign_language数据集和个人收集的手势图像数据,该数据集共包含26种静态手势,但其中部分手势相似度较高,而相似手势识别率受CNN网络性能影响很大。为排除因网络性能而导致的分类错误,本文从中选出14种相差较大的静态手势进行测试,共20 585幅图片,每次训练随机从训练集中选择100幅图片,共迭代50 000次,训练结果如图12所示,其中结构为1+2网格结构,校验数据最高识别率为99.02%。 图12 CNN网络训练识别率 测试时分别使用传统SHIT算法、ICWA+CNN、本文算法+CNN进行测试,测试结果如表1所示。 表1 各算法识别率与误据率对比(%) 误据率的产生是因为SIFT算法需要利用特征点进行匹配,若出现误据则代表匹配不成功,而CNN网络是直接进行分类输出,所以不会有误据产生。ICWA有时会出现过分割现象,分割出来的手势特征缺失,导致识别率降低。从实验结果可以看出,本文算法相较其他算法分割效果较好,能有效提高后续手势识别的识别率。 传统手势分割算法在复杂背景下难以准确而又完整地分割出手势图像,本文结合了肤色与边缘信息对手势进行分割提取。利用肤色模型检测手势所处区域,为降低后续运算量及时间,只在该区域内对手势图像进行后续的处理。改进边缘检测算法,增加斜方向算子,并以边缘自生长的形式补全边缘,进一步加强分割效果。实验结果表明,本文算法能够快速有效地从复杂类肤色背景中分割出手势图像,具有一定的实用性,为后续手势识别工作奠定了基础。2.2 连通域计算
2.3 Hu矩质心计算
2.4 手势区域提取
3 肤色与类肤色区域分割
3.1 改进的中值滤波算法去除图像噪声
3.2 八邻域算子边缘检测
3.3 边缘自生长
4 结果分析
5 结 语