OpenCV⼈脸识别之LBPH算法(局部⼆值模式⽅法)
⼈脸识别LBPH算法
⼈脸识别是指将⼀个需要识别的⼈脸和⼈脸库中的某个⼈脸对应起来(类似于指纹识别),⽬的是完成识别功能,该术语需要和⼈脸检
测进⾏区分,⼈脸检测是在⼀张图⽚中把⼈脸定位出来,完成的是搜寻的功能。
算法介绍原理图
算⼦
原始的LBP算⼦定义为在3*3的窗⼝内,以窗⼝中⼼像素为阈值,将相邻的8个像素的灰度值与其进⾏⽐较,若周围像素值⼤于或等于
中⼼像素值,则该像素点麦麸的功效与作用 的位置被标记为1,否则为0。这样,3*3邻域内的8个点经⽐较可产⽣8位⼆进制数(通常转换为⼗进制数即LBP
码,共256种),即得到该窗⼝中⼼像素点的LBP值,并⽤这个值来反映该区域的纹理特征。如下图所⽰:
124
5510
824
000
11
100
Binary:00010011Decimal:19
基本的LBP算⼦的最⼤缺陷在于它只覆盖了⼀个固定半径范围内的⼩区域,这显然不能满⾜不同尺⼨和频率纹理的需要。为了适应不万物静观皆自得 同尺
度的纹理特征,Ojala等对LBP算⼦进⾏了改进,将33邻域扩展到任意邻域,并⽤圆形邻域代替了正⽅形邻域,改进后的LBP算⼦允许在
半径为R的圆形邻域内有任意多个像素点,从⽽得到了诸如半径为R的圆形区域内含有P个采样点的LBP算⼦,OpenCV中正是使⽤圆形
LBP算⼦,下图⽰意了圆形LBP算⼦:
3.旋转不变性
从LBP的定义可以看出,LBP算⼦是灰度不变的,但却不是旋转不变的,图像的四级英语真题试卷 旋转就会得到不同的LBP值。Maenpaa等⼈⼜将LBP
算⼦进⾏了扩展,提出了具有旋转不变性的LBP算⼦,即不断旋转圆形邻域得到⼀系列初始定义的LBP值,取其最⼩值作为该邻域的LBP
值。下图给出了求取旋转不变LBP的过程⽰意图,图中算⼦下⽅的数字表⽰该算⼦对应的LBP值,图中所⽰的8种LBP模式,经过旋转不变
的处理,最终得到的具有旋转不变性的LBP值为15。也就是说,图中的8种LBP模式对应的旋转不变的LBP码值都是00001111。
4.等价模式
考察LBP算⼦的定义可知,⼀个LBP算⼦可以产⽣多种⼆进制模式(p个采样点)如:3x3邻域有p=8个采样点,则可得到2^8=256
种⼆进制模式;5x5邻域有p=24个采样点,则可得到2^24=16777216种⼆进制模式,以此类推......。显然,过多的⼆进制模式⽆论对于
纹理的提取还是纹理的识别、分类及信息存取都是不利的,在实际应⽤中不仅要求采⽤的算⼦尽量简单,同时也要考虑到计算速度、存储量
⼤⼩等问题。因此需要对原始的LBP模式进⾏降维。
Ojala提出⼀种“等价模式”(UniformPattern)来对LBP算⼦进⾏降维,Ojala等认为图像中抗感染的药有哪些 ,某个局部⼆进制模式所对应的循环
⼆进制数从0—>1或从1—>0,最多有两次跳变,该局部⼆进制模式所对应的⼆进制就成为⼀个等价模式。
如00000000,00111000,10001111,11111111等都是等价模式类。判断⼀个⼆进制模式是否为等价模式最简单的办法就是将
LBP值与其循环移动⼀位后的值进⾏按位相与,计算得到的⼆进制数中1的个数,若个数⼩于或等于2,则是等价模式;否则,不是。除了
等价模式以外的模式都归⼀⼀类,称为混合模式类,例如10010111(共四次跳变)。跳变的计狗的日记 算⽅法:如10010111,⾸先第⼀⼆位
10,由1—>0跳变⼀次;第⼆、三位00,没有跳变;第三、四位01,由0—>1跳变⼀次,第四、五位10,由1—>0跳变⼀次;第五六位
01,由0—>1跳变⼀次;第六七位11,没有跳变;第七⼋位11,没有跳变;第⼋位防御的近义词 和第⼀位11,没有跳变;故总共跳变4次。
通过这种改进,⼆进制模式的种类⼤⼤减少,⽽不会丢失任何信息,模式种类由原来的2^p减少为p*(p-1)+2种。但等价模式代表了图
像的边缘、斑点、⾓点等关键模式,等价模式占了总模式中的绝⼤多数,所以极⼤的降低了特征维度。利⽤这些等价模式和混合模式类直⽅
图,能够更好地提取图像的本质特征。
特征⽤于检测的原理
显⽽易见的是,上述提取的LBP算⼦在每个像素点都可以得到⼀个LBP“编码”,那么,对⼀幅图像(记录的是每个像素点的灰度值)提取
其原始的LBP算⼦之后,得到的原始LBP特征依然是“⼀幅图⽚”(记录温暖作文开头 的是每个像素点的LBP值)。
如果将以上得到的LBP图直接⽤于⼈脸识别,其实和不提取LBP特征没什么区别,在实际的LBP应⽤中⼀般采⽤LBP特征谱的统计直⽅图作
为特征向量进⾏分类识别,并且可以将⼀幅图⽚划分为若⼲的⼦区域,对每个⼦区域内的每个像素点都提取LBP特征,然后,在每个⼦区域
内建⽴LBP特征的统计直⽅图。如此⼀来,每个⼦区域,就可以⽤⼀个统计直⽅图来进⾏描述,整个图⽚就由若⼲个统计直⽅图组成,这样
做的好处是在⼀定范围内减⼩图像没完全对准⽽产⽣的误差,分区的另外⼀个意义在于我们可以根据不同的⼦区域给予不同的权重,⽐如说
我们认为中⼼部分分区的权重⼤于边缘部分分区的权重,意思就是说中⼼部分在进⾏图⽚匹配识别时的意义更为重⼤。例如:⼀幅
100*100像素⼤⼩的图⽚,划分为10*10=100个⼦区域(可以通过多种⽅式来划分区域),每个⼦区域的⼤⼩为10*10像素;在每个⼦
区域内的每个像素点,提取其LBP特征,然后,建⽴统计直⽅图;这样,这幅图⽚就有10*10个⼦区域,也就有了10*10个统计直⽅图,利
⽤这10*10个统计直⽅图,就可以描述这幅图⽚了。之后,我们利⽤各种相似性度量函数,就可以判断两幅图像之间的相似性了,OpenCV
在LBP⼈脸识别中使⽤的是如下相似度公式:
⾃带的LBPH⼈脸识别算法流程如下:
1.加载数据
⽤vector
注:如果图像对应标签相同证明是同⼀个⼈;
2.训练模型
2.1初始化参数
(1)初始化采样半径(radius=1),邻域⼤⼩(neighbors=8),宽度⽅向和⾼度⽅向格⼦数(gridx=8,gridy=8,),直⽅图距离阈值
(threshold=DBL_MAX)。
(2)利⽤labels初始化模型标签数组_labels。
2.2LBP编码
计算各图像LBP编码图像LBPi,⼤⼩为(w-2*radius,h-2*radius),各像素值计算⽅法如下:
(1)依次计算所有像素坐标第n邻域对应像素偏移坐标(dx,dy)n
(2)双线性差值计算所有像素坐标(x,y)第n邻域的灰度值gray(x,y)n以及编码值:lbp(x,y)n:
lbp(x,y)n=1,(grayx,yn≤gray(x,y)n)
lbp(x,y)n=0,(grayx,yn>gray(x,y)n)
(3)计算所有像素的LBP编码值:
2.3计算直⽅图
各LBPi图像对应直⽅图矩阵HISTi宽度为2neighbors=256,⾼度为gradx*grady
1.计算每个格⼦的宽度和⾼度:
w_grad=/gridx
h_grad=/gridy
(2)按照⾏序统计每个格⼦内直⽅图各值的⾼度,并依次将结果存储在HISTi的每⼀⾏;并对直⽅图⾼度归⼀化,即所有直⽅图⾼度除
以w_grad*h_grad。以⾏为主序将HISTi转换为为1⾏列的向量矩阵。
(3)将所有⼈脸训练图像直⽅图矩阵HISTi插⼊到成员变量_histograms,其中_histograms的⾏数为gradx*grady*2neighbors
,列数为N。
3.更新模型
⾸先设置更新模型图像数据和图像对应标签数据;更新模型算法和训练模型算法⼀致,唯⼀的区别是在训练模型之前不需要
将_labels和_histograms清零。
4.预测
按照3中⽅法计算待识别⼈脸图⽚直⽅图矩阵HISTq,计算HISTq和训练模型中各图像_histogramsi直⽅图之间的距离,记录距离
最dis_min的直⽅图图像对应标签label_min,如果dis_min
之间距离⽅法(opencv函数compareHist)如下:
其中,分别为训练模型第i个直⽅图值为j的直⽅图⾼度和待匹配图像值为j的直⽅图⾼度;len为直⽅图最⼤值。
本文发布于:2023-03-16 13:50:21,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/f8d578851a1ac37e8bf434146aad6e1a.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:人脸识别算法.doc
本文 PDF 下载地址:人脸识别算法.pdf
留言与评论(共有 0 条评论) |