第三种算法称之为LBP算法,这个算法的思路与PCA和Fisher有很大不同,他是考虑局部特征算子,并不是全局考虑。

这种算法定义了一种LBP特征,这种特征与我们经常见到的Haar特征、HoG特征没有啥太大不同,都是特征算子,只是算法不同。因此,我们按照理解特征算子一类的算法去理解LBP就可以了。

注意,LBP对关照不敏感,为什么?因为LBP算子是一种相对性质的数量关系,相比于PCA或者Fsiher,直接使用灰度值去参与运算,LBP更能反映出的是一种变化趋势。

最后一次当个搬运工

http://blog.csdn.net/feirose/article/details/39552977,LBP算子写的不算太清楚,但是整个算法的完整流程讲明白了,而且最后如何判定的直方图交叉核和卡方检验都有说明。

http://blog.csdn.net/pi9nc/article/details/18623971,这个博客的LBP算子说得很好,而且有opencv的例程。

注意,这里的样本图像组织形式与前面两个算法又有不同,因为他不需要把图像变成列向量,因此图像矩阵不需要做什么处理就可以加入列表备用了。

代码如下:

#encoding=utf-8
import numpy as np
import os
import cv2class LBP(object):def __init__(self,threshold,dsize,blockNum):self.dsize = dsize # 统一尺寸大小self.blockNum = blockNum # 分割块数目self.threshold = threshold # 阈值,暂未使用def loadImg(self,fileName,dsize):'''载入图像,灰度化处理,统一尺寸,直方图均衡化:param fileName: 图像文件名:param dsize: 统一尺寸大小。元组形式:return: 图像矩阵'''img = cv2.imread(fileName)retImg = cv2.resize(img,dsize)retImg = cv2.cvtColor(retImg,cv2.COLOR_RGB2GRAY)retImg = cv2.equalizeHist(retImg)# cv2.imshow('img',retImg)# cv2.waitKey()return retImgdef loadImagesList(self,dirName):'''加载图像矩阵列表:param dirName:文件夹路径:return: 包含最原始的图像矩阵的列表和标签矩阵'''imgList = []label = []for parent,dirnames,filenames in os.walk(dirName):# print parent# print dirnames# print filenamesfor dirname in dirnames:for subParent,subDirName,subFilenames in os.walk(parent+'/'+dirname):for filename in subFilenames:img = self.loadImg(subParent+'/'+filename,self.dsize)imgList.append(img) # 原始图像矩阵不做任何处理,直接加入列表label.append(subParent+'/'+filename)return imgList,labeldef getHopCounter(self,num):'''计算二进制序列是否只变化两次:param num: 数字:return: 01变化次数'''binNum = bin(num)binStr = str(binNum)[2:]n = len(binStr)if n < 8:binStr = "0"*(8-n)+binStrn = len(binStr)counter = 0for i in range(n):if i != n-1:if binStr[i+1] != binStr[i]:counter += 1else:if binStr[0] != binStr[i]:counter += 1return counterdef createTable(self):'''生成均匀对应字典:return: 均匀LBP特征对应字典'''self.table = {}temp = 1print type(temp)for i in range(256):if self.getHopCounter(i) <= 2:self.table[i] = temptemp += 1else:self.table[i] = 0return self.tabledef getLBPfeature(self,img):'''计算LBP特征:param img:图像矩阵:return: LBP特征图'''m = img.shape[0];n = img.shape[1]neighbor = [0]*8featureMap = np.mat(np.zeros((m,n)))for y in xrange(1,m-1):for x in xrange(1,n-1):neighbor[0] = img[y-1,x-1]neighbor[1] = img[y-1,x]neighbor[2] = img[y-1,x+1]neighbor[3] = img[y,x+1]neighbor[4] = img[y+1,x+1]neighbor[5] = img[y+1,x]neighbor[6] = img[y+1,x-1]neighbor[7] = img[y,x-1]center = img[y,x]temp = 0for k in range(8):temp += (neighbor[k] >= center)*(1<<k)featureMap[y,x] = self.table[temp]featureMap = featureMap.astype('uint8') # 数据类型转换为无符号8位型,如不转换则默认为float64位,影响最终效果return featureMapdef calcHist(self,roi):'''计算直方图:param roi:图像区域:return: 直方图矩阵'''hist = cv2.calcHist([roi],[0],None,[59],[0,256]) # 第四个参数是直方图的横坐标数目,经过均匀化降维后这里一共有59种像素return histdef compare(self,sampleImg,testImg):'''比较函数,这里使用的是欧氏距离排序,也可以使用KNN,在此处更改:param sampleImg: 样本图像矩阵:param testImg: 测试图像矩阵:return: k2值'''testImg = cv2.resize(testImg,self.dsize)testImg = cv2.cvtColor(testImg,cv2.COLOR_RGB2GRAY)testFeatureMap = self.getLBPfeature(testImg)sampleFeatureMap = self.getLBPfeature(sampleImg)# 计算步长,分割整个图像为小块ystep = self.dsize[0]/self.blockNumxstep = self.dsize[1]/self.blockNumk2 = 0for y in xrange(0,self.dsize[0],ystep):for x in xrange(0,self.dsize[1],xstep):testroi = testFeatureMap[y:y+ystep,x:x+xstep]sampleroi =sampleFeatureMap[y:y+ystep,x:x+xstep]testHist = self.calcHist(testroi)sampleHist = self.calcHist(sampleroi)k2 += np.sum((sampleHist-testHist)**2)/np.sum((sampleHist+testHist))print 'k2的值为',k2return k2def predict(self,dirName,testImgName):'''预测函数:param dirName:样本图像文件夹路径:param testImgName: 测试图像文件名:return: 最相近图像名称'''table = self.createTable()testImg = cv2.imread(testImgName)imgList,label = self.loadImagesList(dirName)k2List = []for img in imgList:k2 = self.compare(img,testImg)k2List.append(k2)order = np.argsort(k2List)return label[order[0]]if __name__ == "__main__":lbp = LBP(20,(50,50),5)ans = lbp.predict('d:/face','d:/face_test/9.bmp')print ans

人脸识别经典算法实现(三)——LBP算法相关推荐

  1. 人脸识别经典算法二:LBP方法

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

  2. python人脸识别特征脸法_人脸识别经典算法一 特征脸方法(Eigenface)

    这篇文章是撸主要介绍人脸识别经典方法的第一篇,后续会有其他方法更新.特征脸方法基本是将人脸识别推向真正可用的第一种方法,了解一下还是很有必要的.特征脸用到的理论基础PCA在另一篇博客里:特征脸(Eig ...

  3. 人脸识别系列二 | FisherFace,LBPH算法及Dlib人脸检测

    前言 前面介绍了使用特征脸法进行人脸识别,这里介绍一下OpenCV人脸识别的另外两种算法,一种是FisherFace算法,一种是LBPH算法. FisherFace算法 FisherFace是基于线性 ...

  4. 人脸识别经典算法一:特征脸方法(Eigenface)

    这篇文章是撸主要介绍人脸识别经典方法的第一篇,后续会有其他方法更新.特征脸方法基本是将人脸识别推向真正可用的第一种方法,了解一下还是很有必要的.特征脸用到的理论基础PCA在另一篇博客里:特征脸(Eig ...

  5. A*算法(三)算法实现

    A*算法(三)算法实现 1. Array2D类 2. Point类 3. AStar类 3.1 Node类 3.2 初始化处理 3.3 判断函数 3.4 搜索结点周围的点 3.5 寻路 4. 地图显示 ...

  6. python人脸识别特征脸法_人脸识别经典算法:特征脸方法(Eigenface)

    特征脸方法基本是将人脸识别推向真正可用的第一种方法,了解一下还是很有必要的.特征脸用到的理论基础PCA在之前的文章中已经讲过了.直接上特征脸方法的步骤: 步骤一:获取包含M张人脸图像的集合S.在我们的 ...

  7. 基于OpenCV人脸识别Eigenfaces(特征脸)算法、Fisherfaces算法、Local Binary, Patter Histogram(LBPH)算法认识

    一.Eigenfaces(特征脸)算法 在如今的世界,人脸识别也变得越来越重要,应用越来越广泛,比如人脸识别可用于身份认证.摄影.支付.视频等领域.现在人脸识别一般采用三种经典算法:Eigenface ...

  8. 人脸识别干货讲解:活体检测算法总结

    这些年,我们可以看到人脸识别在超市.高铁站.机场等场所的应用,大大提高了我们购物和出行的效率,但同时也带来了人脸识别的安全隐患,尤其是在金融支付领域.很多头部大厂都在争夺这方面的制高点,刷脸支付领域是 ...

  9. 人脸识别技术中的Gabor特征提取算法

    前言 上篇文章中,讲述了语音识别技术中的DTW算法,DTW算法是用于模板匹配的.这篇文章我们将介绍人脸识别中的Gabor特征提取算法,Gabor算法是用在特征提取阶段.我们在这里对比一下语音识别的流程 ...

  10. 【CV秋季划】人脸识别经典难题介绍,抗遮挡,跨年龄,异质源,少样本等

    本次给大家带来的是有三AI-CV秋季划-人脸算法组的人脸识别下期的内容,如果你还不知道有三AI-CV秋季划-人脸算法组是什么,可以看下面的视频和图文. [CV秋季划]人脸算法那么多,如何循序渐进地学习 ...

最新文章

  1. 机器学习知识点(二)各类型平均数Java实现
  2. 简单爬虫-爬取免费代理ip
  3. ios动画效果集锦(持续更新)
  4. 据说这是史上最牛逼的可视化神器
  5. android ListView常用知识总结
  6. 第一天,搬家到博客园
  7. paip.python错误解决10
  8. Android计算器设计实验报告
  9. 「雷军万字总结」小米十周年公开演讲全文
  10. 华为EC1261使用小记
  11. 《性能之巅—洞悉系统、企业与云计算》读书笔记---第二章
  12. ElementUI表格吸顶(sticky)
  13. Visual C++ 2010 第8章 深入理解类
  14. 设置不了谷歌浏览器为默认浏览器
  15. 命运2服务器维护2021,命运2 2021年3月17日更新内容详解 冰影系列削弱一览[多图]...
  16. 宝付受邀参加图书馆计划十周年庆典
  17. Jarvis OJ 软件密码破解-1
  18. ehd边缘直方图描述子 matlab,第 2 章 局部图像描述子
  19. 忍者x3,SDCMS2.0发布模块,使用说明
  20. 通过 IMEI 码 看手机生产地!

热门文章

  1. SanDisk U盘加密软件 在其他u盘使用
  2. 百度文库免费下载方法,亲测可用!建议收藏!
  3. CAN(FD)收发器选型及替换指南(一)
  4. 动手学深度学习(三十四)——序列模型
  5. 四.川.木.里-2020-03-28火灾遥感数据下载汇总
  6. 数据库系统概论第五版第二章答案王珊
  7. win7修复计算机无法修复工具栏,WIN7多系统启动引导修复工具BCDautofix v1.3
  8. 张宇真题全解(纯题目)
  9. 离散数学 习题篇 —— 集合相等与子集关系判断
  10. 数字电子技术基础(九):竞争—冒险现象成因及消除