对LBP与HOG的理解

article/2025/9/19 2:14:08

LBP(Local Binary Pattern),局部二值模式

一种描述图像局部纹理特征的算子在这里插入图片描述
主要思想:: 通过比较图像区域中每个像素点与其邻域内像素点的灰度值,利用二进制模式表示的比较结果来描述图像的纹理特征。
在这里插入图片描述

keywords:邻域,灰度值,比较,直方图。

LBP性质
1.灰度不变性:光照难以改变各个像素块之间的大小关系。
2.旋转不变性

LBP特征向量提取步骤
1.检测窗口划分为16*16的区域cell。
2.对每一个cell进行如上比较,查收内哼8位二进制数,得到窗口中心像素点的LBP值。
3.计算每一个cell的直方图,并归一化。
4.将每个cell的直方图连接成一个特征向量。
5.用机器学习算法分类

人脸检测代码实现
参考: https://blog.csdn.net/hzy459176895/article/details/106984684?utm_medium=distribute.pc_relevant.none-task-blog-utm_term-6&spm=1001.2101.3001.4242
说明:opencv有训练好的人脸检测算法:https://github.com/opencv/opencv/blob/master/data/lbpcascades/lbpcascade_frontalface_improved.xml


#coding:utf-8"""
LBP特征用于人脸检测...
"""import cv2 as cv# 读取原始图像
img = cv.imread('D:\DigitalGaphicsProcessing\hezhao1.jfif')# 训练好的LBP,人脸检测模型
face_detect = cv.CascadeClassifier("lbpcascade_frontalface_improved.xml")# 灰度处理
gray = cv.cvtColor(img, code=cv.COLOR_BGR2GRAY)# 检查人脸: scaleFactor表示每次图像尺寸减小的比例, minNeighbors表示每一个目标至少要被检测到3次才算是真的目标
face_zone = face_detect.detectMultiScale(gray, scaleFactor=2, minNeighbors=3)  # maxSize = (55,55)
print('识别人脸的信息:\n', face_zone)# 绘制矩形和圆形检测人脸
for x, y, w, h in face_zone:# 绘制矩形人脸区域cv.rectangle(img, pt1=(x, y), pt2=(x+w, y+h), color=[0, 0, 255], thickness=2)# 绘制圆形人脸区域 radius表示半径cv.circle(img, center=(x + w//2, y + h//2), radius=w//2, color=[0, 255, 0], thickness=2)# 设置图片可以手动调节大小
cv.namedWindow("FACE", 0)# 显示图片
cv.imshow("FACE", img)# 等待显示 设置任意键退出程序
cv.waitKey(0)
cv.destroyAllWindows()

效果图
用了一张超越妹妹的图像,识别的很好。但是如果图片有闭着眼睛的人或者多个人脸,识别效果就会大打折扣。
在这里插入图片描述
输出结果是人脸的坐标
在这里插入图片描述

HOG(Histogram Of Oriented Gradient),方向梯度直方图

计算水平和垂直方向的梯度,再计算梯度的直方图。
在这里插入图片描述
计算过程太复杂了就不说了。

HOG特征提取方法:
1.对灰度图像进行颜色空间归一化(Gamma校正法)
2.计算每个像素的梯度(大小and方向)
3.将图像分为cell(像上面LBP一样),统计每个cell的梯度直方图,形成每个cell的descriptor。
4.将每几个cell组成一个block,这些cell的descriptor串联起来得到该block的HOG的descriptor。
5.同理,将所有block的descriptor串联起来得到该图像的HOG的descriptor。

人物识别代码
参考:https://blog.csdn.net/weixin_43955530/article/details/91971179?biz_id=102&utm_term=HOG%E5%88%86%E7%B1%BB%E8%AF%86%E5%88%AB%E8%BD%A6%E8%BE%86&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-2-91971179&spm=1018.2118.3001.4449

import cv2
import numpy as npdef is_inside(o,i):#如果o框在i框里面,那么就返回True,否则,返回Falseox,oy,ow,oh = oix,iy,iw,ih = ireturn ox > ix and oy > iy and ox + ow < ix + iw and oy + oh < iy + ihdef draw_person(image,person):#给检测出来的人画框x,y,w,h = personcv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)img = cv2.imread('people1.jfif')#opencv自带的HOGDescriptor可以检测人,作为检测人的默认检测器
hog = cv2.HOGDescriptor()#定义一个模型
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())#分类是基于人的分类found,w = hog.detectMultiScale(img)#这里用detectMultiScale来加载图像
#print(found)#found是矩形框的信息,坐标和宽高
#print(w)#w得到的是每一个矩形的置信度found_filtered = []
for ri,r in enumerate(found):
#    print('ri:',ri,'r:',r)for qi,q in enumerate(found):
#        print('qi:',qi,'q:',q)if ri != qi and is_inside(r,q):#如果是索引不同的两个框,并且r框在q框里面完全包含了,就直接breakprint('过')#这里我们发现没有这种不同框相互包含的情况,三个框都不是相互包含的关系breakelse:found_filtered.append(r)for person in found_filtered:
#    print(person)draw_person(img,person)cv2.imshow('PEOPLE DETECTION',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果图
可以看出能够识别人体,但是略有瑕疵。
在这里插入图片描述
PS:由于opencv没有可以直接使用的车辆识别的模型,所以两个特征提取方法都用来人脸识别。


http://chatgpt.dhexx.cn/article/YiBlGV0V.shtml

相关文章

浅谈LBP原理和代码(基于Python)

LBP&#xff0c;全称Local Binary Pattern&#xff0c;局部二值模式&#xff0c;是一种用来描述图像局部特征的算子&#xff0c;具有灰度不变性和旋转不变性的优点 原始LBP算法 33的矩形块&#xff0c;由1个中心像素和它周围的8个邻域像素组成&#xff0c;若相邻像素值大于或…

LBP原理加源码解析

没有看LBP之前觉得它很神秘&#xff0c;看完了之后也就那么回事&#xff0c;不过提出LBP的人确实很伟大&#xff01;&#xff01; LBP&#xff08;Local Binary Pattern&#xff0c;局部二值模式&#xff09;是一种用来描述图像局部纹理特征的算子&#xff1b;它具有旋转不变性…

局部二值模式LBP

文章目录 1.基础介绍2.局部二值模式&#xff08;Local Binary Patterns&#xff0c;LBP&#xff09;编码介绍3.使用skimage求lbp参考资料 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; 1.基础介绍 局部二值模式&#xff08;Local Binary…

LBP(Local Binary Pattern)

一、LBP指局部二值模式&#xff0c;英文全称&#xff1a;Local Binary Pattern&#xff0c;是一种用来描述图像局部特征的算子&#xff0c;LBP特征具有灰度不变性和旋转不变性等显著优点。在1994年提出&#xff0c;由于LBP特征计算简单、效果较好&#xff0c;因此LBP特征在计算…

Windows保护模式(一)段寄存器GDT表

保护模式 x86 CPU的3个模式&#xff1a;实模式、保护模式和虚拟8086模式。 段寄存器 段式内存管理 段式内存管理是将内存划分成若干段&#xff0c;处理器在访问一个内存单元时通过“段基址偏移”的方式计算出实际的物理地址。 在Intel x86处理器中&#xff0c;有专门的段寄存…

段、GDT、调用门学习笔记

保护模式 什么是保护模式 x86 CPU的3个模式:实模式、保护模式、虚拟8086模式。AMD64与Intel64 AMD在1999年的时候拓展了这套指令集&#xff0c;成为x86-64后改名叫AMD64,AMD是首先开发了64拓展&#xff0c;但是AMD的 64位拓展并不支持32位&#xff0c;后来Intel也开发了64位…

linux内核gdt,linux内核学习之全局描述符表(GDT)(二)

在进入保护模式之前&#xff0c;我们先要学习一些基础知识。今天我们看一下全局描述符表(Global Descriptor Table, 简称GDT)。 同实模式一样&#xff0c;在保护模式下&#xff0c;对内存的访问仍然使用段地址加偏移地址。但是&#xff0c;在保护模式下&#xff0c;在每个段能够…

【IDT】 windows IDT GDT LDT

IDT&#xff1a; &#xff08;Interrupt Descrptor Table&#xff09;中断描述符表&#xff0c;用来处理中断的。 IDT的获取&#xff1a; 可以通过SIDT指令&#xff0c;它可以在内存中找到IDT&#xff0c;返回一个IDTR结构的地址。也可以通过kpcr结构获取 ISR&#xff1a; …

GDT 表与段选择子等解析

来源&#xff1a;https://blog.csdn.net/qq_37653144/article/details/82821540 https://blog.csdn.net/yeruby/article/details/39718119 https://blog.csdn.net/lindorx/article/details/89410113 全局描述表(GDT Global Descriptor Table):在保护模式下一个重要的数据结构…

GDT和GDTR

文章目录 GDTR和GDTGDT和GDTR关系GDTR的结构GDT的结构如何在MBR中建立GDT和GDTR? GDTR和GDT GDT和GDTR关系 GDT是global descriptor table&#xff0c;全局描述符表&#xff0c;它是描述符组成的一张描述符表。描述符就是段描述符它用来描述一个段的信息&#xff0c;由8个字节…

GDT,LDT,GDTR,LDTR

GDT,LDT,GDTR,LDTR 前言全局描述符表GDT局部描述符表LDT中断描述符表IDT段选择子任务寄存器TR实例1&#xff1a;访问GDT2&#xff1a;访问LDT 前言 所谓工作模式&#xff0c;是指CPU的寻址方式、寄存器大小、指令用法和内存布局等。 实模式 段基址:段内偏移地址”产生的逻辑地…

GDT和LDT详解

1.GDT 我们回顾一下实际的操作系统的内存关系: ​ 程序/进程 → 映射 段 表 逻辑地址 → segment unit 段 基 址 偏 移 地 址 虚拟地址 → page unit 页 表 物理内存地址 \text{程序/进程}\overset{段表}{\xrightarrow[\text{映射}]{}} \text{逻辑地址}\overset{段基址偏移…

GDT(全局描述符表)和LDT(局部描述符表)

Home > GDT&#xff08;全局描述符表&#xff09;和LDT&#xff08;局部描述符表&#xff09; 每个程序都有自己的LDT&#xff0c;但是同一台计算机上的所有程序共享一个GDT。LDT描述局部于每个程序的段&#xff0c;包括其代码、数据、堆栈等。GDT描述系统段&#xff0c…

什么是数据可视化?

到底什么是数据可视化&#xff1f;带你一窥究竟&#xff5e; 技术人最不该忽视可视化数据分析&#xff01; 导读&#xff1a;在这个“人人都是数据分析师”的时代&#xff0c;大企业的同学几乎都在参与数据的采集、加工与消费。数据可视化作为连接“加工——消费”的重要一环…

当下最火的中台到底是个什么鬼,看完这一篇最通俗易懂的文章后,你就会彻底明白了!...

公众号关注 「奇妙的 Linux 世界」 设为「星标」&#xff0c;每天带你提升技术视野&#xff01; 背景 自从阿里巴巴现任CEO逍遥子在2015年提出”大中台&#xff0c;小前台”战略以来&#xff0c;关于”什么是中台”&#xff0c;可谓是一石激起千层浪&#xff0c;大量文章在描述…

STD::是什么?

【&#xff23;&#xff0b;&#xff0b;】std&#xff1a;&#xff1a;是什么&#xff1f; 引例&#xff1a; #include<iostream> int main() {std::cout<<"我喜欢C";//输出一句话std::cout<<std::endl;//换行return 0; } 1.std是什么&#xff1…

C语言中 1%3,算术什么意思啊 算数什么意思

算术什么意思啊 算数什么意思以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 算术是什么意思 数学 什么是算术和 算术和是正数的和,即绝对值的和,例如2+13.5+7,Ge个数值皆为正且相加。  主要区别于代数和,…

matlab语句temp,maxtemp什么意思 will什么意思

maxtemp什么意思 will什么意思以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Min Temp 和 Max Temp 是什么意思 最小的Temp和最大Temp Temp: Chang用的办公软件和其他应用程序通常会临时保Cun用户的工作结果,…

html 玫瑰花

简易html 代码玫瑰花 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>玫瑰</title><style type"text/css"> #shusheng { position: absolute; width: 100%; height: 100%; text-align: center; } &…