LBP(Local Binary Patterns,局部二值模式)是提取局部特征作为判别依据的。LBP方法显著的优点是对光照不敏感,但是依然没有解决姿态和表情的问题。不过相比于特征脸方法,LBP的识别率已经有了很大的提升。在[1]的文章里,有些人脸库的识别率已经达到了98%+。

1、LBP特征提取

最初的LBP是定义在像素3x3邻域内的,以邻域中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3x3邻域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共256种),即得到该邻域中心像素点的LBP值,并用这个值来反映该区域的纹理信息。如下图所示:

用比较正式的公式来定义的话:

其中代表3x3邻域的中心元素,它的像素值为ic,ip代表邻域内其他像素的值。s(x)是符号函数,定义如下:

LBP的改进版本

(1)圆形LBP算子

基本的 LBP算子的最大缺陷在于它只覆盖了一个固定半径范围内的小区域,这显然不能满足不同尺寸和频率纹理的需要。为了适应不同尺度的纹理特征,并达到灰度和旋转不变性的要求,Ojala等对 LBP 算子进行了改进,将 3×3邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域,改进后的 LBP 算子允许在半径为 R 的圆形邻域内有任意多个像素点。从而得到了诸如半径为R的圆形区域内含有P个采样点的LBP算子。比如下图定了一个5x5的邻域:

上图内有八个黑色的采样点,每个采样点的值可以通过下式计算:

其中为邻域中心点,为某个采样点。通过上式可以计算任意个采样点的坐标,但是计算得到的坐标未必完全是整数,所以可以通过双线性插值来得到该采样点的像素值:

(2)LBP等价模式

一个LBP算子可以产生不同的二进制模式,对于半径为R的圆形区域内含有P个采样点的LBP算子将会产生2^P种模式。很显然,随着邻域集内采样点数的增加,二进制模式的种类是急剧增加的。例如:5×5邻域内20个采样点,有220=1,048,576种二进制模式。如此多的二值模式无论对于纹理的提取还是对于纹理的识别、分类及信息的存取都是不利的。同时,过多的模式种类对于纹理的表达是不利的。例如,将LBP算子用于纹理分类或人脸识别时,常采用LBP模式的统计直方图来表达图像的信息,而较多的模式种类将使得数据量过大,且直方图过于稀疏。因此,需要对原始的LBP模式进行降维,使得数据量减少的情况下能最好的代表图像的信息。

为了解决二进制模式过多的问题,提高统计性,Ojala提出了采用一种“等价模式”(Uniform Pattern)来对LBP算子的模式种类进行降维。Ojala等认为,在实际图像中,绝大多数LBP模式最多只包含两次从1到0或从0到1的跳变。因此,Ojala将“等价模式”定义为:当某个LBP所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该LBP所对应的二进制就称为一个等价模式类。如00000000(0次跳变),00000111(只含一次从0到1的跳变),10001111(先由1跳到0,再由0跳到1,共两次跳变)都是等价模式类。除等价模式类以外的模式都归为另一类,称为混合模式类,例如10010111(共四次跳变)。比如下图给出了几种等价模式的示意图。

通过这样的改进,二进制模式的种类大大减少,而不会丢失任何信息。模式数量由原来的2P种减少为 P ( P-1)+2种,其中P表示邻域集内的采样点数。对于3×3邻域内8个采样点来说,二进制模式由原始的256种减少为58种,这使得特征向量的维数更少,并且可以减少高频噪声带来的影响。这几段摘自[2]。

通过上述方法,每个像素都会根据邻域信息得到一个LBP值,如果以图像的形式显示出来可以得到下图,明显LBP对光照有较强的鲁棒性。

2、LBP特征匹配

如果将以上得到的LBP值直接用于人脸识别,其实和不提取LBP特征没什么区别,会造成计算量准确率等一系列问题。文献[1]中,将一副人脸图像分为7x7的子区域(如下图),并在子区域内根据LBP值统计其直方图,以直方图作为其判别特征。这样做的好处是在一定范围内避免图像没完全对准的情况,同时也对LBP特征做了降维处理。

对于得到的直方图特征,有多种方法可以判别其相似性,假设已知人脸直方图为Mi​,待匹配人脸直方图为Si,那么可以通过:

(1)直方图交叉核方法

该方法的介绍在博文:Histogram intersection(直方图交叉核,Pyramid Match Kernel)

(2)卡方统计方法

该方法的介绍在博文:卡方检验(Chi square statistic)

参考文献:

[1]Timo Ahonen, Abdenour Hadid:Face Recognition with Local Binary Patterns

[2]目标检测的图像特征提取之(二)LBP特征

图像分析:LBP特征解析与代码

以下参考:https://blog.csdn.net/fabulousli/article/details/51130171

LBP是一种简单,有效的纹理分类的特征提取算法。LBP算子是由Ojala等人于1996年提出的,主要的论文是"Multiresolution gray-scale and rotation invariant texture classification with local binary patterns", pami, vol 24, no.7, July 2002。LBP就是"local binary pattern"的缩写。局部二值模式是一个简单但非常有效的纹理运算符。它将各个像素与其附近的像素进行比较,并把结果保存为二进制数。由于其辨别力强大和计算简单,局部二值模式纹理算子已经在不同的场景下得到应用。LBP最重要的属性是对诸如光照变化等造成的灰度变化的鲁棒性。它的另外一个重要特性是它的计算简单,这使得它可以对图像进行实时分析。

局部二值模式特征向量可以通过如下方式计算:
        1.将检测窗口切分为区块(cells,例如,每个区块16x16像素)。
        2.对区块中的每个像素,与它的八个邻域像素进行比较(左上、左中、左下、右上等)。可以按照顺时针或者逆时针的顺序进行比较。
        3.对于中心像素大于某个邻域的,设置为1;否则,设置为0。这就获得了一个8位的二进制数(通常情况下会转换为十进制数字),作为该位置的特征。
        4.对每一个区块计算直方图。
        5.此时,可以选择将直方图归一化;
        6.串联所有区块的直方图,这就得到了当前检测窗口的特征向量。
        对图像中的每个像素,通过计算以其为中心的3*3邻域内各像素和中心像素的大小关系,把像素的灰度值转化为一个八位二进制序列。具体计算过程如下图所示,对于图像的任意一点Ic,其LBP特征计算为,以Ic为中心,取与Ic相邻的8各点,按照顺时针的方向记为 I0,I1,...,I7;以Ic点的像素值为阈值,如果 Ii 点的像素值小于Ic,则 Ii 被二值化为0,否则为1;将二值化得到的0、1序列看成一个8位二进制数,将该二进制数转化为十进制就可得到Ic点处的LBP算子的值。
  基本的LBP算子只局限在3*3的邻域内,对于较大图像大尺度的结构不能很好的提取需要的纹理特征,因此研究者们对LBP算子进行了扩展。新的LBP算子LBP(P,R) 可以计算不同半径邻域大小和不同像素点数的特征值,其中P表示周围像素点个数,R表示邻域半径,同时把原来的方形邻域扩展到了圆形,下图给出了四种扩展后的LBP例子,其中,R可以是小数,对于没有落到整数位置的点,根据轨道内离其最近的两个整数位置像素灰度值,利用双线性差值的方法可以计算它的灰度值。

LBP(P,R)有2^p个值,也就是说图像共有2^p种二进制模型,然而实际研究中发现,所有模式表达信息的重要程度是不同的,统计研究表明,一幅图像中少数模式特别集中,达到总模式的百分之九十左右的比例,Ojala等人定义这种模式为Uniform模式,如果一个二进制序列看成一个圈时,0-1以及1-0的变化出现的次数总和不超过两次,那么这个序列就是Uniform模式 ,比如,00000000、00011110、00100001、11111111,在使用LBP表达图像纹理时,通常只关心Uniform模式,而将所有其他的模式归到同一类中。
        LBP算子利用了周围点与该点的关系对该点进行量化。量化后可以更有效地消除光照对图像的影响。只要光照的变化不足以改变两个点像素值之间的大小关系,那么LBP算子的值不会发生变化,所以一定程度上,基于LBP的识别算法解决了光照变化的问题,但是当图像光照变化不均匀时,各像素间的大小关系被破坏,对应的LBP模式也就发生了变化。

void elbp(Mat& src, Mat &dst, int radius, int neighbors)
{
 
    for (int n = 0; n < neighbors; n++)
    {
        // 采样点的计算
        float x = static_cast<float>(-radius * sin(2.0*CV_PI*n / static_cast<float>(neighbors)));
        float y = static_cast<float>(radius * cos(2.0*CV_PI*n / static_cast<float>(neighbors)));
        // 上取整和下取整的值
        int fx = static_cast<int>(floor(x));
        int fy = static_cast<int>(floor(y));
        int cx = static_cast<int>(ceil(x));
        int cy = static_cast<int>(ceil(y));
        // 小数部分
        float ty = y - fy;
        float tx = x - fx;
        // 设置插值权重
        float w1 = (1 - tx) * (1 - ty);
        float w2 = tx  * (1 - ty);
        float w3 = (1 - tx) *      ty;
        float w4 = tx  *      ty;
        // 循环处理图像数据
        for (int i = radius; i < src.rows - radius; i++)
        {
            for (int j = radius; j < src.cols - radius; j++)
            {
                // 计算插值
                float t = static_cast<float>(w1*src.at<uchar>(i + fy, j + fx) + w2*src.at<uchar>(i + fy, j + cx) + w3*src.at<uchar>(i + cy, j + fx) + w4*src.at<uchar>(i + cy, j + cx));
                // 进行编码
                dst.at<uchar>(i - radius, j - radius) += ((t > src.at<uchar>(i, j)) || (std::abs(t - src.at<uchar>(i, j)) < std::numeric_limits<float>::epsilon())) << n;
            }
        }
    }
}
 
void elbp1(Mat& src, Mat &dst)
{
 
    // 循环处理图像数据
    for (int i = 1; i < src.rows - 1; i++)
    {
        for (int j = 1; j < src.cols - 1; j++)
        {
            uchar tt = 0;
            int tt1 = 0;
            uchar u = src.at<uchar>(i, j);
            if (src.at<uchar>(i - 1, j - 1)>u) { tt += 1 << tt1; }
            tt1++;
            if (src.at<uchar>(i - 1, j)>u) { tt += 1 << tt1; }
            tt1++;
            if (src.at<uchar>(i - 1, j + 1) > u) { tt += 1 << tt1; }
            tt1++;
            if (src.at<uchar>(i, j + 1) > u) { tt += 1 << tt1; }
            tt1++;
            if (src.at<uchar>(i + 1, j + 1) > u) { tt += 1 << tt1; }
            tt1++;
            if (src.at<uchar>(i + 1, j) > u) { tt += 1 << tt1; }
            tt1++;
            if (src.at<uchar>(i + 1, j - 1) > u) { tt += 1 << tt1; }
            tt1++;
            if (src.at<uchar>(i - 1, j) > u) { tt += 1 << tt1; }
            tt1++;
 
            dst.at<uchar>(i - 1, j - 1) = tt;
        }
    }
}

LBP算法 人脸识别特征提取相关推荐

  1. LBP算法(人脸识别特征提取)

    LBP(Local Binary Patterns,局部二值模式)是提取局部特征作为判别依据的.LBP方法显著的优点是对光照不敏感,但是依然没有解决姿态和表情的问题.不过相比于特征脸方法,LBP的识别 ...

  2. linux小波识别算法,人脸识别相关技术之小波变换

    一.图像/矩阵进行Haar小波的基本原理 小波分析的基本思想是用一族函数表示或逼近信号或函数.这一函数族称为小波函数系(小波基),它是通过一个基本小波函数的不同尺度伸缩和平移而形成的.小波变换的实质是 ...

  3. 【人脸识别】基于主成分分析PCA算法人脸识别门禁系统含Matlab源码

    1 简介 人脸是反应人身份的最直接的,最可靠的信息资源.通过人脸我们可以很快辨识一个人,这就是所谓的人脸识别.最初的人脸研究人员是一些从事社会心理学的工作者,从20世纪50年代开始有一些文献资料陆续发 ...

  4. 目标检测算法——人脸识别数据集汇总(附下载链接)

    >>>深度学习Tricks,第一时间送达<<<

  5. 3d人脸识别算法opencv_热招职位算法类

    1.资深算法工程师leader-AI平台 地点:深圳 工作职责 1.推进机器学习及计算机视觉领域的核心算法: 2.构建机器学习及计算机视觉领域的关键应用: 3.将算法于实际应用场景相结合,构建算法和应 ...

  6. 【计算机视觉】基于OpenCV的人脸识别

    一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从 ...

  7. OpenCV深度学习人脸识别示例——看大佬如何秀恩爱

    (欢迎关注"我爱计算机视觉"公众号,一个有价值有深度的公众号~) 提到OpenCV人脸识别,你是否还停留在Haar级联人脸检测+LBP特征人脸识别上?对于小规模数据库如何用Open ...

  8. c语言回溯实验报告,实验报告: 人脸识别方法回溯与实验分析 【OpenCV测试方法源码】...

    实验报告: 人脸识别方法回顾与实验分析 [OpenCV测试方法源码] 趁着还未工作,先把过去做的东西整理下出来~ (涉及个人隐私,源码不包含测试样本,请谅解~) 对实验结果更感兴趣的朋友请直接看第5章 ...

  9. 实验报告: 人脸识别方法回顾与实验分析 【OpenCV测试方法源码】

    趁着还未工作,先把过去做的东西整理下出来~   Github源码:https://github.com/Blz-Galaxy/OpenCV-Face-Recognition (涉及个人隐私,源码不包含 ...

  10. [转]人脸识别中的活体检测

    https://zhuanlan.zhihu.com/p/25401788 早在指纹识别应用中就有针对于活体手指的检测技术,即使机器只对真人活体指纹产生识别反应,对其他一切物质不作识别,用于指纹识别产 ...

最新文章

  1. 【原】创建Hive表,分号分隔符“;”引起的异常
  2. oracleI基础入门(1)--背景
  3. C++ 的关键字(保留字)完整介绍
  4. 滚动的组件_微信小程序开发实战(11):滚动组件(picker)
  5. mvc EF 从数据库更新实体,添加视图实体时添加不上的问题
  6. angularjs的ng-repeat回调
  7. python扩展文件_1. 使用 C 或 C++ 扩展 Python
  8. org.hibernate.MappingException: Could not determine type for: java.util.List, at table: user, for...
  9. Linux内核编译与安装[转]
  10. fgetc和fputc函数
  11. FusionChartsFree例子
  12. FTP命令详解(含操作实例)
  13. java wps haspassword,#在WPS表格里面设置了密码怎么取消#excel解除密码保护
  14. android+表情符号乱码,Android Emoji表情截取不完整,乱码
  15. 为什么阿里云域名解析48小时还没有生效?
  16. 北京新版城市总体规划解读
  17. 机器如何猜你所想?阿里小蜜预测平台揭秘
  18. 高企税务核查内容有哪些?
  19. Linux下Mysql启动、关闭、重启指令
  20. 【Java】不可变类(immutable)总结

热门文章

  1. C# 对象与JSON串互相转换(转)
  2. rx550 黑苹果_黑苹果Hackintosh显卡入手指南
  3. 陀螺精选 | 2020年最值得重读的10篇文章
  4. eclipse汉化.设置为中文 简单好操作 java初学者看过来
  5. JDK官网下载与安装过程
  6. cs231n svm作业笔记
  7. Java代码规范之编程规约
  8. 国寿鸿寿年金保险(分红型)
  9. 经典遗传算法及MATLAB实例
  10. 毕马威深度解读北京自贸试验区方案