lbp特征提取(等价模式)
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特征提取(等价模式)的更多相关文章
- Python + OpenCV 实现LBP特征提取
背景 看了些许的纹理特征提取的paper,想自己实现其中部分算法,看看特征提取之后的效果是怎样 运行环境 Mac OS Python3.0 Anaconda3(集成了很多包,浏览器界面编程,清爽) 步 ...
- LBP特征提取实现
捯饬了一两天才搞好! 在lbp.m下输入下面代码,运行结果如图: 代码: I=imread('rice.png'); mapping=getmapping(8,'u2'); H1=lbp(I,1,8, ...
- 图像特征提取之LBP特征
LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子:它具有旋转不变性和灰度不变性等显著的优点.它是首先由T. Ojala, M.Pietik?inen ...
- 图像特征提取三大法宝:HOG特征,LBP特征,Haar特征(转载)
(一)HOG特征 1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和 ...
- 目标检测的图像特征提取之(二)LBP特征
LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像年提出,用于纹理特征提取.而且,提取的特征是图像的局部的纹理特征: 1.LBP特征的描述 原始的LBP算子定义为在3* ...
- 图像特征提取三大法宝:HOG特征,LBP特征,Haar特征
(一)HOG特征 1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和 ...
- [CV笔记]图像特征提取三大法宝:HOG特征,LBP特征,Haar特征
(一)HOG特征 1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和 ...
- 【计算机视觉】纹理特征之LBP局部二值化模式
转自http://blog.csdn.NET/ty101/article/details/8905394 本文的PDF版本,以及涉及到的所有文献和代码可以到下列地址下载: 1.PDF版本以及文献:ht ...
- 特征提取算法(1)——纹理特征提取算法LBP
模式识别中进行匹配识别或者分类器分类识别时,判断的依据就是图像特征.用提取的特征表示整幅图像内容,根据特征匹配或者分类图像目标. 常见的特征提取算法主要分为以下3类: 基于颜色特征:如颜色直方图.颜色 ...
随机推荐
- 灵感手环第一步——0.96寸OLED显示实验
这算是我这个系列的第一篇博客吧.首先要解决的就是屏幕显示问题.我选择了目前新兴起的OLED显示模块. OLED(OrganicLightEmittingDiode),中文译作有机发光二极管,目前被广泛 ...
- 轻松上云,从容实施Office 365项目
这个是我在MVP 社区活动的一节课程,讲述Office 365部署中一些大的挑战和解决的方法 视频URL 例如以下: http://edu.51cto.com/lesson/id-17440.html ...
- HDU 3569 Imaginary Date 简单期望
推一下公式.就会发现是这个.. 由于设结果有x种方案.则每一个数字出现的概率都均等,然后和就是x*m 每种方案的概率是1/x 每一个数出现的概率都是1/n 所以每一个方案的和就是 sum/n *m # ...
- C++简易list
list不同于vector.每一个节点的结构须要自行定义,迭代器属于双向迭代器(不是随即迭代器),也须要自行定义.和通用迭代器一样,list的迭代器须要实现的操作有:++.--.*.->.==. ...
- linux vi/vim编辑文件显示行号
方法一(最尴尬的方法): 1.显示当前行行号,在VI的命令模式下输入 :nu 2.显示所有行号,在VI的命令模式下输入 :set nu #这是:set number 的简写 方法二(最好的方法): 使 ...
- java两种动态代理方式的理解
要理解动态代理,不妨先来看看一个静态代理的例子. 一.静态代理 以一个电商项目的例子来说明问题,比如我定义了一个订单的接口IOrder,其中有一个方法时delivery,代码如下. package c ...
- Elasticsearch布尔查询——bool
布尔查询允许我们利用布尔逻辑将较小的查询组合成较大的查询. 1.查询返回包含"mill"和"lane"的所有的账户 curl -XPOST 'localhost ...
- android 实现银联刷卡机消费后,手动签名的功能
几天前去物管交物业费,物管工作人员说小区引进高新产品,使用银行卡消费后,不需要拿笔在银联机上签名,直接用手指触摸实现消费签名,当时心想,果然是高科技,机子外形如下左图,签名如下右图. ...
- mysql与服务器之间的编码问题
1.之前在练习一个java web的项目时,mysql的编码设置正确,服务器的编码也设置正确,但向mysql中存储数据时,就会出现乱码问题,后来发现是mysql与服务器之间的编码设置问题,以下是mys ...
- MyBatis 批量操作、集合遍历-foreach
在使用mybatis操作数据库时,经常会使用到批量插入.IN条件查询的情况,这时就难免要使用到foreach元素.下面一段话摘自mybatis官网: foreach 元素的功能是非常强大的,它允许你指 ...