本篇文章3673字,读完约9分钟

据雷锋说。这篇文章的作者,斯琳,原文包含在作者的简写本主页上,还有雷锋。(公开号码:雷锋。com)被授权发布。

本文主要翻译了文章的方向梯度直方图。

特征描述符特征描述符是图像的表示,它提取有用的信息,但丢失不相关的信息。通常,特征描述符将w*h*3(宽和高3,3通道)的图像转换成长度为n的向量/矩阵。例如,对于64*128*3的图像,转换后的输出图像向量的长度可以是3780。

图像学习之如何理解方向梯度直方图(Histogram Of Gradient)

哪些特征是有用的?假设我们要预测图片中衣服上的纽扣,这些纽扣通常是圆的,上面有几个洞,那么你可以用边缘检测器把图片变成只有边缘的图像,这样就可以很容易的辨别出来,所以边缘信息对这张图片是有用的,但是颜色信息是没有用的。好的功能应该能够区分按钮和其他圆形的东西。

图像学习之如何理解方向梯度直方图(Histogram Of Gradient)

在方向梯度直方图中,梯度的方向分布被用作特征。沿着图片的x轴和y轴的渐变是非常有用的,因为边缘和角落的渐变值非常大,我们知道边缘和角落包含了很多物体的形状信息。

图像学习之如何理解方向梯度直方图(Histogram Of Gradient)

(hog特征描述符可能不限于一个长度,但也可以使用许多其他长度,这里只记录一种计算方法。(

如何计算方向梯度直方图?我们将首先用图像的一小块来解释它。

步骤1:预处理的补丁可以是任何大小,但有一个固定的比例。例如,当面片的长宽比为1:2时,面片大小可以是100*200、128*256或1000*2000,但不能是101*205。

这是一张720*475的图片。我们选择一个大小为100*200的补丁来计算猪的特征,从图片中挖掘出这个补丁,然后将大小调整到64*128。

hog _预处理

第二步:计算梯度图像首先,我们计算水平和垂直梯度,然后计算梯度直方图。以下两个核可以用于计算,或者opencv中核大小为1的sobel算子可以直接用于计算。

图像学习之如何理解方向梯度直方图(Histogram Of Gradient)

水平_垂直_梯度_内核

调用opencv代码如下:

//c++gradientcalculation。

//阅读图像

matimg=imread("bolt.png");matimg = im read(" bolt . png ");

img.convertto(img,cv_32f,1/255.0);

//calculategradientsgx,gy

matgx,gy;

sobel(img,gx,cv_32f,1,0,1);sobel(img,gx,cv_32f,1,0,1);

sobel(img,gy,cv_32f,0,1,1);sobel(img,gy,cv_32f,0,1,1);

# pythongradientcalculation

(bolt.png)

im=np.float32(im)/255.0

# calculategradient

gx=cv2.sobel(img,cv2.cv_32f,1,0,ksize=1)gx=cv2.sobel(img,cv2.cv_32f,1,0,ksize=1)

gy=cv2.sobel(img,cv2.cv_32f,0,1,ksize=1)gy=cv2.sobel(img,cv2.cv_32f,0,1,ksize=1)

然后,梯度的振幅g和方向θ由以下公式计算:

渐变方向公式

您可以使用opencv的carttopolar函数来计算:

//c++ calculate gradientmagnitudeadddirection(in grees)

matmag,angle

carttopolar(gx,gy,mag,angle,1);

# pitoncalculategeledintmagnitiudeadddirection(in grees)

mag,angle=cv2.carttopolar(gx,gy,angleindegrees = true)

计算出的梯度图如下:

左侧:X轴梯度绝对值中间:Y轴梯度绝对值右侧:梯度幅度

从上图可以看出,X轴方向的梯度主要突出垂直线,Y轴方向的梯度突出水平梯度,梯度幅度突出像素值的急剧变化。(注意:图像的原点在图像的左上角,X轴是水平的,Y轴是垂直的)

图像学习之如何理解方向梯度直方图(Histogram Of Gradient)

图像的渐变消除了许多不必要的信息(如恒定的背景颜色),并突出了轮廓。换句话说,你可以很容易地在梯度图像中找到某人。

在每个像素点,都有一个大小和方向。对于带有颜色的图片,将在所有三个通道上计算渐变。那么相应的振幅是三个通道上的最大振幅,角度(方向)是对应于最大振幅的角度。

图像学习之如何理解方向梯度直方图(Histogram Of Gradient)

步骤3:计算8*8网格中的梯度直方图。在这一步中,上面的补丁图像将被分成8*8个网格(如下所示),每个网格将计算一个梯度直方图。那为什么要分成8*8?使用特征描述符的一个主要原因是它提供了紧凑的/压缩的表示。8*8图像有8*8*3=192个像素值,每个像素有两个值(大小和方向,这是三个通道中最大的),加起来是8*8*2=128。稍后,我们将看到如何将这128个数字表示为一个由9个数字组成的数组,并带有一个9格直方图。当用直方图表示一个面片时,不仅可以简洁地表示,而且可以更好地抗噪。梯度可能有噪声,但是当用直方图表示时,它对噪声不太敏感。

图像学习之如何理解方向梯度直方图(Histogram Of Gradient)

这个补丁的大小是64*128,它被分成8*8个单元,所以有64/8 * 128/8 = 8*16=128个网格

对于这个64*128的补丁,8*8的网格足够大,可以代表有趣的特征,比如脸、头等等。

直方图是一个有9个面元的向量,代表角度0,20,40,60...160.

让我们先看看每个8*8单元的梯度是什么样的:

中间:带有代表梯度的箭头的网格;右图:带有数字梯度的网格

中间图中的箭头是梯度的方向,长度是梯度的大小。可以发现,箭头的指向方向是像素强度变化的方向,而幅度是强度变化的幅度。

从右边的梯度方向矩阵可以看出,该角度是0-180度,而不是0-360度,这被称为“无符号”梯度,因为梯度和它的负数由相同的数字表示,也就是说,梯度的箭头方向和它旋转180度后的箭头方向被认为是相同的。那为什么不用0-360度呢?结果发现,在行人检测中,无符号梯度优于有符号梯度。一些hog实现允许你指定有符号的渐变。

图像学习之如何理解方向梯度直方图(Histogram Of Gradient)

下一步是为这些8*8网格创建直方图,其中包含9个对应于0,20,40,...160.

下图解释了这一过程。我们使用了上图中网格的梯度幅度和方向。根据方向选择使用哪个箱,并根据二级值确定该箱的大小。首先,看被蓝色圆圈环绕的像素,它的角度是80度,它的二次值是2,所以它将2加到第五个面元,然后看被红色圆圈环绕的像素,它的角度是10度,它的二次值是4度。因为角度10在0-20度之间(正好是一半),振幅被分成两个区间,0和20。

图像学习之如何理解方向梯度直方图(Histogram Of Gradient)

梯度直方图

这里有一个细节需要注意。如果一个角度大于160度,即在160度和180度之间,我们知道0度和180度的角度在这里是相同的。因此,在下面的示例中,当像素角度为165度时,振幅应该按比例放入0和160的箱中。

图像学习之如何理解方向梯度直方图(Histogram Of Gradient)

当角度大于160°时,

将8*8单元格中的所有像素添加到9个面元中,并构建一个9面元直方图。对应于上面网格的直方图如下:

8*8网格直方图

这里,在我们的表示中,y轴是0度(从上到下)。您可以看到有许多值分布在0,180的面元中,这实际上意味着网格中的许多梯度方向不是向上就是向下。

步骤4:16 * 16块的标准化

在上面的步骤中,我们创建了一个基于图片的梯度直方图,但是一个图片的梯度对整个图片的光线很敏感。如果将所有像素除以2,梯度的幅度将减半,直方图中的值也将减半,因此光的影响无法消除。因此,理想情况下,我们希望我们的特征描述符独立于光变换,因此我们希望我们的直方图被归一化,以便不受光变化的影响。

图像学习之如何理解方向梯度直方图(Histogram Of Gradient)

考虑用l2归一化向量的步骤:

v = [128,64,32]

[(128^2)+(64^2)+(32^2)]^0.5=146.64

将V中的每个元素除以146.64,得到[0.87,0.43,0.22]

考虑另一个向量2*v,归一化后,我们可以得到向量仍然是[0.87,0.43,0.22]。你可以理解规范化去除了尺度。

您可能希望直接对9*1的直方图进行归一化,这没问题,但是更好的方法是从16*16的块进行归一化,也就是说,将4个9*1的直方图组合成一个36*1的向量,然后进行归一化,然后将窗口向后移动8个像素(参见运动图像)。重复这个过程,遍历整个图片。

图像学习之如何理解方向梯度直方图(Histogram Of Gradient)

hog-16x 16-块标准化

第五步:计算hog特征向量为了计算整个面片的特征向量,所有36*1的向量需要组合成一个巨大的向量。矢量大小可以计算如下:

我们有多少个16*16街区?有7个水平运动和15个垂直运动,总共7*15=105个运动。

每个16*16的块代表一个36*1的向量。所以把它们放在一起,就是,36*105=3780维向量。

通常,hog特征描述符在一个8*8的网格中绘制一个9*1的归一化直方图,如下图所示。你可以发现直方图的主要方向捕捉了这个人的形象,尤其是躯干和腿。

图像学习之如何理解方向梯度直方图(Histogram Of Gradient)

可视化_直方图

雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。

标题:图像学习之如何理解方向梯度直方图(Histogram Of Gradient)

地址:http://www.hcsbodzyz.com/hcxw/5803.html