参考资料:https://www.cnblogs.com/alexme/p/11361563.html
https://blog.csdn.net/qq_43348528/article/details/108638030
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
from skimage import exposure
from skimage.feature import hog
from skimage import data,color,exposure
img = cv.imread("../SampleImages/tifa.jpg", cv.IMREAD_COLOR)
plt.imshow(img[:,:,::-1])
#转换为灰度图
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
plt.imshow(img_gray, plt.cm.gray)
#HoG特征计算
#参考资料:https://www.cnblogs.com/alexme/p/11361563.html
# https://blog.csdn.net/qq_43348528/article/details/108638030
#1. 创建HoG对象
# hog = cv.HOGDescriptor(winSize,blockSize,blockStride,cellSize,nbins)
# winSize:检测窗口大小
# blockStride:block块的滑动步长
# cellSize:cell单元大小
# nbins:统计梯度的方向数目,一般为9,即一个cell统计9个角度范围的梯度直方图
winSize = (64,128)
blockSize = (16,16)
blockStride = (8,8)
cellSize = (8,8)
nbins = 9
hog_obj = cv.HOGDescriptor(winSize, blockSize, blockStride, cellSize, nbins)
#2. 计算HoG特征
# hogDes = hog.compute(img,winStride,padding)
# img:原图
# winStride:检测窗口的滑动步长
# padding:填充,在图像周围填充点的边界处理
# 返回hogDes:对整幅图像的HoG特征描述符
hogDes = hog_obj.compute(img_gray, winStride=(8,8))
#使用OPENCV的HOGDescriptor不能将HOG处理后的梯度直方图结合原图显示
print("HogDes Size:",hogDes.size)
print(hogDes)
#使用skimage
fd,hog_image = hog(img_gray, orientations=8, pixels_per_cell=(16,16), cells_per_block=(1,1), visualize=True)
hog_image_rescaled = exposure.rescale_intensity(hog_image, in_range=(0,0.02))
#叠加HoG梯度直方图到图像上
img_hog_display = img_gray * hog_image_rescaled
plt.figure(figsize=(16,16), dpi=80)
plt.imshow(img_hog_display, plt.cm.gray)