转自 | 新机器视觉
1.颜色特征提取
计算机视觉的特征提取算法研究至关重要。在一些算法中,一个高复杂度特征的提取可能能够解决问题(进行目标检测等目的),但这将以处理更多数据,需要更高的处理效果为代价。而颜色特征无需进行大量计算。只需将数字图像中的像素值进行相应转换,表现为数值即可。因此颜色特征以其低复杂度成为了一个较好的特征。
在图像处理中,我们可以将一个具体的像素点所呈现的颜色分多种方法分析,并提取出其颜色特征分量。比如通过手工标记区域提取一个特定区域(region)的颜色特征,用该区域在一个颜色空间三个分量各自的平均值表示,或者可以建立三个颜色直方图等方法。下面我们介绍一下颜色直方图和颜色矩的概念。
(1)颜色直方图:
颜色直方图用以反映图像颜色的组成分布,即各种颜色出现的概率。Swain和Ballard最先提出了应用颜色直方图进行图像特征提取的方法[40],首先利用颜色空间三个分量的剥离得到颜色直方图,之后通过观察实验数据发现将图像进行旋转变换、缩放变换、模糊变换后图像的颜色直方图改变不大,即图像直方图对图像的物理变换是不敏感的。因此常提取颜色特征并用颜色直方图应用于衡量和比较两幅图像的全局差。另外,如果图像可以分为多个区域,并且前景与背景颜色分布具有明显差异,则颜色直方图呈现双峰形。
颜色直方图也有其缺点:由于颜色直方图是全局颜色统计的结果,因此丢失了像素点间的位置特征。可能有几幅图像具有相同或相近的颜色直方图,但其图像像素位置分布完全不同。因此,图像与颜色直方图得多对一关系使得颜色直方图在识别前景物体上不能获得很好的效果。
考虑到颜色直方图的以上问题,主色调直方图便产生了。所谓主色调直方图基于假设少数几个像素的值能够表示图像中的绝大部分像素,即出现频率最高的几个像素被选为主色,仅用主色构成的主色调直方图描述一幅图像。这样的描述子并不会降低通过颜色特征进行匹配的效果,因为从某种角度将,频度出现很小的像素点可以被视为噪声。
(2)颜色矩:
颜色矩是一种有效的颜色特征,由Stricker和Orengo提出[41],该方法利用线性代数中矩的概念,将图像中的颜色分布用其矩表示。利用颜色一阶矩(平均值Average)、颜色二阶矩(方差Variance)和颜色三阶矩(偏斜度Skewness)来描述颜色分布。与颜色直方图不同,利用颜色矩进行图像描述无需量化图像特征。由于每个像素具有颜色空间的三个颜色通道,因此图像的颜色矩有9个分量来描述。由于颜色矩的维度较少,因此常将颜色矩与其他图像特征综合使用。
(3)颜色集:
以上两种方法通常用于两幅图像间全局或region之间的颜色比较、匹配等,而颜色集的方法致力于实现基于颜色实现对大规模图像的检索。颜色集的方法由Smith和Chang提出[42],该方法将颜色转化到HSV颜色空间后,将图像根据其颜色信息进行图像分割成若干region,并将颜色分为多个bin,每个region进行颜色空间量化建立颜色索引,进而建立二进制图像颜色索引表。为加快查找速度,还可以构造二分查找树进行特征检索。
2.纹理特征提取
一幅图像的纹理是在图像计算中经过量化的图像特征。图像纹理描述图像或其中小块区域的空间颜色分布和光强分布。纹理特征的提取分为基于结构的方法和基于统计数据的方法。一个基于结构的纹理特征提取方法是将所要检测的纹理进行建模,在图像中搜索重复的模式。该方法对人工合成的纹理识别效果较好。但对于交通图像中的纹理识别,基于统计数据的方法效果更好。
(1)LBP特征
LBP方法(Local binary patterns)是一个计算机视觉中用于图像特征分类的一个方法。LBP方法在1994年首先由T. Ojala, M.Pietikäinen, 和 D. Harwood 提出[43][44],用于纹理特征提取。后来LBP方法与HOG特征分类器联合使用,改善了一些数据集[45]上的检测效果。
对LBP特征向量进行提取的步骤如下:
首先将检测窗口划分为16×16的小区域(cell),对于每个cell中的一个像素,将其环形邻域内的8个点(也可以是环形邻域多个点,如图 3‑4. 应用LBP算法的三个邻域示例所示)进行顺时针或逆时针的比较,如果中心像素值比该邻点大,则将邻点赋值为1,否则赋值为0,这样每个点都会获得一个8位二进制数(通常转换为十进制数)。然后计算每个cell的直方图,即每个数字(假定是十进制数)出现的频率(也就是一个关于每一个像素点是否比邻域内点大的一个二进制序列进行统计),然后对该直方图进行归一化处理。最后将得到的每个cell的统计直方图进行连接,就得到了整幅图的LBP纹理特征,然后便可利用SVM或者其他机器学习算法进行分类了。
(2)灰度共生矩阵
灰度共生矩阵是另一种纹理特征提取方法,首先对于一幅图像定义一个方向(orientation)和一个以pixel为单位的步长(step),灰度共生矩阵T(N×N),则定义M(i,j)为灰度级为i和j的像素同时出现在一个点和沿所定义的方向跨度步长的点上的频率。其中N是灰度级划分数目。由于共生矩阵有方向和步长的组合定义,而决定频率的一个因素是对矩阵有贡献的像素数目,而这个数目要比总共数目少,且随着步长的增加而减少。因此所得到的共生矩阵是一个稀疏矩阵,所以灰度级划分N常常减少到8级。如在水平方向上计算左右方向上像素的共生矩阵,则为对称共生矩阵。类似的,如果仅考虑当前像素单方向(左或右)上的像素,则称为非对称共生矩阵。
[43]T. Ojala, M. Pietikäinen, and D. Harwood (1994), "Performance evaluation of texture measures with classification based on Kullback discrimination of distributions", Proceedings of the 12th IAPR International Conference on Pattern Recognition (ICPR 1994), vol. 1, pp. 582 - 585. [44] T. Ojala, M. Pietikäinen, and D. Harwood (1996), "A Comparative Study of Texture Measures with Classification Based on Feature Distributions", Pattern Recognition, vol. 29, pp. 51-59. [45] Xiaoyu Wang, Tony X. Han, Shuicheng Yan,"An HOG-LBP Human Detector with Partial Occlusion Handling", ICCV 2009
3.边缘特征提取
边缘检测是图形图像处理、计算机视觉和机器视觉中的一个基本工具,通常用于特征提取和特征检测,旨在检测一张数字图像中有明显变化的边缘或者不连续的区域,在一维空间中,类似的操作被称作步长检测(step detection)。边缘是一幅图像中不同屈原之间的边界线,通常一个边缘图像是一个二值图像。边缘检测的目的是捕捉亮度急剧变化的区域,而这些区域通常是我们关注的。在一幅图像中两度不连续的区域通常是以下几项之一:
# 图像深度不连续处
# 图像(梯度)朝向不连续处
# 图像光照(强度)不连续处
# 纹理变化处
理想情况下,对所给图像应用边缘检测器可以得到一系列连续的曲线,用于表示对象的边界。因此应用边缘检测算法所得到的结果将会大大减少图像数据量,从而过滤掉很多我们不需要的信息,留下图像的重要结构,所要处理的工作即被大大简化。然而,从普通图片上提取的边缘往往被图像的分割所破坏,也就是说,检测到的曲线通常不是连续的,有一些边缘曲线段开,就会丢失边缘线段,而且会出现一些我们不感兴趣的边缘。这就需要边缘检测算法的准确性。下面介绍两个本文实现的边缘检测算法:canny算子和sobel算子进行边缘检测。
(1)Canny算子边缘检测
Canny边缘检测算法基于一个多阶边缘算子,是由John F. Canny于1986年首先提出的[46],他不但给出了边缘检测的方法,也提出了边缘检测的计算理论。
Canny边缘检测器使用一个基于高斯模型派生的检测模型,因为未处理图像可能含有噪声,所以开始在原始图像上应用一个高斯滤波器,结果是一个轻度平滑的图像,以至于不至于被单个噪声像素干扰全局重要参数。
以一个5×5的高斯滤波模板为例(见公式3-7),对图像A应用高斯滤波可得B。下面对图像的光强梯度统计都基于图B。
一幅图像中的边缘可能在方向上各有所异,所以Canny算法用四个滤波器分别检测图像中的水平、垂直和对角线边缘。边缘检测器(如 Roberts, Prewitt, Sobel)值返回一个水平方向分量Gx和竖直方向分量Gy,由此边缘梯度和方向即可确定:
所有边缘的角度都在上述选定的四个方向(0°,45°,90°,135°)周围。下一步通过滞后性门限跟踪边缘线。
与小的光强梯度相比,数值较大的光强梯度更容易作为边缘线。在大多数图像中定义一个门限值来确定光强梯度取值多少适合作为边缘线通常是不可行的,因此Canny算法使用滞后作用确定门限值。该方法使用两个门限分别定义高低边界。假设所有的边缘应该不受噪声影响而且是连续的曲线。因此我们设置一个高门限用于判定确定是边缘的曲线,再由此出发,利用方向信息跟踪那些可追踪的图像边缘。当追踪该边缘时,应用低门限可以让我们追踪那些含有边缘的区域直到找到下一个曲线的起点。
如图 3‑5所示,(a)为原图的灰度图,(b)为高斯滤波平滑图,(c)和(d)分别是手动设置的高低门限值如图所示的canny边缘检测结果。根据多组图像数据测试发现,当canny高低门限值分别设置为50,150时能够保证大部分有效信息的保留且不会有过多冗余信息。因此后文中采用门限值[Thres1,Thres2]= 50,120 作为canny边缘检测参数。Opencv中以下代码实现:
cvCanny( dst,src, 50, 120, 3 );
(2)Sobel算子边缘检测
和Canny算子类似,Sobel算子[47]也是利用梯度信息对图像进行边缘检测的。对图像进行边缘检测时,计算每个像素的梯度并给出不同方向从明到暗的最大变化及其变化率。这个结果显示出图片在该点亮度变化为“急剧”还是“平滑”,由此可以判断该区域成为边缘的概率。在实际操作中,这个成为边缘的可能性(称为magnitude)计算比计算方向更为可靠,也更为便捷。在图像中的每个像素点,梯度向量只想亮度增长最大的方向,该梯度向量的长度对应于该方向的光强变化率。这就说明在同一像素图像上一个区域的某点的sobel算子是一个零向量,而且在边缘线上的点上有一组向量值为亮度梯度。
数学上在原图像上应用3×3的掩膜计算水平和垂直两个方向的变化梯度近似值。如果我们定义A为源图像,和分别作为一幅图像的水平近似梯度和垂直近似梯度,计算方式如下:
式3-9中,*表示二维卷积运算。这里建立的坐标系在x坐标方向向右,y坐标方向向下,在图像中的每个点,用式3-8描述总梯度大小及方向。用Sobel算子进行边缘检测结果见图 3‑6所示。