介绍
- HOG特征算子是在深度学习之前非常流行的一种图像特征提取技术,全称为Histogram of Oriented Gradients—方向梯度直方图
- 运用对图像局部的梯度幅值和方向进行统计,形成具有梯度特性的直方图,将图像分成很多的block,并将得到的局部特征进行拼接
算法流程
图像处理
运用Gamma公式对图像
Gamma公式
图像展示
import cv2
import numpy as np
from matplotlib import pyplot as plt
img =cv2.imread('../input/webarebear/timg.jpg',0)
img =cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
img2 =np.power(img/float(np.max(img)),1/2.2)
plt.imshow(img2)
plt.axis('off')
plt.show()
原图
好像没啥区别
计算图像梯度
- 水平梯度
- 竖直梯度
- 幅值
- 可化简为
- 梯度与边缘方向–如图
代码
import cv2
import numpy as np
img =cv2.imread('../input/webarebear/timg.jpg')
img =np.float32(img)/255.0
# 归一化
# 计算x y方向的梯度
dx =cv2.Sobel(img,cv2.CV_32F,1,0,ksize=1)
dy =cv2.Sobel(img,cv2.CV_32F,0,1,ksize=1)
# 计算和梯度的幅值和方向
mag,angle = cv2.cartToPolar(dx,dy,angleInDegrees=True)
# print(mag,angle)
计算梯度直方图
计算方法
- 最后得到
BLOCK归一化
目的
- 为了削弱光照的影响
计算
每个数/每个数的平方和开根
代码实践
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
if __name__ == '__main__':
src = cv.imread("../input/dalaoheying/dalaoheying.jpg")
# cv.imshow("input", src)
plt.imshow(src)
plt.show()
hog = cv.HOGDescriptor()
hog.setSVMDetector(cv.HOGDescriptor_getDefaultPeopleDetector())
# Detect people in the image
(rects, weights) = hog.detectMultiScale(src,
winStride=(2,4),
padding=(8, 8),
scale=1.2,
useMeanshiftGrouping=False)
for (x, y, w, h) in rects:
cv.rectangle(src, (x, y), (x + w, y + h), (0, 255, 0), 2)
# cv.imshow("hog-detector", src)
plt.imshow(src)
cv.imwrite("hog-detector.jpg",src)
plt.show()
效果有待加强