news 2026/5/19 7:06:21

计算机视觉中的方向梯度直方图(HOG)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
计算机视觉中的方向梯度直方图(HOG)

原文:towardsdatascience.com/histogram-of-oriented-gradients-hog-in-computer-vision-a2ec66f6e671

简介

方向梯度直方图最初由 Navneet Dalal 和 Bill Trigs 在他们 CVPR 论文[“方向梯度直方图用于人类检测”]中提出。

根据它关注的特征类型,如纹理、颜色或形状,以及它描述的是整个图像还是局部信息,有许多不同的特征提取算法。

HOG 算法是特征提取中最基本的技术之一,因为它是对象检测和识别任务的基础步骤。

在本文中,我们将探讨 HOG 算法的原理和实现。


什么是方向梯度直方图(HOG)?

HOG 是一种全局描述符(特征提取)方法,应用于图像中的每个像素,以提取邻域信息(像素的邻域)如纹理,并将从给定图像中压缩/抽象这些信息到一个称为特征向量的简化/浓缩向量形式,该向量可以描述此图像的特征,这在捕捉图像中的边缘和梯度结构时非常有用。此外,我们可以比较处理后的图像以进行对象识别或对象检测。

HOG 解释

1- 计算梯度图像

为了提取和捕获边缘信息,我们应用由两个小矩阵(滤波器/核)组成的 Sobel 算子,这些矩阵测量灰度中的强度差异( wherever there is a sharp change in intensity)。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/bd8fb2856cf031b46bb320c3ff6e99bb.png

作者创作

我们通过卷积将此核应用于图像的像素:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/34d57e5fa6c3297d9c99f05bfbc8dcb6.png

我们使用 3×3 核/滤波器(Sobel 算子)在图像上滑动,逐元素相乘,并将输出相加。(作者创作)

在对图像应用 Sobel 核之后,我们可以计算图像的幅度和方向:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1a88d20b2eddf73927fd55f1df39c2fd.png

梯度幅度。(作者创作)

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1aadf6517d4aa49eff14ef25f4eea60d.png

梯度方向。(作者创作)

梯度确定了特定点的边缘强度(幅度)和方向(方向)。边缘方向与梯度向量在该点计算位置的方向垂直。换句话说,向量的长度和方向。

2- 计算梯度直方图

对于每个像素,我们有两个值:幅度和方向。为了将此信息组合成有意义的东西,我们使用直方图,这有助于有效地组织和解释这些值。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/dd4db3efb6b467b121a490227b9631ec.png

learnopencv.com/histogram-of-oriented-gradients/,由作者编辑。

我们在这些单元格(8×8)中创建梯度直方图,这些单元格有 64 个值分布在直方图的桶中,每个桶量化为 9 个桶,每个桶为 20 度(跨越 0°到 180°)。每个像素的幅度值(边缘强度)被添加为对应方向的“投票”,以便直方图的峰值揭示了像素的主导方向。

3-归一化

由于梯度幅度取决于光照条件,归一化将直方图缩放以减少光照和对比度变化的影响。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/23adac6f4e90263794c513e3316ebd5d.png

learnopencv.com/histogram-of-oriented-gradients/,由作者编辑。

每个块通常由一个网格状的单元格(2×2)组成。这个块在图像上滑动时会有重叠,意味着每个单元格都包含在多个块中。每个块有 4 个直方图(4 个单元格),这些直方图可以连接起来形成一个 4(单元格)x 9(桶)x 1 的向量=每个块 36 x 1 元素向量;示例中的整体图像:7 行 x 15 列=7x15x36=3780 个元素。这个特征向量被称为HOG 描述符,生成的向量被用作分类算法(如 SVM)的输入。

# we will be using the hog descriptor from skimage since it has visualization tools available for this exampleimportcv2importmatplotlib.pyplotaspltfromskimageimportcolor,feature,exposure# Load the imageimg=cv2.imread('The path of the image ..')# Convert the original image to RGBimg_rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)# Convert the original image to gray scaleimg_gray=cv2.cvtColor(img_rgb,cv2.COLOR_RGB2GRAY)plt.imshow(img_gray,cmap="gray")# These are the usual main parameters to tune in the HOG algorithm.(H,Himage)=feature.hog(img_gray,orientations=9,pixels_per_cell=(8,8),cells_per_block=(2,2),visualize=True)Himage=exposure.rescale_intensity(Himage,out_range=(0,255))Himage=Himage.astype("uint8")fig=plt.figure(figsize=(15,12),dpi=80)plt.imshow(Himage)

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d22443a22954f1963f67b28fe070fba8.png

莫娜丽莎图片由(WikiImages 用户 wikiimages-1897/)提供)pixabay.com/

如您所见,HOG 有效地捕捉了人脸的一般形状(眼睛、鼻子、头部)和手。这是由于 HOG 专注于图像中的梯度信息,使其在检测线条和形状方面非常有效。此外,我们还可以观察到图像中每个点的占主导地位的梯度和它们的强度。

(HOG)图像中人体检测算法

HOG 是计算机视觉中流行的特征描述符,特别适用于检测形状和轮廓,例如人体形状。此代码利用 OpenCV 内置的 HOG 描述符和专门训练用于检测人体的预训练支持向量机(SVM)模型。

# Load the imageimg=cv2.imread('The path of the image ..')# Convert the original image to RGBimg_rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)# Convert the original image to gray scaleimg_gray=cv2.cvtColor(img_rgb,cv2.COLOR_RGB2GRAY)#Initialize the HOG descriptor and set the default SVM detector for peoplehog=cv2.HOGDescriptor()hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())# Detect people in the image using the HOG descriptorbbox,weights=hog.detectMultiScale(img_gray,winStride=(2,2),padding=(10,10),scale=1.02)# Draw bounding boxes around detected peoplefor(x,y,w,h)inbbox:cv2.rectangle(img_rgb,(x,y),(x+w,y+h),(255,0,0),4)plt.imshow(img_rgb)

在加载测试图像后,我们使用 HOG 的 detectMultiScale 方法来检测人物,winStride 设置为每步跳过一个像素,通过牺牲一点精度来提高速度,这在目标检测中至关重要,因为这是一个计算密集型过程。尽管检测器可能识别出所有人,但有时会出现误报,即一个人的身体部分被检测为另一个人。为了解决这个问题,我们可以应用非极大值抑制(NMS)来消除重叠的边界框,尽管不良的配置(winStride、填充、缩放)有时会偶尔无法检测到对象。

总结

总结 HOG 描述符的计算涉及几个步骤:

  1. 梯度计算

  2. 姿态分箱

    1. 描述符块

    2. 归一化

    3. 特征向量形成 在这篇文章中,我们探讨了 HOG 背后的数学原理以及如何通过 OpenCV 在几行代码中轻松应用,这要归功于 OpenCV!希望您觉得这个指南有用,并且喜欢通过这些概念进行工作。感谢阅读,我们下次再见!

参考文献

  • L. Daudet, B. Izrar, 和 R. Motreff, 用于人类检测的定向梯度直方图,2010,HAL 开放科学。

  • Satya Mallick, 图像识别和目标检测:第一部分,2016,学习 OpenCV。

  • Satya Mallick, 使用 OpenCV 解释的定向梯度直方图,2016,学习 OpenCV

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 22:48:45

在单个端点上托管多个 LLM

原文:towardsdatascience.com/hosting-multiple-llms-on-a-single-endpoint-32eda0201832 https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/2c603a8fe76e81bae1c68289871e0a57.png 图片来自Unsplash的**Michael Dziedzic 过去…

作者头像 李华
网站建设 2026/5/18 14:50:14

医疗问答系统开发利器:Kotaemon RAG框架实测

医疗问答系统开发利器:Kotaemon RAG框架实测 在医疗AI领域,一个看似简单的患者提问——“我有糖尿病,能吃西瓜吗?”——背后却藏着巨大的技术挑战。通用大模型可能会给出模棱两可的回答,甚至引用不存在的医学依据。而真…

作者头像 李华
网站建设 2026/5/3 17:05:58

24、Kubernetes 持续交付与 Pod 管理全解析

Kubernetes 持续交付与 Pod 管理全解析 1. 镜像拉取策略 Kubernetes 通过 imagePullPolicy 决定是否拉取镜像,其默认值为 IfNotPresent ,具体策略如下: | 策略 | 描述 | | ---- | ---- | | IfNotPresent | 如果节点上不存在镜像,kubelet 会拉取镜像。若镜像标签为…

作者头像 李华
网站建设 2026/5/16 21:46:36

28、在AWS和GCP上部署和升级Kubernetes

在AWS和GCP上部署和升级Kubernetes 1. AWS EKS中使用Network Load Balancer(NLB) EKS已经开始支持使用Network Load Balancer(NLB),它是AWS中L4负载均衡器的新版本。要使用NLB,需要添加额外的注解,示例如下: metadata:name: nginx-externalannotations:service.bet…

作者头像 李华
网站建设 2026/5/13 15:31:51

Kotaemon能否替代传统的规则型对话系统?

Kotaemon能否替代传统的规则型对话系统? 在企业智能化服务不断深化的今天,客服系统正面临一场静默却深刻的变革。过去依赖人工编写成千上万条匹配规则、用状态机驱动对话流转的“硬编码”方式,已经难以应对用户日益复杂多变的语言表达和业务需…

作者头像 李华
网站建设 2026/5/16 15:04:20

Bamtone班通:金相显微镜可检测PCB中的哪些缺陷?

金相显微镜在PCB制造中主要用于切片观察和质量控制,贯穿来料检验、制程监控和失效分析全流程。 通过对PCB截面和表面细节的放大观察,可以评估层压、孔金属化、焊接等关键工序的可靠性,特别适合做切片后的定性和定量分析。作为国内领先的PCB测…

作者头像 李华