蔡旭航, 朱留存,, 张 震, 张恒艳, 郑晓东
(1. 扬州大学 信息工程学院, 江苏 扬州 225000; 2. 北部湾大学 先端科学技术研究院, 广西 钦州 535001)
图像阴影常会对目标识别和跟踪[1]、 特征匹配[2]和三维重建[3-4]等视觉任务产生影响. 因此, 在视觉任务前先对图像进行阴影相关的预处理十分必要. 目前的阴影检测算法主要分为交互式检测算法和自动检测算法. 文献[5-6]提出了交互式阴影检测算法, 需要用户先标记图像中的阴影和非阴影区域, 再根据标记并结合其他一些图像特征得到检测结果. 基于交互式方法检测结果通常受用户主观因素的影响, 并在检测较复杂阴影场景时, 交互过程繁琐且易出错.
自动阴影检测算法则不需要人工干预, 通过图像内在的特征区分阴影和非阴影. 文献[7]提出了一种阴影检测算法, 首先利用视网膜理论将原图像分解到反射层, 再计算原图像和反射层图像的误差确定最终的阴影区域, 但该算法通过生物视觉模型进行检测, 模型的参数无法与实际物理光照相联系, 需依靠经验设定模型, 因此检测结果受经验值的影响较大, 同时检测结果也受反射层分解方法的影响. 文献[8]提出了一种基于区域匹配的阴影检测算法, 该算法利用均值漂移算法将图像分割成小区域, 并提出一种假设: 两个区域在纹理和色度相同的情况下, 亮度较小的为阴影, 亮度较大的为非阴影, 如果两个区域亮度相同, 则应赋予相同的阴影标签. 基于该假设首先将阴影区域和非阴影区域按对分类, 获取初始的阴影标签, 然后再通过训练出的分类器划分阴影区域和非阴影区域, 该方法可识别出边界明显且梯度较大的硬阴影, 对于边界不明显的软阴影检测效果较差, 易误检, 甚至会出现检测失败的情况. 文献[9]提出了一种基于HSI颜色空间和OTSU阈值划分的阴影检测算法, 该方法使用K-means分割使算法可检测复杂背景的阴影图像, 同时利用HIS颜色空间的性质, 并与OTSU算法相结合, 使检测结果避免深色区域的误判, 该方法可避免暗色明亮区域对阴影检测产生的影响, 同时在图像存在不均匀颜色纹理的情况下仍可准确针对不同纹理进行阴影检测, 但该方法通常会受环境影响在边缘处检测不完整. 近年来, 许多研究者将深度学习技术引用到阴影检测中. 文献[10]将卷积神经网络(convolutional neural networks, CNN)引入到阴影检测中, 其利用7层CNN网络从超像素中提取特征, 然后将特征反馈到条件随机场(CRF)模型中以平滑检测结果. 文献[11]提出了堆叠式条件生成对抗网络(stacked conditional generative adversarial network, ST-CGAN)联合学习进行阴影检测. 文献[12]提出了一种注意力递归生成对抗网络(attentive recurrent generative adversarial network, ARGAN)解决阴影检测问题. 使用深度学习方法的阴影检测算法都需要预先对给定的数据集进行学习, 当算法检测到与数据集中情况接近的阴影目标时检测结果较好, 反之检测结果较差.
对于阴影检测任务, 一般都只考虑了图像的色度、 纹理、 亮度等信息, 而忽略了图像的深度信息. 深度信息可获取图像的光照方向、 场景结构、 空间坐标等信息. 文献[13]提出了一种结合深度信息进行阴影检测的相似阴影置信度算法, 首先利用深度相机获取RGB图像及其对应的深度图, 再通过深度图估计目标的法线和空间坐标, 利用色度信息、 深度信息、 空间坐标信息计算每个像素点与其局部邻域的相似度, 进而计算出每个像素点的阴影置信度. 该方法结合了图像的深度信息, 可检测出复杂环境中的阴影, 并且使用阴影置信度可很好地检测出边缘不明显的软阴影. 但该算法的效果受检测窗口尺寸影响, 若窗口较小, 则会导致阴影检测结果不完整; 若窗口过大, 则会导致运算量急剧增大, 因此难以准确给出合适的窗口尺寸.
针对文献[13]算法存在运算速度较慢、 检测效果受窗口尺寸限制的缺点, 本文提出一种基于多尺度超像素融合的阴影检测算法. 首先对RGB图像进行多尺度的超像素分割, 同时利用深度图计算目标的法线和三维空间信息; 然后在不同尺度的超像素分割图上进行全局域的阴影置信度计算; 最后通过Adaboost训练得到的分类器将不同尺度的阴影置信度融合得到最终的阴影检测结果. 算法流程如图1所示.
图1 本文算法流程Fig.1 Flow chart of proposed algorithm
(4)
局部窗口内基于相似性的加权平均强度为
(5)
其中Iq为像素点q的灰度值.阴影置信度为
(6)
其中: 参数σ为可调参数, 通常将其设置为0.1, 该值为经验值, 可以将阴影置信度结果限定在合适的范围内;Ip为像素点p的灰度值.通过平均相似性调节阴影置信度得到最终的阴影置信度为
(7)
其中|Np|表示局部邻域内像素点的个数.
由式(6)可以推测: 当局部邻域Np内同时存在阴影像素点和非阴影像素点时, 若p为非阴影像素点, 如图2(A)所示, 则Ip将大于局部邻域内像素的平均强度mp, 使阴影置信度Dp=0; 若p为阴影像素点, 如图2(B)所示, 则Ip将小于局部邻域内像素的平均强度mp, 最终使Dp∈[0,1], 该像素被判断可能为阴影; 当局部邻域内的像素全部是非阴影像素或阴影像素时, 如图2(C),(D)所示, 则mp将接近Ip, 会使阴影置信度接近0, 最终导致误检测.
图2 阴影图像的局部邻域Fig.2 Local neighborhood of shadow image
利用上述公式计算每个像素点的阴影置信度可得如图3所示的阴影检测结果, 其中(A)~(D)为原始图像, (E)~(H)为文献[11]方法检测结果. 本文选用尺寸为140×140的局部邻域窗口计算得到. 但该方法存在下列不足:
1) 当检测窗口能覆盖图像中阴影时, 可检测出完整的图像阴影, 如图3(E),(F)所示, 但当图像中出现面积较大阴影时, 会出现阴影检测不完整的情况, 如图3(G),(H)所示.
2) 虽然可通过人为调节窗口使窗口大于阴影面积从而获得完整的检测结果, 但合适的窗口尺寸很难给出准确估计, 并且人为干预使算法脱离了自动检测的目的.
图3 阴影检测结果Fig.3 Detection results of shadows
为解决上述两个问题, 可使用全局域窗口代替局部邻域窗口, 从而解决阴影检测结果不完整以及需要根据图像阴影人为调节窗口的问题. 本文的全局窗口是将窗口大小扩大至整幅图像. 表1列出了文献[13]算法运行时间与窗口大小的关系. 由表1可见, 阴影置信度算法的运行时间随着窗口的增大而急剧增加, 导致无法使用全局窗口计算阴影置信度. 为解决该问题, 本文利用SLIC(simple linear iterative-clustering)算法先对RGB图像进行超像素分割, 将分割得到的每个像素块视为一个像素点, 再在全局窗口上进行阴影置信度计算.
表1 文献[13]算法运行时间与窗口大小的关系
超像素是指具有相似纹理、 颜色、 亮度等特征的相邻像素构成的有一定视觉意义的不规则像素块, 其利用像素之间特征的相似性将像素分组, 用少量的超像素块代替大量的像素表达图片特征, 极大降低了图像的计算量. 本文采用文献[17]提出的SLIC超像素分割方法对图像进行分割. SLIC超像素分割方法生成的超像素较紧凑, 并且运行速度和轮廓保持的效果都较理想. 图4为由SLIC算法分割得到尺度为79×79,25×25,8×8图片的结果, 其中8×8,25×25,79×79是超像素的分割尺度, 是指平均每个超像素中约有8×8,25×25,79×79个像素点. 超像素中像素点数量较多为大尺度, 像素点数量较少为小尺度, 本文以该规则定义超像素的尺度.
图4 SLIC算法分割结果Fig.4 Segmentation results of SLIC algorithm
不同分割尺度的检测结果如图5所示. 对RGB图像进行超像素分割后再进行阴影置信度的计算, 降低了图像的维度, 减少了阴影置信度计算的数据量. 在超像素上利用色度、 法线、 空间坐标及亮度信息估计图像的阴影置信度, 同时结合全局窗口不仅提高了运行速度, 也解决了图像阴影检测结果不完整的问题. 但如果RGB图像的超像素分割尺度较大, 则会有一些相邻的阴影和非阴影被分割到同一个超像素中, 从而导致阴影检测的误判, 这种情况一般会出现在阴影边缘附近, 并且在阴影边界不明显的软阴影中更明显, 如图5(B)所示; 如果对图像的超像素分割尺度较小, 则一些非阴影区域较暗的超像素点会被误判为阴影, 从而在检测结果中留下更多噪声, 如图5(C)所示.
图5 不同分割尺度的检测结果Fig.5 Detection results of different segmentation scales
为解决上述问题, 本文考虑将多尺度的超像素分割结果进行融合, 综合大尺度和小尺度的超像素阴影置信度给出最终检测结果.
超像素分割的尺度大小及尺度个数的可选择性很多, 不同的选择直接影响检测结果. 因此本文提出如下超像素尺度选取策略. 超像素的最小分割尺度确定为7×7. 同时测试了3×3,5×5,7×7,9×9四种尺度, 9×9尺度的最终检测结果精确度较低, 3×3,5×5,7×7三种尺度的检测精确度接近, 但3×3和5×5两种尺度所消耗时间远大于7×7. 因此, 最终选定7×7为最小分割尺度. 尺度间呈倍数关系, 如7×7,14×14,28×28. 尺度个数确定为5个. 综合考虑检测精度和运算速度约束, 经大量实验验证, 最终发现5个分割尺度(7×7,14×14,28×28,56×56,112×112)检测效果最好.
在融合阶段, 本文考虑使用
(8)
融合获得超像素阴影置信度, 其中Hj(x)表示各尺度的阴影判决结果,bj为每个尺度所对应的权重. 式(8)通过加权和的方式融合各尺度的阴影置信度.
阴影检测问题可视为分类问题, 本文采用Adaboost算法[18]确定权重, Adaboost是一种重要的集成学习技术, 能将分类精度较差的弱分类器增强为分类精度较优的强分类器. 每个尺度超像素阴影判决结果都可视为弱分类器Hj(x), 最终融合得到的阴影检测结果可视为强分类器. Adaboost的核心部分是数据权值的更新和弱分类器权值的计算. 弱分类器的分类效果影响数据权值, 而数据权值又决定弱分类器的权值, 经过迭代计算使分类精度较大的弱分类器具有较高的权值, 而分类精度较小的分类器具有较小的权值.
在训练阶段, 使用Adaboost算法在阴影数据集上选取100组数据进行训练, 每组数据包括一张阴影图像及该图像对应的阴影模板, 将每个样本表示为(xi,yi)(i=1,2,…,N), 其中:xi表示图像的一个像素点;yi表示该像素点的阴影标签(由阴影模板得到),yi∈{0,1}, 1表示阴影, 0表示非阴影;N表示样本的数量, 假设每张图像有460×680个像素点, 则N=460×680×100.对每张训练的阴影图像利用上述方法计算阴影置信度, 并通过二值化得到弱分类器为{H1(xi),H2(xi),H3(xi),H4(xi),H5(xi)}(i=1,2,…,N).本文Adaboost算法框架如下.
1) 输入训练数据(xi,yi)(i=1,2,…,N), 弱分类器为{H1(xi),H2(xi),H3(xi),H4(xi),H5(xi)}(i=1,2,…,N).
2) 初始阶段每个样本赋予相同的权值1/N, 得到初始样本权重分布w1(i)=1/N(i=1,2,…,N).
3) 进行迭代, fort=1∶5:
② 选择误差率最小的弱分类器Hmin, 将其误差率记为emin;
③ 将emin代入a=0.5×ln[(1-emin)/emin], 计算当前弱分类器权值amin, 并输出该分类器与其对应的权值(amin,Hmin(x));
4) 得到每个弱分类器对应的权重{(a1,H1(x)),(a2,H2(x)),(a3,H3(x)),(a4,H4(x)),(a5,H5(x))}.
为验证本文算法的有效性, 选取不同场景的6张图像作为实验对象, 将本文算法与其他算法结果进行视觉对比.图6为本文阴影检测算法与文献[8]、 文献[11]、 文献[13]阴影检测算法估计的结果比较.
图6 不同算法阴影检测结果对比Fig.6 Comparison of shadow detection results of different algorithms
由图6可见: 对于大面积阴影检测(图6中第二行、 第四行、 第五行、 第六行), 文献[13]算法效果较差, 本文算法略好于文献[8]和文献[11]算法; 对于纹理较丰富的场景(图6中第六行), 文献[13]算法效果较差, 文献[11]算法表现一般, 本文算法略好于文献[8]算法, 本文算法较好地抑制了噪声干扰, 这是因为参与融合的尺度较大的超像素阴影置信度具有纹理滤波的效果; 对于边缘不很清晰的软阴影(图6中第三行), 文献[8]算法检测失败, 文献[11]和文献[13]算法检测结果并不完整, 本文算法优势明显; 对于复杂场景阴影(图6中第五行), 文献[8]算法未检测到车辆阴影, 文献[11]算法将车辆误检测为阴影, 文献[13]算法阴影中间出现大面积漏检区域, 本文算法结果与实际阴影分布基本吻合; 对于小块阴影(图6中第七行), 文献[8]和文献[11]算法对于图像中小块树影的检测都有或多或少的缺失, 本文算法与文献[13]算法效果相当.
为考察本文算法的性能, 客观评价阴影检测算法的效果, 本文在SBU数据集[19]和ISTD数据集[11]上对检测精确度和运行速度进行量化对比.
检测精确度定义了准确率(Accuracy)和平衡出错率(balance error rate, BER)[20]两项评价指标, 分别表示为
(9)
(10)
其中TP为估计正确阴影像素点的个数, TN为估计正确非阴影像素点的个数, NP和NN分别为实际阴影像素点个数和实际非阴影像素点个数. Accuracy用于衡量阴影检测准确率, 其越大说明阴影检测的结果越准确. BER用于衡量阴影检测出错率, 其越小表示阴影检测算法的出错率越低.
将本文算法与文献[8]、 文献[11]、 文献[13]算法进行比较, 结果列于表2. 由表2可见, 在两个数据集中本文算法的精确度和错误率略优于文献[8]和文献[11]算法, 明显优于文献[13]算法.
表2 不同算法检测准确率和错误率的对比
在运行时间对比实验中, 从数据集中随机抽取6种尺寸的图像各10张, 计算平均运行时间. 实验环境为: CPU主频2.40 Hz, 内存8 GB, 操作系统Win10 64位. 4种算法的运行时间对比结果列于表3. 由表3可见, 文献[11]算法在检测时间上优势明显, 但检测精度不理想. 本文算法是基于文献[13]算法的改进融合算法, 采用超像素方法使检测时间大幅度减少, 约为原算法的10%, 与文献[8]算法检测时间基本相同.
表3 不同算法的运行时间对比
综上所述, 本文基于文献[13]的算法提出了一种多尺度超像素融合阴影检测算法, 采用全局窗口计算阴影置信度, 解决了文献[13]算法检测窗口尺寸难以给出准确估计的问题, 阴影检测精度和运算速度均得到大幅度提升. 本文算法对于边缘不清晰的软阴影、 复杂场景阴影、 大面积阴影及小块阴影的检测均表现出较好的性能, 与其他算法的对比实验结果表明, 本文算法具有综合优势, 适合在实时性要求较低的场景下对光线复杂环境图像进行前期预处理.