模式识别 - 局部二值模式(Local Binary Patterns) 简介 及 代码
2013-10-25 12:02
555 查看
局部二值模式(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/中文论文: 局部二值模式方法研究与展望 宋克臣
相关文章推荐
- [Android]在代码里运行另一个程序的方法
- 网页恶意代码的预防
- 高手写的Tracer-Flash代码调试类代码下载
- CSS代码缩写技巧
- 非主流Q-zOne代码代码搜集第1/2页
- CreateWeb.vbs 代码
- 更有效率的css代码编写第1/3页
- SQL语言查询基础:连接查询 联合查询 代码
- 论坛头像随机变换代码
- .NET 常用功能和代码小结
- asp编程中常用的javascript辅助代码第1/2页
- C#超实用代码段合集
- Javascript代码在页面加载时的执行顺序介绍
- 我的论坛源代码(二)
- 无边框窗口代码详解
- 利用css实现挂马的代码
- Android 情景模式的设置代码
- 我的论坛源代码(六)
- 我的论坛源代码(七)
- C#计算代码执行时间的方法