如何在Python中应用HOG特征提取?详细实现

2021年11月11日02:41:34 发表评论 2,238 次浏览

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 直方图。

如何在Python中应用HOG特征提取?详细实现以下是我们在 HOG 特征提取中采取的基本步骤:

Python HOG特征提取教程:调整图像大小

Python HOG特征提取示例:如前所述,如果你有一张宽图像,则将图像裁剪到要应用 HOG 特征提取的特定部分,然后将其调整为适当的形状。

计算梯度

现在调整大小后,我们需要计算 x 和 y 方向的梯度。梯度只是 x 和 y 方向的微小变化,我们需要在图像上卷积两个简单的过滤器。

计算x方向梯度的滤波器为:

如何在Python中应用HOG特征提取?详细实现以下是我们将此过滤器应用于图像时:

如何在Python中应用HOG特征提取?详细实现用于计算 y 方向梯度的滤波器为:

如何在Python中应用HOG特征提取?详细实现以下是我们将此过滤器应用于图像时:

如何在Python中应用HOG特征提取?详细实现

计算幅度

Python HOG特征提取教程:为了计算梯度的大小,使用以下公式:

如何在Python中应用HOG特征提取?详细实现
如何在Python中应用HOG特征提取?详细实现

计算方向

梯度方向由下式给出:如何在Python中应用HOG特征提取?详细实现让我们举个例子,假设我们有下面的矩阵:

如何在Python中应用HOG特征提取?详细实现在x轴的梯度将简单地是94-56 = 38,和93-55 = 38在y轴。

量级将是:

如何在Python中应用HOG特征提取?详细实现梯度方向将是:如何在Python中应用HOG特征提取?详细实现

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)
如何在Python中应用HOG特征提取?详细实现

调整图像大小:

# resizing image
resized_img = resize(img, (128*4, 64*4))
plt.axis("off")
plt.imshow(resized_img)
print(resized_img.shape)

输出:

(128, 64, 3)

如何在Python中应用HOG特征提取?详细实现现在我们只需使用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特征提取?详细实现

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 特征提取 。

在此处查看完整代码。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: