局部二值模式(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/
中文论文: 局部二值模式方法研究与展望 宋克臣