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类: 基于颜色特征:如颜色直方图.颜色 ...
随机推荐
- SharePoint Online Add-in 开发简介
作者:陈希章 发表于 2017年12月22日 在 再谈SharePoint大局观 中我提到了SharePoint开发的一些新的变化,这一篇文章我将讲解SharePoint Add-in开发.其实早在2 ...
- iOS 读书笔记-国际化
吐槽一下:国际化-我想说学习的这个project好痛苦. 也许是百度的原因,总是不能找到自己想要东西. 找到的内容不是不具体就是时间有点久了.让我这种小白非常头痛. 以下记录一下整个过程. 国际化是什 ...
- 【004】【JVM——垃圾收集算法】
Java虚拟机学习总结文件夹 垃圾收集算法 垃圾收集算法的实现涉及大量的程序细节,并且各个平台的虚拟机操作内存的方法又各不同样,介绍几种垃圾收集算法的思想及其发展过程. 标记-清除算法 垃圾收集 ...
- Ration Rose2003安装及破解
曾经学习UML的时候,用的是EA. 近期在看Head First想着画绘图装一下Ration Rose吧.于是就着手開始装.本来网上关于Ration Rose的安装及破解教程非常多,可是我在安装的过程 ...
- C#设计模式之二十一职责链模式(Chain of Responsibility Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第八个模式,该模式是[职责链模式],英文名称是:Chain of Responsibility Pattern.让我们看看现实生活中 ...
- Windows 10 安装 Docker for Windows
Docker for Windows是Docker社区版(CE)应用程序. Docker for Windows安装包包括在Windows系统上运行Docker所需的一切. 本主题介绍了预安装注意事项 ...
- 存储与索引------《Designing Data-Intensive Applications》读书笔记3
在上一篇的笔记之中,我们讨论了数据模型和查询语言.在第三章之中我们来聊一聊不同的数据引擎内部是如何实现存储和检索的,以及不同设计之间的折中与妥协. 1.键值对数据库 键值对数据库是数据库形式之中最简单 ...
- gunicorn geventworker 解析
在前面的文章曾介绍过gunicorn的syncworker,本文介绍其中一种asyncworker:GeventWorker.类图如下: 可见GeventWorker重载了init_process ...
- win64环境下使用curl命令
想在windows环境下使用curl命令,其实很简单,简单配置如下: 工具下载 在官网下载工具包:https://curl.haxx.se/download.html 我这里下载的是zip版本的,下载 ...
- 【python】字符串
>>> str1="welcom to China">>> str1[2:4]'lc'>>> str1[7]'t'>&g ...