局部二值模式LBP(Local Binary Pattern)实现代码
2017-07-20 14:29
471 查看
局部二值模式LBP由于其简单、高效在目标检测、目标识别、图像检索等领域得到了广泛的应用。现如今,LBP的变体不下上十种,如VLBP、SILBP等。要了解更多关于LBP的知识可以参考:纹理分类-全局特征LBP及相关文献。
下面介绍的三种LBP算子的区别见下图:
本文不介绍LBP的理论知识,只是简单的说说LBP及其变体的实现:
1)最原始的LBP算子的实现代码
[cpp]
view plain
copy
void lbp( Mat& _src, Mat& _dst)
{
if ( -_dst.empty())
_dst.create(_src.rows, _src.cols, CV_8UC1);
_dst = cv::Scalar::all(0);
// calculate patterns
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 code = 0;
code |= (_src.at<uchar>(i-1,j-1) >= center) << 7;
code |= (_src.at<uchar>(i-1,j) >= center) << 6;
code |= (_src.at<uchar>(i-1,j+1) >= center) << 5;
code |= (_src.at<uchar>(i,j+1) >= center) << 4;
code |= (_src.at<uchar>(i+1,j+1) >= center) << 3;
code |= (_src.at<uchar>(i+1,j) >= center) << 2;
code |= (_src.at<uchar>(i+1,j-1) >= center) << 1;
code |= (_src.at<uchar>(i,j-1) >= center) << 0;
_dst.at<unsigned char>(i,j) = code;
}
}
}
2)带有容忍银子的LBP算子
[cpp]
view plain
copy
void lbp_with_factor( Mat& _src, Mat& _dst, uchar factor) // factor default 3
{
if ( -_dst.empty())
_dst.create(_src.rows, _src.cols, CV_8UC1);
_dst = cv::Scalar::all(0);
// calculate patterns
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)+factor;
unsigned char code = 0;
code |= (_src.at<uchar>(i-1,j-1) >= center) << 7;
code |= (_src.at<uchar>(i-1,j) >= center) << 6;
code |= (_src.at<uchar>(i-1,j+1) >= center) << 5;
code |= (_src.at<uchar>(i,j+1) >= center) << 4;
code |= (_src.at<uchar>(i+1,j+1) >= center) << 3;
code |= (_src.at<uchar>(i+1,j) >= center) << 2;
code |= (_src.at<uchar>(i+1,j-1) >= center) << 1;
code |= (_src.at<uchar>(i,j-1) >= center) << 0;
_dst.at<unsigned char>(i,j) = code;
}
}
}
3)带有乘性因子的LBP算子
[cpp]
view plain
copy
// 这里需要采用2个字符来编码,如00、01、10、11
void lbp_with_factor( Mat& _src, Mat& _dst, float factor) // facotr default 0.1
{
if ( -_dst.empty())
_dst.create(_src.rows, _src.cols, CV_8UC1);
_dst = cv::Scalar::all(0);
// calculate patterns
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);
int up = center*(1.0+factor);
int down = center*(1.0+factor);
unsigned char code = 0;
/*code |= (_src.at<uchar>(i-1,j-1) >= center ) << 7;
code |= (_src.at<uchar>(i-1,j) >= center) << 6;
code |= (_src.at<uchar>(i-1,j+1) >= center) << 5;
code |= (_src.at<uchar>(i,j+1) >= center) << 4;
code |= (_src.at<uchar>(i+1,j+1) >= center) << 3;
code |= (_src.at<uchar>(i+1,j) >= center) << 2;
code |= (_src.at<uchar>(i+1,j-1) >= center) << 1;
code |= (_src.at<uchar>(i,j-1) >= center) << 0;
_dst.at<unsigned char>(i,j) = code;*/
}
}
}
欲了解更多参考论文:Modeling Pixel Process with Scale Invariant Local Patterns for Background Subtraction in Complex Scenes。
下面介绍的三种LBP算子的区别见下图:
本文不介绍LBP的理论知识,只是简单的说说LBP及其变体的实现:
1)最原始的LBP算子的实现代码
[cpp]
view plain
copy
void lbp( Mat& _src, Mat& _dst)
{
if ( -_dst.empty())
_dst.create(_src.rows, _src.cols, CV_8UC1);
_dst = cv::Scalar::all(0);
// calculate patterns
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 code = 0;
code |= (_src.at<uchar>(i-1,j-1) >= center) << 7;
code |= (_src.at<uchar>(i-1,j) >= center) << 6;
code |= (_src.at<uchar>(i-1,j+1) >= center) << 5;
code |= (_src.at<uchar>(i,j+1) >= center) << 4;
code |= (_src.at<uchar>(i+1,j+1) >= center) << 3;
code |= (_src.at<uchar>(i+1,j) >= center) << 2;
code |= (_src.at<uchar>(i+1,j-1) >= center) << 1;
code |= (_src.at<uchar>(i,j-1) >= center) << 0;
_dst.at<unsigned char>(i,j) = code;
}
}
}
2)带有容忍银子的LBP算子
[cpp]
view plain
copy
void lbp_with_factor( Mat& _src, Mat& _dst, uchar factor) // factor default 3
{
if ( -_dst.empty())
_dst.create(_src.rows, _src.cols, CV_8UC1);
_dst = cv::Scalar::all(0);
// calculate patterns
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)+factor;
unsigned char code = 0;
code |= (_src.at<uchar>(i-1,j-1) >= center) << 7;
code |= (_src.at<uchar>(i-1,j) >= center) << 6;
code |= (_src.at<uchar>(i-1,j+1) >= center) << 5;
code |= (_src.at<uchar>(i,j+1) >= center) << 4;
code |= (_src.at<uchar>(i+1,j+1) >= center) << 3;
code |= (_src.at<uchar>(i+1,j) >= center) << 2;
code |= (_src.at<uchar>(i+1,j-1) >= center) << 1;
code |= (_src.at<uchar>(i,j-1) >= center) << 0;
_dst.at<unsigned char>(i,j) = code;
}
}
}
3)带有乘性因子的LBP算子
[cpp]
view plain
copy
// 这里需要采用2个字符来编码,如00、01、10、11
void lbp_with_factor( Mat& _src, Mat& _dst, float factor) // facotr default 0.1
{
if ( -_dst.empty())
_dst.create(_src.rows, _src.cols, CV_8UC1);
_dst = cv::Scalar::all(0);
// calculate patterns
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);
int up = center*(1.0+factor);
int down = center*(1.0+factor);
unsigned char code = 0;
/*code |= (_src.at<uchar>(i-1,j-1) >= center ) << 7;
code |= (_src.at<uchar>(i-1,j) >= center) << 6;
code |= (_src.at<uchar>(i-1,j+1) >= center) << 5;
code |= (_src.at<uchar>(i,j+1) >= center) << 4;
code |= (_src.at<uchar>(i+1,j+1) >= center) << 3;
code |= (_src.at<uchar>(i+1,j) >= center) << 2;
code |= (_src.at<uchar>(i+1,j-1) >= center) << 1;
code |= (_src.at<uchar>(i,j-1) >= center) << 0;
_dst.at<unsigned char>(i,j) = code;*/
}
}
}
欲了解更多参考论文:Modeling Pixel Process with Scale Invariant Local Patterns for Background Subtraction in Complex Scenes。
相关文章推荐
- LBP(Local Binary Pattern,局部二值模式)
- LBP Local Binary Pattern 局部二值模式 资料整理
- 纹理特征LBP(local binary pattern,局部二值模式)
- 局部二值模式LBP(Local Binary Pattern)实现代码
- LBP: Local Binary Patterns 局部二进模式Matlab实现
- 局部二进制模式(Local Binary Patterns,LBP)——MATLAB实现
- 【图像特征提取4】改进的圆形局部二值模式LBP特征描述符C++代码的实现
- LBP(Local Binary Patterns)局部二进制模式
- LBP (local binary mode)局部二值模式 纹理描述
- 机器视觉 Local Binary Pattern (LBP)
- LBP(局部二值模式)实现人脸识别
- 人脸表情识别笔记(二)特征提取之LBP(局部二值模式)原理及MATLAB代码
- LBP(local binary pattern)
- [转]LBP笔记(Local Binary Pattern)
- 关于LBP(Local Binary Pattern)特征<二> 几种变种
- 关于统计变换(CT/MCT/RMCT)算法的学习和实现,也称为局部二进制模式(LBP)
- 关于LBP(Local Binary Pattern)特征
- LBP特征的几种模式、代码实现链接
- 模式识别 - 局部二值模式(Local Binary Patterns) 简介 及 代码
- 局部二值模式(Local Binary Patterns)进行纹理分类