来源:投稿 作者:小灰灰
编辑:学姐
HOG特征
HOG特征( Histogram of Oriented Gradients 方向梯度直方图)是一种在图像上找到特征描述子,主要通过计算和统计图像局部区域的梯度方向直方图来构成特征。来源于cvpr2015 年论文。
算法流程
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):
水平梯度计算公式是:
垂直梯度计算公式:
那么梯度幅度计算公式:
梯度方向计算公式:
根据上面的计算,我们可以调用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通道彩色;
关注下方《学姐带你玩AI》🚀🚀🚀
回复“CVPR”获取更多经典+前沿必读论文
码字不易,欢迎大家点赞评论收藏!