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. Unity3D中通过Animator动画状态机获取任意animation clip的准确播放持续时长

    Unity3d 4及之前的版本中动画的播放用的animation,可直接获取其播放持续长度.但5.x及以后的版本中都是用animator来播放动画了. https://docs.unity3d.com ...

  2. Android Studio怎样选择查看指定进程的log?

    今天说一个简单的东东,关于Android Studio在logcat中怎样查看指定进程的log. 关于过滤你自己所开发的应用的log.在这篇文章中:Android Studio怎样给log加入过滤项( ...

  3. Linux已经全然统治了这个世界:反对开源社区愚不可及

    原文来自:http://readwrite.jp/archives/9977 不管一个企业多强大,它都不存在和开源社区抗衡的实力 十年前.Unix占有最快的计算机世界排名前10位的五席,以及超级计算机 ...

  4. ML学习分享系列(2)_计算广告小窥[中]

    原作:面包包包包包包 改动:寒小阳 && 龙心尘 时间:2016年2月 出处:http://blog.csdn.net/Breada/article/details/50697030 ...

  5. overridePendingTransition介绍

    Activity的切换动画指的是从一个activity跳转到另外一个activity时的动画 它包含两个部分: 一部分是第一个activity退出时的动画: 另外一部分时第二个activity进入时的 ...

  6. 输入url会发什什么

    从输入url到页面加载完成发生了什么 整体来说有几个基本的点: 1.浏览器的地址栏输入url并按下回车 2.浏览器查找当前url是否存在缓存,并比较缓存是否过期 3.DNS解析url对应的IP 4.根 ...

  7. 【转载】Java系列笔记(3) - Java 内存区域和GC机制

    Java系列笔记(3) - Java 内存区域和GC机制 转载:原文地址http://www.cnblogs.com/zhguang/p/3257367.html 目录 Java垃圾回收概况 Java ...

  8. 移植 MQTT broker mosquitto 到 omapl138

    概述 本次移植使用创龙的 TL138-EVM 开发板,基于 TI 的 MCSDK 开发环境.具体上位机系统为 Ubuntu 12.04-32bit,软件环境基于创龙的用户手册搭建. 为了移植后在 13 ...

  9. 腾讯云开放云压测“黑科技“,产品上线从此不再“压力山大"

    商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 能否解决"高并发"问题一直是检验一个产品后台是否稳定,架构是否合理,性能是否强大的核心标准.对于产品而言,多高的并发 ...

  10. springboot 入门六-多环境日志配置

    在应用项目开发阶段,需要对日志进入很详细的输出便于排查问题原因,上线发布之后又只需要输出核心的日志信息的场景.springboot也提供多环境的日志配置.使用springProfile属性来标识使用那 ...