Python实现HOG特征提取:了解如何使用 scikit-image 库从 Python 中的图像中提取定向梯度直方图 (HOG) 特征。
定向梯度直方图 (HOG)是计算机视觉和图像处理应用程序中用于目标检测的特征描述符。它是一种计算图像特定部分或感兴趣区域中梯度方向事件的技术。
2005 年,Dalal 和 Triggs 发表了一篇名为Histograms of Oriented Gradients for Human Detection的研究论文。这篇论文发表后,HOG被用在了很多物体检测的应用中。
Python如何实现HOG特征提取?以下是 HOG 最重要的方面:
- HOG 专注于对象的结构。它提取边缘大小以及边缘方向的信息。
- 它使用64x128像素的检测窗口,因此首先将图像转换为
(64, 128)
形状。 - 然后将图像进一步分成小部分,然后计算每个部分的梯度和方向。它被分成8x16 个单元格,50% 重叠,所以总共有7x15 = 105个块,每个块由8x8像素的2x2 个单元格组成。
- 我们取每个块(8x8像素单元)的64 个梯度向量并将它们放入一个9- bin 直方图。
以下是我们在 HOG 特征提取中采取的基本步骤:
Python HOG特征提取教程:调整图像大小
Python HOG特征提取示例:如前所述,如果你有一张宽图像,则将图像裁剪到要应用 HOG 特征提取的特定部分,然后将其调整为适当的形状。
计算梯度
现在调整大小后,我们需要计算 x 和 y 方向的梯度。梯度只是 x 和 y 方向的微小变化,我们需要在图像上卷积两个简单的过滤器。
计算x方向梯度的滤波器为:
以下是我们将此过滤器应用于图像时:
用于计算 y 方向梯度的滤波器为:
以下是我们将此过滤器应用于图像时:
计算幅度
Python HOG特征提取教程:为了计算梯度的大小,使用以下公式:
计算方向
梯度方向由下式给出:让我们举个例子,假设我们有下面的矩阵:
在x轴的梯度将简单地是94-56 = 38,和93-55 = 38在y轴。
量级将是:
梯度方向将是:
Python HOG特征提取示例代码
现在我们了解了理论,让我们来看看如何使用scikit-image库从图像中提取 HOG 特征。
Python实现HOG特征提取:首先,让我们为本教程安装必要的库:
pip3 install scikit-image matplotlib
Python如何实现HOG特征提取?我将在一个可爱的猫图像上执行 HOG ,把它拿到这里并将它放在当前的工作目录中(当然,你可以使用任何你想要的图像)。让我们加载图像并显示它:
#importing required libraries
from skimage.io import imread
from skimage.transform import resize
from skimage.feature import hog
from skimage import exposure
import matplotlib.pyplot as plt
# reading the image
img = imread('cat.jpg')
plt.axis("off")
plt.imshow(img)
print(img.shape)
输出:
(1349, 1012, 3)
调整图像大小:
# resizing image
resized_img = resize(img, (128*4, 64*4))
plt.axis("off")
plt.imshow(resized_img)
print(resized_img.shape)
输出:
(128, 64, 3)
现在我们只需使用hog()
scikit-image 库中的函数:
#creating hog features
fd, hog_image = hog(resized_img, orientations=9, pixels_per_cell=(8, 8),
cells_per_block=(2, 2), visualize=True, multichannel=True)
plt.axis("off")
plt.imshow(hog_image, cmap="gray")
输出:
Python实现HOG特征提取:该hog()
函数以 6 个参数作为输入:
image
:要应用 HOG 特征提取的目标图像。orientations
:我们要创建的直方图中的 bin 数量,原始研究论文使用了 9 个 bin,因此我们将传递 9 作为方向。pixels_per_cell
:决定单元格的大小,前面我们提到过,是8x8。cells_per_block
:每个块的单元数,如前所述,将是2x2。visualize
: 一个布尔值是否返回 HOG 的图像,我们将其设置为True
这样我们就可以显示图像。multichannel
:我们将其设置True
为告诉函数最后一个维度被视为颜色通道,而不是空间。
最后,如果要保存图像:
# save the images
plt.imsave("resized_img.jpg", resized_img)
plt.imsave("hog_image.jpg", hog_image, cmap="gray")
Python HOG特征提取教程总结
Python如何实现HOG特征提取?现在你知道如何借助scikit-image 库在 Python 中执行 HOG 特征提取 。
在此处查看完整代码。