HOG特征
作者:互联网
文章目录
HOG特征
HOG特征( Histogram of Oriented Gradients 方向梯度直方图)是一种在图像上找到特征描述子,主要通过计算和统计图像局部区域的梯度方向直方图来构成特征。来源于cvpr 2015 年论文。
算法流程
1 进行图像预处理
2 计算梯度
1. 图像预处理
1.1 图像灰度化,gamma矫正
我们先读入彩色图像,然后转换成灰度图像,采用gamma校正对输入的图像进行颜色空间的归一化,主要作用是调节图像的对比度,可以降低局部的阴影和光照变换的影响,可以抑制噪音。
图片one.png,是一个64*64的图片。
import cv2
import numpy as np
img = cv2.imread("one.png", 0) # 其中参数0表示以灰度图进行读取;
img1 = np.power(img/float(np.max(img)), 1/1.5)
img2 = np.power(img/float(np.max(img)), 1.5)
cv2.imshow('src', img)
cv2.imshow('gamma=1/1.5', img1)
cv2.imshow('gamma=1.5', img2)
cv2.waitKey()
这是原始图片,灰度图片,不同比例的gamma校正之后的图片。
其中我们将一张灰度图片表示以下的矩阵
np.max(img)=203,img/float(np.max(img))是以下结果。
那么什么是gamma校正?就是将归一化之后的像素值,也就是将0.15763547 的1/1.5,1.5次方,例如0.15763547的1/1.5 次方就等于0.29181165,依次可以计算得出以下值。
2. 计算梯度图
我们需要计算图像的水平和垂直方向的梯度,以刚开始图片为主。
我们以下面像素为例,计算图像的梯度。
计算中心点0.078431375的梯度大小,其中0.078431375(A)的坐标点为(x,y):
水平梯度计算公式是:
g
x
=
(
L
(
x
+
1
,
y
)
−
(
L
(
x
−
1
,
y
)
)
)
2
=
(
0.050980393
−
0.12156863
)
2
=
0.004982699202768169
g_{x}=\sqrt{(L(x+1,y)-(L(x-1,y)))^{2}}=\sqrt{(0.050980393-0.12156863)^{2}}=0.004982699202768169
gx=(L(x+1,y)−(L(x−1,y)))2
=(0.050980393−0.12156863)2
=0.004982699202768169
垂直梯度计算公式:
g
y
=
(
L
(
x
,
y
+
1
)
−
(
L
(
x
,
y
−
1
)
)
)
2
=
(
0.078431375
−
0.07058824
)
2
=
0.000056.151476662822502
g_{y}=\sqrt{(L(x,y+1)-(L(x,y-1)))^{2}}=\sqrt{(0.078431375-0.07058824)^{2}}=0.000056.151476662822502
gy=(L(x,y+1)−(L(x,y−1)))2
=(0.078431375−0.07058824)2
=0.000056.151476662822502
那么梯度幅度计算公式:
g
=
g
x
2
−
g
y
2
g=\sqrt{g_{x}^{2}-g_{y}^{2}}
g=gx2−gy2
梯度方向计算公式:
θ
=
a
r
c
t
a
n
[
g
x
g
y
]
\theta =arctan\left [ \frac{g_{x}}{g_{y}} \right ]
θ=arctan[gygx] 梯度方向范围是[0,180].
根据上面的计算,我们可以调用sobel算子,进行计算。
import cv2
import numpy as np
im = cv2.imread("one.png", 0) # 其中,0表示将图片以灰度读出来。
img = np.float32(im) / 255.0 # 归一化
gx = cv2.Sobel(img, cv2.CV_32F, 1, 0, ksize=3)
gy = cv2.Sobel(img, cv2.CV_32F, 0, 1, ksize=3)
# 计算梯度幅度和方向
mag, angle = cv2.cartToPolar(gx, gy, angleInDegrees=True)
cv2.imshow('src', img)
cv2.imshow("absolute x-gradient",gx)
cv2.imshow("absolute y-gradient",gy)
cv2.imshow("gradient magnitude",mag)
cv2.imshow("gradient direction",angle)
可以看到下图,分别是gx,gy的图像显示,以及幅度和方向的可视化。
这是其中的计算得出的结果。
上面是整个的HOG特征的计算公式,但是因为是整张图片计算的,计算量大,等等一些缺点,所以我们可以选用8x8,4x4的小的cell可以用于计算HOG特征。
这里以16x16作为例子进行展示;
原图是64*64,其中pixels_per_cell=(16, 16),是用来设置cell的大小。
image = cv2.imread('one.png', 0) # 读取图片,有0的话表示转变为灰度图;
image = np.float32(image) / 255.0 # 归一化
fd, hog_image = hog(image,
orientations=8,
pixels_per_cell=(16, 16),
cells_per_block=(1, 1),
visualize=True,
multichannel=False) # multichannel=True是针对3通道彩色;
标签:HOG,img,特征,梯度,cv2,灰度,图像,np 来源: https://blog.csdn.net/xiaoxiao_2446xuxu/article/details/122545893