当前位置: 首页 > article >正文

HOG特征可视化:不用深度学习也能看懂图像特征(OpenCV+Matplotlib教程)

HOG特征可视化不用深度学习也能看懂图像特征OpenCVMatplotlib教程当你第一次看到HOG特征这个词时可能会联想到猪的鼻子或是某种动物特征。但实际上HOGHistogram of Oriented Gradients是计算机视觉领域一种经典的特征描述方法它能像X光机一样透视图像的结构信息。本文将带你用PythonOpenCVMatplotlib三件套通过可视化方式一步步拆解HOG特征的工作原理即使没有深厚的数学基础也能直观理解这个影响深远的特征提取技术。1. 从图像到梯度HOG的视觉基础任何图像处理技术的起点都是理解像素之间的关系。想象你站在山顶俯瞰地形——山脊的走向、坡度的陡缓决定了地形的特征。HOG特征正是通过捕捉图像中类似的地形信息来描述物体轮廓。1.1 梯度图像的地形图用OpenCV计算梯度就像给图像做CT扫描。以下代码展示如何获取图像的梯度幅值和方向import cv2 import numpy as np # 读取图像并转为灰度 image cv2.imread(pedestrian.jpg) gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 计算x和y方向梯度 gx cv2.Sobel(gray, cv2.CV_32F, 1, 0, ksize1) gy cv2.Sobel(gray, cv2.CV_32F, 0, 1, ksize1) # 计算梯度幅值和方向(角度) mag, angle cv2.cartToPolar(gx, gy, angleInDegreesTrue)用Matplotlib可视化这些梯度可以明显看到物体的边缘轮廓import matplotlib.pyplot as plt plt.figure(figsize(12,4)) plt.subplot(131), plt.imshow(gray, cmapgray), plt.title(原图) plt.subplot(132), plt.imshow(mag, cmapjet), plt.title(梯度幅值热图) plt.subplot(133), plt.imshow(angle, cmaphsv), plt.title(梯度方向) plt.show()提示梯度方向图中不同颜色代表不同角度范围HSV色彩空间能很好展示角度信息1.2 为什么梯度比像素更有用光照不变性即使光照条件变化物体的边缘梯度相对稳定结构表达梯度方向揭示了物体轮廓走向降维优势64x128的图像有8192个像素值但梯度特征只需3780维下表对比了不同图像表示方法的特点表示方法数据量对光照敏感度语义表达能力原始像素高极高低颜色直方图低高中HOG特征中低高2. 细胞单元HOG的构建模块将图像分割为8x8的小细胞单元(cell)是HOG特征的关键步骤。就像用马赛克拼图每个小瓷砖都承载着局部信息。2.1 创建梯度直方图每个cell内的梯度方向被量化为9个区间(bins)这个过程就像把360度的罗盘简化为9个主要方向# 可视化单个cell的梯度分布 cell_mag mag[0:8, 0:8] cell_angle angle[0:8, 0:8] hist, bins np.histogram(cell_angle, bins9, range(0,180), weightscell_mag) plt.bar(bins[:-1], hist, width20) plt.xlabel(梯度方向(度)), plt.ylabel(梯度幅值累加) plt.title(8x8 Cell的梯度直方图)2.2 双线性插值让特征更平滑HOG使用双线性插值将梯度幅值分配到相邻的bin中这就像把一杯水分给相邻的两个杯子计算当前梯度方向到两个最近bin中心的距离比按距离反比分配梯度幅值特别处理0°和180°的边界情况def assign_to_bins(angle, magnitude, nbins9): bin_width 180 / nbins bin_center bin_width * (0.5 np.arange(nbins)) # 找到最近的两个bin diffs np.abs(angle - bin_center) diffs np.minimum(diffs, 180 - diffs) # 处理环形特性 closest np.argmin(diffs) second_closest (closest 1) % nbins if angle bin_center[closest] else (closest - 1) % nbins # 按距离分配权重 total_dist bin_width dist_to_closest np.abs(angle - bin_center[closest]) weight_closest (total_dist - dist_to_closest) / total_dist return [(closest, weight_closest*magnitude), (second_closest, (1-weight_closest)*magnitude)]3. 块归一化HOG的稳定秘诀单独的cell特征对光照变化敏感就像相机在不同亮度下拍出的照片差异很大。HOG通过块(block)归一化解决这个问题。3.1 局部对比度归一化一个block包含2x2个cell对其36维特征向量进行L2归一化def normalize_block(block_features, epsilon1e-5): norm np.sqrt(np.sum(block_features**2) epsilon**2) return block_features / norm注意添加小epsilon防止除以零3.2 重叠块带来的鲁棒性HOG采用滑动窗口方式计算block步长通常为8像素(1个cell)这会产生大量重叠每个cell会出现在多个block中最终特征具有位置冗余性增强了对微小位置变化的鲁棒性下表展示了不同block设置对行人检测效果的影响INRIA数据集Block大小步长特征维度检测准确率16x168378089.2%16x1616176486.7%32x321690082.1%4. 完整HOG特征可视化虽然OpenCV没有直接提供HOG可视化函数但我们可以用Matplotlib自制可视化工具。4.1 绘制HOG特征图def visualize_hog(image, hog_features, cell_size(8,8), block_size(2,2)): num_cells_x image.shape[1] // cell_size[1] num_cells_y image.shape[0] // cell_size[0] # 为每个cell创建箭头 max_len cell_size[0] // 2 hog_image np.zeros_like(image) for y in range(num_cells_y): for x in range(num_cells_x): start_x x * cell_size[1] cell_size[1] // 2 start_y y * cell_size[0] cell_size[0] // 2 for b in range(9): angle b * 20 # 0,20,40,...160 length hog_features[y,x,b] * max_len end_x start_x length * np.cos(np.deg2rad(angle)) end_y start_y length * np.sin(np.deg2rad(angle)) cv2.line(hog_image, (int(start_x), int(start_y)), (int(end_x), int(end_y)), 255, 1) return hog_image4.2 实际应用对比将HOG特征应用于行人检测时你会发现正样本行人的HOG特征呈现明显的对称结构负样本背景的HOG特征分布杂乱无章头部和肩部区域通常有强烈的垂直梯度腿部区域呈现交替的梯度方向# 比较行人和背景的HOG特征 positive cv2.imread(person.jpg, 0) negative cv2.imread(background.jpg, 0) hog cv2.HOGDescriptor() pos_feat hog.compute(positive) neg_feat hog.compute(negative) plt.figure(figsize(10,5)) plt.subplot(121), plt.imshow(visualize_hog(positive, pos_feat.reshape(-1,9)), cmapgray) plt.subplot(122), plt.imshow(visualize_hog(negative, neg_feat.reshape(-1,9)), cmapgray)5. HOG特征实战技巧在实际项目中应用HOG特征时这些小技巧能帮你避开常见陷阱图像尺寸标准化检测窗口保持固定宽高比如1:2Gamma校正对图像进行非线性亮度调整I I**0.5边缘填充处理边界cell时适当padding多尺度检测通过图像金字塔处理不同大小物体特征压缩对最终特征进行PCA降维加速分类# 完整的HOG特征提取流程 def extract_hog_features(image_path, resize_to(64,128)): image cv2.imread(image_path) image cv2.resize(image, resize_to) gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 可选Gamma校正 gray np.sqrt(gray / float(np.max(gray))) hog cv2.HOGDescriptor() features hog.compute(gray) return features在CPU上处理640x480图像只需约15ms这使得HOG至今仍是实时系统的首选方案。当我在智能监控项目中首次应用HOGSVM方案时发现即使在没有GPU的嵌入式设备上也能达到25FPS的检测速度——这证明了传统算法的工程价值。

相关文章:

HOG特征可视化:不用深度学习也能看懂图像特征(OpenCV+Matplotlib教程)

HOG特征可视化:不用深度学习也能看懂图像特征(OpenCVMatplotlib教程) 当你第一次看到"HOG特征"这个词时,可能会联想到猪的鼻子或是某种动物特征。但实际上,HOG(Histogram of Oriented Gradients&…...

Elasticsearch数据写入后秒级延迟?3种刷新策略性能对比与实战选择

Elasticsearch数据写入延迟优化:3种刷新策略的深度性能解析与工程实践 当你刚刚完成一笔重要订单的数据录入,却发现前台搜索迟迟不显示最新库存——这种"数据写入后搜索不到"的尴尬,正是Elasticsearch近实时(NRT)特性带来的典型挑战…...

Z-Image-Turbo-rinaiqiao-huiyewunv 低代码开发:在QT桌面应用中集成图像生成功能

Z-Image-Turbo-rinaiqiao-huiyewunv 低代码开发:在QT桌面应用中集成图像生成功能 你是不是也想过,给自己的桌面小工具加个“魔法”功能?比如,写个便签应用,输入“一只在喝咖啡的猫”,就能立刻生成一张配图…...

从零开始:Ubuntu18.04上搭建CFDEM耦合环境(含OpenFOAM-5.x和LIGGGHTS-3.8.0)

从零构建Ubuntu18.04下的CFD-DEM耦合仿真平台:OpenFOAM-5.x与LIGGGHTS-3.8.0深度整合指南 当离散元方法(DEM)遇上计算流体力学(CFD),便诞生了能够模拟颗粒-流体交互的CFD-DEM耦合技术。对于从事颗粒动力学、…...

4个核心功能让数据分析师效率提升300%的实战技巧

4个核心功能让数据分析师效率提升300%的实战技巧 【免费下载链接】PuzzleSolver 一款针对CTF竞赛MISC的工具~ 项目地址: https://gitcode.com/gh_mirrors/pu/PuzzleSolver PuzzleSolver是一款专为数据处理与隐写分析设计的开源工具,集成文件格式识别、图像修…...

FireRedASR Pro在IoT设备上的轻量化部署:STM32CubeMX工程配置

FireRedASR Pro在IoT设备上的轻量化部署:STM32CubeMX工程配置 语音交互正在成为智能家居、可穿戴设备等物联网产品的标配功能。但很多开发者一听到要在资源有限的MCU上跑语音识别,就觉得头大——内存不够、算力不足、开发复杂,好像是个不可能…...

Hunyuan-MT Pro部署教程:阿里云/腾讯云GPU服务器一键部署脚本

Hunyuan-MT Pro部署教程:阿里云/腾讯云GPU服务器一键部署脚本 想体验媲美专业翻译软件的AI翻译工具吗?Hunyuan-MT Pro就是这样一个基于腾讯混元大模型构建的现代化翻译Web应用。它支持33种语言互译,拥有简洁美观的界面,还能让你像…...

DeOldify在中小学美育教学中的应用:历史课老照片上色互动实践案例

DeOldify在中小学美育教学中的应用:历史课老照片上色互动实践案例 1. 项目背景与教育价值 在当今的中小学美育教学中,如何将技术手段与人文教育有机结合,一直是教育工作者探索的重点。历史课程中的老照片是重要的教学资源,但由于…...

深入解析LPDDR5/5X的BG mode、8B mode和16B mode:BANK架构与性能优化

1. LPDDR5/5X的BANK架构基础解析 现代移动设备对内存性能的要求越来越高,LPDDR5和LPDDR5X作为主流低功耗内存标准,其BANK架构设计直接影响着内存子系统的整体性能。在实际硬件设计中,工程师需要根据不同的速率需求选择合适的BANK工作模式。LP…...

如何突破Windows 11安装限制:bypass11工具高效使用指南

如何突破Windows 11安装限制:bypass11工具高效使用指南 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat 问题…...

MelonLoader模组加载器游戏兼容性问题全面排查指南

MelonLoader模组加载器游戏兼容性问题全面排查指南 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader MelonLoader作为一款支持Il2…...

XADC避坑指南:Xilinx 7系列FPGA内置ADC的5个常见使用误区

XADC避坑指南:Xilinx 7系列FPGA内置ADC的5个常见使用误区 在嵌入式系统设计中,Xilinx 7系列FPGA内置的XADC(Xilinx Analog-to-Digital Converter)模块为工程师提供了便捷的模拟信号采集方案。这个12位精度、1MSPS采样率的ADC模块看…...

从零开始:Nacos服务发现与配置管理的入门实战教程

从零开始:Nacos服务发现与配置管理的入门实战教程 微服务架构已成为现代应用开发的主流范式,而服务发现与配置管理则是这一架构的两大基石。作为阿里巴巴开源的核心中间件,Nacos凭借其轻量级、高可用和易扩展的特性,正在成为越来越…...

REX-UniNLU与CNN结合:多模态语义分析实践

REX-UniNLU与CNN结合:多模态语义分析实践 1. 多模态分析的现实需求 在内容审核和智能推荐的实际工作中,我们经常遇到这样的场景:一张商品图片看起来很正常,但标题文字却可能包含不合适的内容;或者一段描述很正面的文…...

WPF多屏切换崩溃?D3DImage.Lock卡死问题终极解决方案(附修复代码)

WPF多屏渲染崩溃难题:深度解析D3DImage设备丢失与线程安全重构方案 当你在会议室演示WPF应用时,突然切换投影模式导致整个程序冻结,屏幕上赫然显示着UCEERR_RENDERTHREADFAILURE异常——这种专业场合的崩溃足以让任何开发者脊背发凉。多屏环境…...

Origin小白也能学会:5分钟搞定带正态分布曲线的散点图(含常见错误排查)

Origin入门指南:5分钟绘制专业级散点图与正态分布曲线 第一次打开Origin软件时,面对密密麻麻的菜单和按钮,很多科研新手都会感到无从下手。作为实验室里最常用的数据可视化工具之一,Origin的强大功能往往被它的复杂界面所掩盖。本…...

GWAS实战避坑指南:当SNP分析遇到‘Permission denied‘和缺失值报警该怎么破?

GWAS实战避坑指南:当SNP分析遇到Permission denied和缺失值报警该怎么破? 在生物信息学研究中,全基因组关联分析(GWAS)已成为探索遗传变异与表型关联的重要工具。然而,从原始数据到最终结果的过程中,研究人员常会遇到各…...

Qwen3-ASR-1.7B:一款兼顾精度与效率的本地语音识别工具完整使用手册

Qwen3-ASR-1.7B:一款兼顾精度与效率的本地语音识别工具完整使用手册 1. 产品概述:为什么选择Qwen3-ASR-1.7B 在当今数字化工作场景中,语音转文字的需求无处不在——从会议记录到视频字幕,从采访整理到学习笔记。大多数用户面临两…...

Stata新手必看:Excel和DTA文件导入的3种方法(附常见错误解决)

Stata数据导入实战指南:从Excel到DTA的完整解决方案 刚接触Stata时,数据导入这个看似简单的步骤往往成为新手的第一道门槛。记得我第一次用Stata分析市场调研数据时,因为格式问题丢失了30%的样本编号,不得不重新收集数据。这种惨痛…...

一键部署Hunyuan-MT 7B:打造你的私有翻译助手,支持长文本翻译

一键部署Hunyuan-MT 7B:打造你的私有翻译助手,支持长文本翻译 你是否经常需要处理多语言文档,却苦于找不到高质量的翻译工具?主流在线翻译服务要么对专业术语处理不佳,要么对小语种支持有限,更别提隐私和数…...

Elasticsearch连接被重置?3个实用技巧帮你彻底解决Connection reset by peer问题

Elasticsearch连接被重置?3个实用技巧帮你彻底解决Connection reset by peer问题 最近在维护一个大型电商平台的搜索服务时,遇到了一个令人头疼的问题:Elasticsearch集群频繁出现"Connection reset by peer"错误。每当高峰期流量激…...

DIY爱好者必看:碳刷电机vs无刷电机,哪种更适合你的电动工具改装?

DIY爱好者必看:碳刷电机vs无刷电机,哪种更适合你的电动工具改装? 周末的午后,当你拆开那台老旧的电动工具时,是否曾对着内部嗡嗡作响的电机陷入沉思?在这个DIY文化盛行的时代,电动工具改装已经成…...

Qwen3-0.6B-FP8模型效果对比:与传统ChatGPT在文本理解上的差异

Qwen3-0.6B-FP8模型效果对比:与传统ChatGPT在文本理解上的差异 最近开源小模型的热度越来越高,很多开发者都在关注,这些模型到底能不能用,效果到底怎么样。特别是像Qwen3-0.6B-FP8这种,名字里带着“FP8”量化后缀的&a…...

Mirage Flow 在网络安全领域的应用:智能威胁分析与日志处理

Mirage Flow 在网络安全领域的应用:智能威胁分析与日志处理 每天,安全运维中心的工程师们都要面对海量的告警日志,从成千上万条信息中寻找那几条真正危险的攻击线索,就像大海捞针。传统的规则引擎和静态分析工具虽然能过滤掉大量…...

Android Studio项目难题解决:Qwen3-14B-Int4-AWQ调试Gradle构建错误与UI设计

Android Studio项目难题解决:Qwen3-14B-Int4-AWQ调试Gradle构建错误与UI设计 1. 引言:当Android开发遇上AI助手 作为一名Android开发者,你是否经历过这样的场景:深夜赶项目时Gradle突然报错,红色错误日志铺满屏幕&am…...

XTDrone仿真平台实战:如何用VINS-Fusion实现视觉惯性里程计与PX4的联合仿真

XTDrone仿真平台实战:VINS-Fusion与PX4联合仿真的深度优化指南 在无人机仿真领域,视觉惯性里程计(VIO)与飞控系统的无缝集成一直是提升仿真精度的关键挑战。本文将带您深入探索如何利用VINS-Fusion这一强大的多传感器状态估计算法,与PX4飞控系…...

AI编程助手避坑指南:从Claude Code和Codex的6百万token测试里总结的5条黄金法则

AI编程助手实战避坑指南:600万Token测试得出的5条黄金决策法则 在TypeScript项目中累计消耗超过600万token后,我逐渐摸清了Claude Code和Codex这两款主流AI编程助手的脾气。它们就像风格迥异的两位搭档——一个像严谨的建筑师,另一个像敏捷的…...

RoboMaster Python SDK:解锁机器人控制的编程之旅

RoboMaster Python SDK:解锁机器人控制的编程之旅 【免费下载链接】RoboMaster-SDK DJI RoboMaster Python SDK and Sample Code for RoboMaster EP. 项目地址: https://gitcode.com/gh_mirrors/ro/RoboMaster-SDK 核心优势解析:为什么选择RoboMa…...

立创开源无线开关功率计Pro:ESP32-C3+INA228打造50V/320A机器人安全监控方案

立创开源无线开关功率计Pro:ESP32-C3INA228打造50V/320A机器人安全监控方案 大家好,我是老张,一个在机器人圈子里摸爬滚打了十来年的嵌入式工程师。今天想跟大家聊聊一个在调试机器人时特别头疼,但又特别重要的事儿——安全。 不…...

1. 衡山派开发板驱动1.47寸ST7789V3彩屏实战:基于RT-Thread的SPI/QSPI移植与图形显示

衡山派开发板驱动1.47寸ST7789V3彩屏实战:基于RT-Thread的SPI/QSPI移植与图形显示 最近在衡山派开发板上做项目,需要用到一块小尺寸的彩色LCD屏幕来显示信息。很多朋友问我怎么在RT-Thread系统下驱动这种SPI接口的彩屏,今天我就把完整的移植过…...