当前位置: 首页 > 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…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...