其他分享
首页 > 其他分享> > HOG特征

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[gy​gx​​] 梯度方向范围是[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