简要介绍
LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子,具有旋转不变性和灰度不变性等显著优点。首先由T. Ojala, M.Pietikäinen, 和D. Harwood 在1994年提出,用于纹理特征提取。主要应用于人脸识别和目标检测中,OpenCV中有使用LBP特征进行人脸识别的接口,也有用LBP特征训练目标检测分类器的方法,Opencv实现了LBP特征的计算,但没有提供一个单独的计算LBP特征的接口。
原始LBP
在 3×3 的窗口中,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。可以产生8位二进制数,将其转化为十进制数便得到了LBP编码(256种),如下图左上角开始遍历组成2进制数,转化为10进制后为124。
具体的,其数学表达可写作:
LBP(xc,yc)=∑p=0p−12ps(ip−ic)
其中, (xc,yc) 为中心像素的坐标, p 为邻域的第p个像素,
s(x)={
1,0,x>=0x<0
代码实现如下:
void orLBP(Mat& src, Mat &dst)
{
// 循环处理图像数据
for (int i = 1; i < src.rows - 1; i++)
{
for (int j = 1; j < src.cols - 1; j++)
{
uchar center = src.at<uchar>(i, j);
unsigned char lbpCode = 0;
lbpCode |= (src.at<uchar>(i - 1, j - 1) > center) << 7;
lbpCode |= (src.at<uchar>(i - 1, j) > center) << 6;
lbpCode |= (src.at<uchar>(i - 1, j + 1) > center) << 5;
lbpCode |= (src.at<uchar>(i, j + 1) > center) << 4;
lbpCode |= (src.at<uchar>(i + 1, j + 1) > center) << 3;
lbpCode |= (src.at<uchar>(i + 1, j) > center) << 2;
lbpCode |= (src.at<