局部二值模式(Local Binary Patterns)

 

OpenCV 2.4.6.0 不包含LBP的函数, 但包括使用LBP进行人脸检测的方法.

 

1. 简介

局部二值模式(Local Binary Patterns, LBP)的基本思想是:

定义于像素的8邻域中,以中心像素的灰度值为阈值,将周围8个像素的值与其比较,如果周围的像素值小于中心像素的灰度值,该像素位置就被标记为0,否则标记为1.每个像素得到一个二进制组合,就像00010011.每个像素有8个相邻的像素点,即有2^8种可能性组合,这些组合就被叫做局部二值模式(Local Binary Patterns)或缩写为LBP(LBP codes).如下图所示的例子:

 

2. 代码

 

olbp.hpp

#ifndef __OLBP_HPP__  #define __OLBP_HPP__    #include <opencv.hpp>    using namespace cv;    namespace cv {    	// 计算原始的局部二值模式  	void olbp(InputArray src, OutputArray dst);    	// see cv::olbp(InputArray, OutputArray)  	Mat olbp(InputArray src);    }    #endif


olbp.cpp

#include "olbp.hpp"    namespace cv {    	template <typename _Tp> static  		void olbp_(InputArray _src, OutputArray _dst) {  			Mat src = _src.getMat();  			// 省略两个边界  			_dst.create(src.rows-2, src.cols-2, CV_8UC1);  			Mat dst = _dst.getMat();  			dst.setTo(0);  			for(int i=1;i<src.rows-1;i++) {  				for(int j=1;j<src.cols-1;j++) {  					_Tp center = src.at<_Tp>(i,j);  					unsigned char code = 0;  					// 移位和bit位的或运算  					code |= (src.at<_Tp>(i-1,j-1) >= center) << 7;  					code |= (src.at<_Tp>(i-1,j) >= center) << 6;  					code |= (src.at<_Tp>(i-1,j+1) >= center) << 5;  					code |= (src.at<_Tp>(i,j+1) >= center) << 4;  					code |= (src.at<_Tp>(i+1,j+1) >= center) << 3;  					code |= (src.at<_Tp>(i+1,j) >= center) << 2;  					code |= (src.at<_Tp>(i+1,j-1) >= center) << 1;  					code |= (src.at<_Tp>(i,j-1) >= center) << 0;  					dst.at<unsigned char>(i-1,j-1) = code;  				}  			}  		}    }    void cv::olbp(InputArray src, OutputArray dst) {  	switch (src.getMat().type()) {  	case CV_8SC1:   olbp_<char>(src,dst); break;  	case CV_8UC1:   olbp_<unsigned char>(src,dst); break;  	case CV_16SC1:  olbp_<short>(src,dst); break;  	case CV_16UC1:  olbp_<unsigned short>(src,dst); break;  	case CV_32SC1:  olbp_<int>(src,dst); break;  	case CV_32FC1:  olbp_<float>(src,dst); break;  	case CV_64FC1:  olbp_<double>(src,dst); break;  	default: break;  	}  }    Mat cv::olbp(InputArray src) {  	Mat dst;  	olbp(src, dst);  	return dst;  }


main.cpp

#include "olbp.hpp"    using namespace cv;    int main(){  	cv::Mat src = cv::imread("heels.jpg", CV_LOAD_IMAGE_GRAYSCALE);  	cv::Mat dst;  	cv::olbp(src, dst);  	cv::imshow("Heel", dst);  	cv::waitKey(0);  }


output:

 

3. 参考

网址: http://www.bytefish.de/blog/local_binary_patterns/

中文论文: 局部二值模式方法研究与展望 宋克臣