LBP等价模式

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

      Ojala提出一种“等价模式”(Uniform Pattern)来对LBP算子进行降维,Ojala等认为图像中,某个局部二进制模式所对应的循环二进制数从0—>1或从1—>0,最多有两次跳变,该局部二进制模式所对应的二进制就成为一个等价模式。

如00000000,00111000,10001111,11111111等都是等价模式类。判断一个二进制模式是否为等价模式最简单的办法就是将LBP值与其循环移动一位后的值进行按位相与,计算得到的二进制数中1的个数,若个数小于或等于2,则是等价模式;否则,不是。除了等价模式以外的模式都归一一类,称为混合模式类,例如10010111(共四次跳变)。

  跳变的计算方法:如10010111,首先第一二位10,由1—>0跳变一次;第二、三位00,没有跳变;第三、四位01,由0—>1跳变一次,第四、五位10,由1—>0跳变一次;第五六位01,由0—>1跳变一次;第六七位11,没有跳变;第七八位11,没有跳变;第八位和第一位11,没有跳变;故总共跳变4次。

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

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

1、LBPFeature.h

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv; class LBPFeature
{
public:
//LBP
uchar table[];//查找表
Mat LbpImg;//Lbp图像
Mat Lbp59Mat; //返回的mat是一个59维的矩阵 32FC1; public: int getHopCount(int i);// 获取i中0,1的跳变次数
void lbp59table(uchar *table);// 降维数组 由256->59
void uniformLBP(Mat &image, Mat &LbpImg, Mat &Lbp59Mat, uchar *table);//得到等价模式lbp值
LBPFeature(void);
~LBPFeature(void);
};

2、LBPFeature.cpp

#include <iostream>
#include <opencv2/opencv.hpp>
#include "LBPFeature.h" using namespace std;
using namespace cv; //*******获取图像的lbp值 等价模式****** LBPFeature::LBPFeature(void)
{
} LBPFeature::~LBPFeature(void)
{
} // 获取i中0,1的跳变次数
int LBPFeature::getHopCount(int i)
{ int a[] = { };
int cnt = ;
int k = ;
// 转换为二进制
while (i)
{
// 除2取余 a[k] = i % 2;
a[k] = i & ;
// 除2取整 i/=2;
i = i >> ;
--k;
}
// 计算跳变次数
for (k = ; k < ; k++)
{
if (a[k] != a[k + ])
{
++cnt;
}
}
// 注意,是循环二进制,所以需要判断是否为8
if (a[] != a[])
{
++cnt;
}
return cnt;
} // 建立等价模式表
void LBPFeature::lbp59table(uchar *table)
{
//将已开辟内存空间 为256的table的值赋值为0。
memset(table, , ); uchar temp = ;
for (int i = ; i < ; i++)
{
// 跳变次数<=2 的为非0值
if (getHopCount(i) <= )
{
table[i] = temp;
temp++;
}
}
} //降维数组 由256->59
void LBPFeature::uniformLBP(Mat &image, Mat &LbpImg, Mat &Lbp59Mat, uchar *table)
{
Lbp59Mat = Mat::zeros(, , CV_32FC1);
float saveResult[] = { 0.0 };
LbpImg.create(Size(image.cols, image.rows), image.type());
for (int y = ; y < image.rows - ; y++)
{
for (int x = ; x < image.cols - ; x++)
{
//得到邻域像素值
uchar neighbor[] = { };
neighbor[] = image.at<uchar>(y - , x - );
neighbor[] = image.at<uchar>(y - , x);
neighbor[] = image.at<uchar>(y - , x + );
neighbor[] = image.at<uchar>(y, x + );
neighbor[] = image.at<uchar>(y + , x + );
neighbor[] = image.at<uchar>(y + , x);
neighbor[] = image.at<uchar>(y + , x - );
neighbor[] = image.at<uchar>(y, x - );
//得到中心像素值
uchar center = image.at<uchar>(y, x); uchar temp = ;
for (int k = ; k < ; k++)
{
// 计算LBP的值
temp += (neighbor[k] >= center)* ( << k);
}
// 降为59维空间
LbpImg.at<uchar>(y, x) = table[temp]; int value = LbpImg.at<uchar>(y, x);
for (int k = ;k<;k++)
{
if (value == k)
{
saveResult[k
]++;
}
} }
}
for (int i = ;i<;i++)
{
float v59 = saveResult[i];
Lbp59Mat.at<float>(, i) = v59;
}
}

lbp特征提取(等价模式)的更多相关文章

  1. Python + OpenCV 实现LBP特征提取

    背景 看了些许的纹理特征提取的paper,想自己实现其中部分算法,看看特征提取之后的效果是怎样 运行环境 Mac OS Python3.0 Anaconda3(集成了很多包,浏览器界面编程,清爽) 步 ...

  2. LBP特征提取实现

    捯饬了一两天才搞好! 在lbp.m下输入下面代码,运行结果如图: 代码: I=imread('rice.png'); mapping=getmapping(8,'u2'); H1=lbp(I,1,8, ...

  3. 图像特征提取之LBP特征

    LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子:它具有旋转不变性和灰度不变性等显著的优点.它是首先由T. Ojala, M.Pietik?inen ...

  4. 图像特征提取三大法宝:HOG特征,LBP特征,Haar特征(转载)

    (一)HOG特征 1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和 ...

  5. 目标检测的图像特征提取之(二)LBP特征

    LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像年提出,用于纹理特征提取.而且,提取的特征是图像的局部的纹理特征: 1.LBP特征的描述 原始的LBP算子定义为在3* ...

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

    (一)HOG特征 1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和 ...

  7. [CV笔记]图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

    (一)HOG特征 1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和 ...

  8. 【计算机视觉】纹理特征之LBP局部二值化模式

    转自http://blog.csdn.NET/ty101/article/details/8905394 本文的PDF版本,以及涉及到的所有文献和代码可以到下列地址下载: 1.PDF版本以及文献:ht ...

  9. 特征提取算法(1)——纹理特征提取算法LBP

    模式识别中进行匹配识别或者分类器分类识别时,判断的依据就是图像特征.用提取的特征表示整幅图像内容,根据特征匹配或者分类图像目标. 常见的特征提取算法主要分为以下3类: 基于颜色特征:如颜色直方图.颜色 ...

随机推荐

  1. 巧用第三方高速开发Android App 热门第三方SDK及框架

    巧用第三方高速开发Android App 热门第三方SDK及框架 历经大半年的时间,最终是把这门课程给录制出来了,也就在今天,正式在慕课网上上线了 项目地址:巧用第三方高速开发Android App ...

  2. Codeforces548A:Mike and Fax

    While Mike was walking in the subway, all the stuff in his back-bag dropped on the ground. There wer ...

  3. Python 爬虫 爬校花网!!

    爬虫:是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本 1.福利来了  校花网 ,首先说为什么要爬这个网站呢,第一这个网站简单爬起来容易不会受到打击,第二呢 你懂得... 1.第一步,需要下载 ...

  4. Effective Java 第三版——6. 避免创建不必要的对象

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  5. maven安装配置及使用maven创建一个web项目

    今天开始学习使用maven,现在把学习过程中的资料整理在这边. 第一部分.maven安装和配置. http://jingyan.baidu.com/article/295430f136e8e00c7e ...

  6. sqlser 2005 对称加密,非对称加密笔记

    一:对称加密  原始明文---密钥---加密数据---密钥---原始明文 速度快,通过算法将明文混淆,占用系统资源少 二:非对称加密 加密解密速度慢,较高的系统资源占用 三:混合数据加密 加密过程:随 ...

  7. Requests模块 HTTP for Humans

    安装方式 $ pip install requests 基本GET请求(headers参数 和 parmas参数) 1.最基本的GET请求可以直接用get方法 response = requests. ...

  8. myeclipse 2014 Customize Perspective 失效

    1.将9个jar复制到myeclipse安装目录\plugins中 2.删除和这9个jar同包名但是版本号较低的9个文件 3.重启myeclipse 2014 注:这9个 jar 包 自己到网上搜索, ...

  9. Gulp 的简单使用(原创)

    1.安装nodejs 安装省略 npm的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载.安装.上传以及管理已经安 ...

  10. iOS Xcode及模拟器SDK下载

    原文: Xcode及模拟器SDK下载 如果你嫌在 App Store 下载 Xcode 太慢,你也可以选择从网络上下载: Xcode下载(Beta版打的包是不能提交到App Store上的) 绝对官方 ...