LBP算子

简介:

局部二值模式(Local
Binary Pattern
, LBP
)是一种有效的纹理描述算子,它具有旋转不变性和灰度不变性的显著的有点。已经广泛的应用于纹理分类、纹理分割、人脸图像分析等领域。本文就LBP算法做简单的讲解,并在opencv中加以实现。

基本的LBP算子

局部二值模式是一种灰度范围内的纹理描述方式。算法的思想是利用结构化思想提取窗口特征,再利用统计化做最终整体特征的提取。

最初的LBP描述子算法步骤如下:

1、对图像中的所有点,以该点为中心,取3x3的邻域窗口;

2、8-邻域像素值与中心点像素值进行比较,大于或等于中心像素标记为1,否则标记为0;

3、将周围0-1序列,以一定的顺序排列,成一个8位的无符号的二进制数,转化成整数;

4、这个整数就是表征这个窗口的LBP值

以上,便是最基本的LBP算子。由于直接利用的灰度比较,所以其具有灰度不变性;但是,有两个很明显的缺点:1、产生的二进制模式多2、不具有旋转不变性。为解决这两个问题,后人对LBP算法做了改进。

当然,上面的8-邻域并不是最好的,但是最基本的,在后面出现了诸如下图所示的邻域,1,2指的是半径,8,16指的是采样点数。

改进的LBP算子

LBP等价模式

考察LBP算子的定义可知,一个LBP算子可以产生多种二进制模式(p个采样点)如:3x3邻域有p=8个采样点,则可得到2^8=256种二进制模式;5x5邻域有24个采样点,则可得到2^24=16777216种二进制模式,以此类推......。显然,过多的二进制模式无论对于纹理的提取还是纹理的识别、分类及信息存取都是不利的,在实际应用中不仅要求采用的算子尽量简单,同时也要考虑到计算速度、存储量大小等问题。因此需要对原始的LBP模式进行降维

      Ojala提出一种“等价模式”(Uniform Pattern)来对LBP算子进行降维,Ojala等认为图像中,某个局部二进制模式所对应的循环二进制数从0到1从1到0,最多有两次跳变,该局部二进制模式所对应的二进制就成为一个等价模式。如00000000,00111000,10001111,11111111等都是等价模式类。判断一个二进制模式是否为等价模式最简单的办法就是将LBP值与其循环移动一位后的值进行按位相与,计算得到的二进制数中1的个数,若个数小于或等于2,则是等价模式;否则,不是。出了等价模式以外的模式都归一一类,称为混合模式类。

通过这种改进,二进制模式的种类大大减少,而不会丢失任何信息,模式种类由原来的2^p减少为p*(p-1)+2种。

但等价模式代表了图像的边缘、斑点、角点等关键模式,等价模式占了总模式中的绝大多数,所以极大的降低了特征维度。利用这些等价模式和混合模式类直方图,能够更好地提取图像的本质特征。

旋转不变的LBP算子

由于LBP的二进制模式是以一定的方向、顺序进行编码的,所以当图像发生旋转时,按这种编码的话,LBP值会发生改变,因此是不具有旋转不变性的。Maenpaa等人提出了具有旋转不变性的LBP算子。

解决办法是:不断旋转邻域得到一系列的LBP值,取其中最小值作为该邻域的LBP值。旋转过程实质上就是对二进制模式进行循环移位的过程。

通过引入旋转不变的定义,使LBP算子更具鲁棒性。但这也是LBP算子丢失了方向信息。在很多场合,方向信息非常重要;然而,在纹理图像分析中,LBP依然被证明是有效的。

实验

opencv代码

通过定义model_rotationmodel_equivalent来进行等价模式和旋转不变性的实现。

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "intrins.h"

using namespace cv;
using namespace std;

#define model_rotation
#define model_equivalent
int main()
{
	Mat img = imread("face.png", IMREAD_GRAYSCALE);//灰度
	Mat pic = Mat::zeros(img.rows, img.cols, img.type());
	imshow("src", img);
	//p1	p2	p3
	//p8	p0	p4
	//p7	p6	p5
	for (int i = 1; i < img.rows - 1; i++)
	{
		for (int j = 1; j < img.cols - 1; j++)
		{
			uchar p[9];

			p[0] = img.at<uchar>(i, j);//中心
			p[1] = img.at<uchar>(i - 1, j - 1);
			p[2] = img.at<uchar>(i - 1, j);
			p[3] = img.at<uchar>(i - 1, j + 1);
			p[4] = img.at<uchar>(i, j + 1);
			p[5] = img.at<uchar>(i + 1, j + 1);
			p[6] = img.at<uchar>(i + 1, j);
			p[7] = img.at<uchar>(i + 1, j - 1);
			p[8] = img.at<uchar>(i, j - 1);

			uchar value = 0;//LBP值
			for (int k = 1; k <= 8; k++)
			{
				value += (p[k] >= p[0]) << (8 - k);
			}
//等价模式
#ifdef model_equivalent
			uchar temp = _cror(value, 1);
			if(_mm_popcnt_u32(temp & value) > 2)//_mm_popcnt_u32计算二进制数1的个数
			{
				pic.at<uchar>(i, j) = value;
			}
#else
			pic.at<uchar>(i, j) = value;
#endif
//旋转不变
#ifdef model_rotation
			uchar rot[8];
			_rota(value, rot);
			pic.at<uchar>(i, j) = _min(rot);
#endif
		}
	}
	imshow("LBP", pic);
	waitKey();

	return 0;
}

其中intrins.hintrins.cpp是循环移位及查找最小值的源代码。

intrins.h

#ifndef __INTRINS_H__
#define __INTRINS_H__

#include <cv.h>
using namespace std;

uchar _crol(uchar tmp, uchar n);
uchar _crol_bit(uchar tmp);
uchar _cror(uchar tmp, uchar n);
uchar _cror_bit(uchar tmp);
void _rota(uchar tmp, uchar *temp);
uchar _min(uchar *tmp);

#endif

intrins.cpp

#include "intrins.h"

//循环左移n位
uchar _crol(uchar tmp, uchar n)
{
	while(n--)
	{
		tmp = _crol_bit(tmp);
	}
	return tmp;
}
//循环左移1位
uchar _crol_bit(uchar tmp)
{
	return (tmp << 1) | (tmp >> 7);
}
//循环右移n位
uchar _cror(uchar tmp, uchar n)
{
	while(n--)
	{
		tmp = _cror_bit(tmp);
	}
	return tmp;
}
//循环右移1位
uchar _cror_bit(uchar tmp)
{
	return (tmp >> 1) | (tmp << 7);
}
//循环移位(旋转)
void _rota(uchar tmp, uchar *temp)
{
	for (int i = 0; i < 8; i++)
	{
		*temp = _cror(tmp, i);
		temp++;
	}
}
//找到最小值
uchar _min(uchar *tmp)
{
	uchar min = *tmp;
	for (int i = 0; i < 8; i++)
	{
		tmp++;
		if (min > *tmp)
		{
			min = *tmp;
		}
	}
	return min;
}

结果:

依次是:原图、等价模式、旋转不变、等价+旋转不变(注:此处等价模式未进行任何的等价处理)

参考文献:

1、黄菲菲,基于LBP的人脸识别研究[M],2009.

2、程雪峰,基于LBP特征的人脸识别算法研究[M],2014.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 21:13:06

LBP算子的相关文章

CV:object detection(LBP)

LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子:它具有旋转不变性和灰度不变性等显著的优点.它是首先由T. Ojala, M.Pietik?inen, 和 D. Harwood 在1994年提出,用于纹理特征提取.而且,提取的特征是图像的局部的纹理特征: 1.LBP特征的描述 原始的LBP算子定义为在3*3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0.这样

转载:LBP的初步理解

转自http://blog.csdn.net/ty101/article/details/8905394 本文的PDF版本,以及涉及到的所有文献和代码可以到下列地址下载: 1.PDF版本以及文献:http://download.csdn.net/detail/ty101/5349816 2.原作者的MATLAB代码:http://download.csdn.net/detail/ty101/5349894 LBP一种用来描述图像纹理特征的算子,该算子由芬兰奥卢大学的T.Ojala等人在1996年

图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

(一)HOG特征 1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和统计图像局部区域的梯度方向直方图来构成特征.Hog特征结合 SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功.需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal 在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM

基于OpenCV2:实现7种差异描述算子

最近在一些机器视觉群中的一些小伙伴们多次问到opencv是否集成了LBP算法,据我了解opencv没有单独的LBP特征描述算法实现,都是和一些应用结合,如人脸识别,检测等,这些都是一些论文的研究成果,针对于特定的应用,这对于想将LBP特征描述用到自己的应用中的伙伴来说,或许不太方便.opencv也没有一个单独的特征描述这样的一个module,这或许限制了使用opencv的灵活性,而且个人体会视觉问题最终根本的问题都落在了特征描述这样的一个最基本的问题,包括近几年很火的深度学习,其解决的最根本问题

图像提取特LBP征

LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子:它具有旋转不变性和灰度不变性等显著的优点.它是首先由T. Ojala, M.Pietik?inen, 和D. Harwood 在1994年提出,用于纹理特征提取.而且,提取的特征是图像的局部的纹理特征: 1.LBP特征的描述 原始的LBP算子定义为在3*3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素 点的位置被标记为1,否则为0.这样

EasyPR源码剖析(6):车牌判断之LBP特征

一.LBP特征 LBP指局部二值模式,英文全称:Local Binary Pattern,是一种用来描述图像局部特征的算子,LBP特征具有灰度不变性和旋转不变性等显著优点. 原始的LBP算子定义在像素3*3的邻域内,以邻域中心像素为阈值,相邻的8个像素的灰度值与邻域中心的像素值进行比较,若周围像素大于中心像素值,则该像素点的位置被标记为1,否则为0.这样,3*3邻域内的8个点经过比较可产生8位二进制数,将这8位二进制数依次排列形成一个二进制数字,这个二进制数字就是中心像素的LBP值,LBP值共有

图像处理之图像特征提取之(二)LBP特征

LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子:它具有旋转不变性和灰度不变性等显著的优点.它是首先由T. Ojala, M.Pietik?inen, 和D. Harwood 在1994年提出,用于纹理特征提取.而且,提取的特征是图像的局部的纹理特征: 1.LBP特征的描述 原始的LBP算子定义为在3*3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0.这样,

图像物体检测识别中的LBP特征

1        引言 之前讲了人脸识别中的Haar特征,本文则关注人脸检测中的LBP特征,说是对于人脸检测的,其实对于其他物体也能检测,只需修改训练数据集即可.所以本文的题目是物体检测识别,比如可以检测是否汽车是否有车牌号等. 在opencv实现的haar特征的人脸识别算法中,LBP特征也被支持. haar特征的博文链接:http://blog.csdn.net/stdcoutzyx/article/details/34842233. 2        LBP的历史 1996年,Ojala老大

【计算机视觉】LBP纹理特征

LBP简介 LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子:它具有旋转不变性和灰度不变性等显著的优点.它是首先由T. Ojala, M.Pietik?inen,和 D. Harwood 在1994年提出,用于纹理特征提取.而且,提取的特征是图像的局部的纹理特征. 从纹理分析的角度来看,图像上某个像素点的纹理特征,大多数情况下是指这个点和周围像素点的关系,即这个点和它的邻域内点的关系.从哪个角度对这种关系提取特征,就形成了不同种类的特征.有了特