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

《数字图像处理-OpenCV/Python》第16章:图像的特征描述

《数字图像处理-OpenCV/Python》第16章:图像的特征描述


本书京东 优惠购书链接 https://item.jd.com/14098452.html
本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html

在这里插入图片描述


第16章:图像的特征描述


特征通常是针对图像中的目标或关键点而言的。目标的边界(轮廓)通常是一条简单的闭合曲线。针对目标边界的特征描述符,称为边界描述符(Boundary Descriptors)。针对目标所在区域的特征描述符,称为区域描述符(Region Descriptors)。针对关键点的描述符,称为关键点描述符(Keypoints Descriptors)。

本章内容概要

  • 介绍边界描述符,如弗里曼链码、傅里叶描述符和傅里叶频谱分析。
  • 介绍区域特征描述符,如紧致度、圆度、偏心率。
  • 介绍灰度共生矩阵。
  • 学习和使用方向梯度直方图,构造方向梯度直方图(HOG)关键点描述符。
  • 学习和使用二进制描述符,如LBP描述符、BRIEF描述符和FREAK描述符。

16.7 特征描述之HOG描述符

方向梯度直方图(Histogram of Oriented Gradient,HOG)使用方向梯度的分布作为特征来构造描述符,应用非常广泛。
梯度的幅值是边缘和角点检测的基础,梯度的方向包含丰富的图像特征。HOG的基本思想:图像的局部特征可以用梯度幅值和方向的分布描述。HOG的基本方法是将图像划分成多个单元格,计算每个单元格的HOG,把每个单元格的HOG连接起来构造为HOG特征向量。
HOG描述符的向量维数不是固定不变的,取决于检测图像的大小和单元格的大小。HOG描述符不具有尺度和旋转不变性,但具有良好的几何和光学不变性,特别适合人体检测。


OpenCV中的函数cv::HOGDescriptor类用于实现HOG描述符。在Python语言中,OpenCV提供了HOG类的接口函数cv.HOGDescriptor。

函数原型

cv.HOGDescriptor(_winSize, _blockSize, _blockStride, _cellSize, _nbins) → retval
hog.compute(img[, _winStride, _padding]) → descriptors

参数说明

◎ winSize:检测窗口大小,是形为(w,h)的元组,默认值为(64,128)。
◎ blockSize:子块大小,是形为(w,h)的元组,默认值为(16,16)。
◎ blockStride:子块的滑动步长,是形为(w,h)的元组,默认值为(8,8)。
◎ cellSize:单元格大小,是形为(w,h)的元组,默认值为(8,8)。
◎ nbins:直方图的条数,是整型数据,默认值为9。
◎ img:输入图像,允许为单通道图像,数据类型为CV_8U。
◎ winStride:窗口大小,可选项,必须是blockStride的整数倍。
◎ descriptors:HOG描述符,是形为(lenHOG,)的Numpy 数组,数据类型为CV_32F。

函数说明

(1) 计算每个单元格cell的HOG:方向梯度的取值范围为0~180度,等分为nbins个区间,将单元格像素的方向梯度分配到nbins个扇形区间,累加每个区间内的像素数,得到nbins位的HOG向量。
(2) 构造子块block的HOG:多个单元格cell组合为子块block,子块的HOG描述符就是多个单元格HOG向量的串联,长度为nbins×blockSize/cellSize。
(3) 整个检测窗口的HOG:子块block以步长blockStride在检测窗口内滑动,遍历检测窗口,检测窗口的HOG就是每个子块block的HOG串联。

注意问题
(1) 函数cv.HOGDescriptor能实例化HOGDescriptor类,定义一个HOGDescriptor类对象。成员函数hog.compute能计算给定图像的HOG描述符。
(2) 推荐设置检测窗口大小winSize为子块大小blockSize的整数倍,子块大小blockSize为单元格大小cellSize的整数倍,子块大小blockSize为滑动步长blockStride的整数倍。
(3) 函数中方向梯度的取值范围是0~180度,而不是0~360度。
(4) 函数cv::HOGDescriptor类的功能丰富,参数和成员函数很多,可以实现尺度不变性的检测。更多使用方法可以参见OpenCV官方文档。


【例程1609】特征描述之HOG描述符

本例程介绍基于距离变换的分水岭算法的实现方法,通过每个像素到最近的零像素点生成标注图像。
基于距离变换的分水岭算法的主要步骤如下。
(1) 通过阈值分割将灰度图像转换为二值图像,使用开运算消除噪点。
(2) 通过形态学的膨胀运算,生成确定背景区域sureBG。
(3) 通过距离变换,由阈值分割得到高亮区域,生成确定前景区域sureFG。
(4) 对确定前景区域进行连通性分析,即对多个分割目标编号。
(5) 确定前景区域与确定背景区域重合的部分,作为待定区域unknown。
(6) 从连通域标记图像中去除确定背景区域,作为标注图像。
(7) 基于标记图像使用分水岭算法进行分割,得到分割的目标轮廓,标注为-1。


# 【1609】特征描述之 HOG 描述符
import cv2 as cv
import numpy as np
from matplotlib import pyplot as pltdef drawHOG(image, descriptors, cx, cy, rad):angles = np.arange(0, 180, 22.5).astype(np.float32)  # start, stop, stepnormGrad = descriptors/np.max(descriptors).astype(np.float32)gx, gy = cv.polarToCart(normGrad*rad, angles, angleInDegrees=True)for i in range(angles.shape[0]):px, py = int(cx+gx[i]), int(cy+gy[i])cv.arrowedLine(image, (cx,cy), (px, py), 0, tipLength=0.1)  # 黑色return imageif __name__ == '__main__':# (1) 读取样本图像,构造样本图像集合img = cv.imread("../images/Fig1101.png", flags=0)  # 灰度图像height, width, wCell, d = 200, 200, 20, 10img = cv.resize(img, (width, height))  # 调整为统一尺寸# (2) 构造 HOG 检测器winSize = (20, 20)blockSize = (20, 20)blockStride = (20, 20)cellSize = (20, 20)nbins = 8hog = cv.HOGDescriptor(winSize, blockSize, blockStride, cellSize, nbins)lenHOG = nbins * (blockSize[0]/cellSize[0]) * (blockSize[1]/cellSize[1]) \* ((winSize[0]-blockSize[0])/blockStride[0] + 1) \* ((winSize[1]-blockSize[1])/blockStride[1] + 1)print("length of descriptors:", lenHOG)# (3) 计算检测区域的 HOG 描述符xt, yt = 80, 80  # 检测区域位置cell = img[xt:xt+wCell, yt:yt+wCell]cellDes = hog.compute(cell)  # HOG 描述符,(8,)normGrad = cellDes/np.max(cellDes).astype(np.float32)print("shape of descriptors:{}".format(cellDes.shape))print(cellDes)# (4) 绘制方向梯度示意图imgGrad = cv.resize(cell, (wCell*10, wCell*10), interpolation=cv.INTER_AREA)Gx = cv.Sobel(img, cv.CV_32F, 1, 0, ksize=5)  # X 轴梯度 GxGy = cv.Sobel(img, cv.CV_32F, 0, 1, ksize=5)  # Y 轴梯度 GymagG, angG = cv.cartToPolar(Gx, Gy, angleInDegrees=True)  # 用极坐标求幅值与方向 (0~360度)print(magG.min(), magG.max(), angG.min(), angG.max())7angCell = angG[xt:xt+wCell, yt:yt+wCell]box = np.zeros((4, 2), np.int32)  # 计算旋转矩形的顶点, (4, 2)for i in range(wCell):for j in range(wCell):cx, cy = i*10+d, j*10+drect = ((cx,cy), (8,1), angCell[i,j])  # 旋转矩形类box = np.int32(cv.boxPoints(rect))  # 计算旋转矩形的顶点,(4, 2)cv.drawContours(imgGrad, [box], 0, (0,0,0), -1)# (5) 绘制检测区域的HOGcellHOG = np.ones((201,201), np.uint8)  # 白色cellHOG = drawHOG(cellHOG, cellDes, xt+d, yt+d, 40)# (6) 绘制图像的HOGimgHOG = np.ones(img.shape, np.uint8)*255  # 白色for i in range(10):for j in range(10):xc, yc = 20*i, 20*jcell = img[xc:xc+wCell, yc:yc+wCell]descriptors = hog.compute(cell)  # HOG 描述符,(8,)imgHOG = drawHOG(imgHOG, descriptors, xc+d, yc+d, 8)imgWeight = cv.addWeighted(img, 0.5, imgHOG, 0.5, 0)plt.figure(figsize=(9, 6.2))plt.subplot(231), plt.title("1. Original")cv.rectangle(img, (xt,yt), (xt+wCell,yt+wCell), (0,0,0), 2)  # 绘制 blockplt.axis('off'), plt.imshow(img, cmap='gray')plt.subplot(232), plt.title("2. Oriented gradient")angNorm = np.uint8(cv.normalize(angG, None, 0, 255, cv.NORM_MINMAX))plt.axis('off'), plt.imshow(angNorm, cmap='gray')plt.subplot(233), plt.title("3. Image with HOG")cv.rectangle(imgWeight, (xt,yt), (xt+wCell,yt+wCell), (0,0,0), 2)  # 绘制 blockplt.axis('off'), plt.imshow(imgWeight, cmap='gray')plt.subplot(234), plt.title("4. Grad angle of cell")plt.axis('off'), plt.imshow(imgGrad, cmap='gray')plt.subplot(235), plt.title("5. HOG of cell")strAng = ("0", "22", "45", "67", "90", "112", "135", "157")plt.bar(strAng, cellDes*wCell*wCell)plt.subplot(236), plt.title("6. HOG diagram of cell")plt.axis('off'), plt.imshow(cellHOG, cmap='gray')  plt.tight_layout()plt.show()

在这里插入图片描述

图16-9 可视化的HOG描述符

程序说明:

运行结果,可视化的HOG描述符如图16-9所示。
(1) 图16-9(1)所示为原始图像,图中黑色方框是一个单元格cell。图16-9(2)所示为原始图像的方向梯度图,像素值的大小反映了方向梯度的角度。
(2) 图16-9(4)所示为图16-9(1)中方框位置单元格cell的方向梯度图,图中的线段表示像素点的方向梯度,注意例程中方向梯度的范围是0~180度。
(3) 图16-9(5)所示为对图16-9(4)单元格中的所有像素点,按8个方向区间绘制的HOG。图16-9(6)所示为图16-9(5)的单元格HOG的空间矢量。
(4) 图16-9(3)所示为整个图像的可视化HOG。将图像划分为10×10个单元格,计算每个单元格的HOG,表示为图16-9(6)所示的空间矢量形式。
(5) 例程介绍了HOG处理过程和结果的各种图像,是为了便于理解HOG的思路和计算步骤。在实际应用中,检测图像的HOG是维数为lenHOG的特征向量,而不是二维图像。


版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/139766654)
Copyright 2024 youcans, XUPT
Crated:2024-06-18

《数字图像处理-OpenCV/Python》 独家连载专栏 : https://blog.csdn.net/youcans/category_12418787.html

相关文章:

《数字图像处理-OpenCV/Python》第16章:图像的特征描述

《数字图像处理-OpenCV/Python》第16章:图像的特征描述 本书京东 优惠购书链接 https://item.jd.com/14098452.html 本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html 第16章:图像的特征描述 特征通常是针对图像中的目标或…...

React的服务器端渲染(SSR)和客户端渲染(CSR)有什么区别?

React的服务器端渲染(SSR)和客户端渲染(CSR)是两种不同的页面渲染方式,它们各自有不同的特点和适用场景: 服务器端渲染(SSR) 页面渲染: 页面在服务器上生成,然后将完整的…...

安全生产第一位,靠谱的漏油监测系统有哪些?

漏油监测系统,一般是由漏油绳、漏油控制器、监控云平台组成,用于实时检测油库、油罐、加油站、输油管道、油类化工厂等场所是否发生漏油事故。在这些地方一旦发生漏油,就极可能引发爆炸,损害到人员及财产安全。而一套靠谱的漏油监…...

基于C#、Visual Studio 2017以及.NET Framework 4.5的Log4Net使用教程

在使用Log4Net记录日志时,以下是一个基于C#、Visual Studio 2017以及.NET Framework 4.5的详细步骤教程。这个教程适合初学者,会从添加Log4Net库、配置日志、编写日志记录代码等方面进行说明。 步骤1:安装Log4Net 通过NuGet安装 打开您的Vi…...

C# —— 构造函数

什么是构造函数 构造函数: 一般在函数为类的属性初始值的作用,构造函数的名称类名 在类里面定义构造函数 方法名和类名同名 不能带返回值类型 void/非void 不能有 // 创建一个构造函数 class People {public string Name { get; set; }public int Age { get; set;…...

HTML5的新属性

pattern:用于指定输入字段的正则表达式模式。在提交表单前,输入将验证是否符合指定的模式。 pattern 属性是 HTML5 中用于表单验证的一个属性,它用于指定一个正则表达式,以验证输入字段中的值是否符合特定的模式。该属性通常与 &l…...

[C语言] 常用排序算法

冒泡排序 思路: 从小到大,找到集合中最小的放在最左边,在剩下的集合中找到最小的放在最左边以此类推。如何找到最小的?(假定左边第一个数就是最小的,让它依次和它右边的比较,如果右边的比它还小…...

【前端vue3】TypeScrip-interface(接口)和对象类型

对象类型 定义对象需要用到interface(接口),主要用来约束数据的类型满足格式 定义方式如下: interface Person {name: string;age: number; }如对象中与接口中的属性不一致会报错,必须保持一致 例如如下&#xff1a…...

神经网络 torch.nn---nn.RNN()

torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io) RNN — PyTorch 2.3 documentation torch.nn---nn.RNN() nn.RNN(input_sizeinput_x,hidden_sizehidden_num,num_layers1,nonlinearitytanh, #默认tanhbiasTrue, #默认是Truebatch_firstFalse,dropout0,bidirection…...

RocketMQ-记一次生产者发送消息存在超时异常

目录 1、背景说明 2、排查 2.1、防火墙 2.2、超时时间设置 2.3、服务器资源检查 2.3.1、内存、CPU等 2.3.2、磁盘空间 ​编辑 2.3.3、检查文件描述符 2.3.4、swap区 3、增加swap空间 3.1、创建目录 3.2、格式化 3.3、启动swap 3.4、查看效果 1、背景说明 在一次…...

ls命令的参数选项

ls命令的参数的作用 可以指定要查看的文件夹(目录)的内容,如果不指定参数,就查看当前工作目录的内容。ls 命令的选项 常用语法:ls [-a -l -h] [linux路径] -a 选项表示 all ,即列出全部内容,包括…...

网络安全:Web 安全 面试题.(文件上传漏洞)

网络安全:Web 安全 面试题.(文件上传漏洞) 网络安全面试是指在招聘过程中,面试官会针对应聘者的网络安全相关知识和技能进行评估和考察。这种面试通常包括以下几个方面: (1)基础知识:包括网络基础知识、操…...

智源联合多所高校推出首个多任务长视频评测基准MLVU

当前,研究社区亟需全面可靠的长视频理解评估基准,以解决现有视频理解评测基准在视频长度不足、类型和任务单一等方面的局限性。因此,智源联合北邮、北大和浙大等多所高校提出首个多任务长视频理解评测基准MLVU(A Comprehensive Be…...

Linux系统:线程概念 线程控制

Linux系统:线程概念 & 线程控制 线程概念轻量级进程 LWP页表 线程控制POSIX 线程库 - ptherad线程创建pthread_createpthread_self 线程退出pthread_exitpthread_cancelpthread_joinpthread_detach 线程架构线程与地址空间线程与pthread动态库 线程的优缺点 线程…...

LearnOpenGL - Android OpenGL ES 3.0 绘制纹理

系列文章目录 LearnOpenGL 笔记 - 入门 01 OpenGLLearnOpenGL 笔记 - 入门 02 创建窗口LearnOpenGL 笔记 - 入门 03 你好,窗口LearnOpenGL 笔记 - 入门 04 你好,三角形OpenGL - 如何理解 VAO 与 VBO 之间的关系LearnOpenGL - Android OpenGL ES 3.0 绘制…...

山东济南最出名的起名大师颜廷利:二十一世纪哲学的领航者

山东济南最出名的起名大师颜廷利教授:二十一世纪哲学的领航者 在哲学的天空中,颜廷利教授犹如一颗璀璨的星辰,被无数求知者誉为21世纪最杰出的思想家之一。他的理论既深邃又广博,巧妙地将东方的儒家与道家哲学与西方的思辨传统交织…...

Nginx 负载均衡实现上游服务健康检查

Nginx 负载均衡实现上游服务健康检查 Author:Arsen Date:2024/06/20 目录 Nginx 负载均衡实现上游服务健康检查 前言一、Nginx 部署并新增模块二、健康检查配置2.1 准备 nodeJS 应用程序2.2 Nginx 配置负载均衡健康检查 小结 前言 如果你使用云负载均衡…...

小程序使用接口wx.getLocation配置

开通时需详细描述业务,否则可能审核不通过 可能需要绑定腾讯位置服务,新建应该,绑定到小程序 配置 权限声明:在使用wx.getLocation前,需要在app.json的permission字段中声明对用户位置信息的使用权限,并提…...

Protobuf安装配置--附带每一步截图

Protobuf Protobuf(Protocol Buffers)协议是一种由 Google 开发的二进制序列化格式和相关的技术,它用于高效地序列化和反序列化结构化数据,通常用于网络通信、数据存储等场景。 为什么要使用Protobuf Protobuf 在许多领域都得到…...

力扣1019.链表中的下一个更大节点

力扣1019.链表中的下一个更大节点 从左到右 每个数确定下一个更大节点后 弹出栈中存下标 即res.size() class Solution {public:vector<int> nextLargerNodes(ListNode* head) {vector<int> res;stack<int> st;for(auto ihead;i;ii->next){while(!st.e…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...