LBP ( Local binary pattern) ,局部二进制模式.

LBP特征的描述

原始的LBP算子定义为在3 ∗ 3 的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于等于中心像素值,则该点的位置被标记为1,否则为0。这样3 ∗ 3邻域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共256种),即得到该窗口中心像素点的LBP值,并用这个值来反映该区域的纹理信息。需要注意的是,LBP值是按照顺时针方向组成的二进制数

上面的 C  是对比度(contrast).  weights 就是阈值表示成十进制显示出来的。

LBP特征的圆形化改进

 基本的 LBP算子的最大缺陷在于它只覆盖了一个固定半径范围内的小区域,这显然不能满足不同尺寸和频率纹理的需要。为了适应不同尺度的纹理特征,并达到灰度和旋转不变性的要求,Ojala等对 LBP 算子进行了改进,将 3×3邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域,改进后的 LBP 算子允许在半径为 R 的圆形邻域内有任意多个像素点。从而得到了诸如半径为R的圆形区域内含有P个采样点的LBP算子,称为Extended LBP,也叫Circular LBP.

LBP旋转不变模式

下图中的8种 LBP 模式,对应的旋转不变的 LBP模式都是00001111,即 LBP值为 15:

最为完整的LBP模式是 均匀+旋转不变模式,均匀模式就是限制一个二进制序列从0到1或从1到0的跳变次数不超过2次.

LBP特征用于检测的原理

上述提取的LBP算子在每个像素点都可以得到一个LBP“编码”,那么,对一幅图像(记录的是每个像素点的灰度值)提取其原始的LBP算子之后,得到的原始LBP特征依然是“一幅图片”(记录的是每个像素点的LBP值)。

LBP的应用中,如纹理分类、人脸分析等,一般都不将LBP图谱作为特征向量用于分类识别,而是采用LBP特征谱的统计直方图作为特征向量用于分类识别。

代码实现

#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace cv;
using namespace std;
int current_radius = 3;
int max_count = 20;
void Expand_LBP_demo(int, void*);
Mat src, gray_src;
int main(int argc, char** argv)
{src = imread("rui.jpg");if (!src.data){cout << "图片未找到" << endl;return -1;}namedWindow("input title", WINDOW_AUTOSIZE);imshow("input title", src);cvtColor(src, gray_src, COLOR_BGR2GRAY);int width = src.cols - 2;int hight = src.rows - 2;//基本LBP演示Mat lbpImg = Mat::zeros(hight, width, CV_8UC1);for (int row = 1; row < src.rows - 1; row++){for (int col = 1; col < src.cols - 1; col++){uchar c = gray_src.at<uchar>(row, col);uchar code = 0;code |= (gray_src.at<uchar>(row - 1, col - 1) > c) << 7;code |= (gray_src.at<uchar>(row - 1, col) > c) << 6;code |= (gray_src.at<uchar>(row - 1, col + 1) > c) << 5;code |= (gray_src.at<uchar>(row, col + 1) > c) << 4;code |= (gray_src.at<uchar>(row + 1, col + 1) > c) << 3;code |= (gray_src.at<uchar>(row + 1, col) > c) << 2;code |= (gray_src.at<uchar>(row + 1, col - 1) > c) << 1;code |= (gray_src.at<uchar>(row, col) > c) << 0;lbpImg.at<uchar>(row - 1, col - 1) = code;}}imshow("LBP", lbpImg);namedWindow("Expand LBP", WINDOW_AUTOSIZE);createTrackbar("current_radius", "Expand LBP", &current_radius, max_count, Expand_LBP_demo);Expand_LBP_demo(0, 0);waitKey(0);return 0;
}
//扩展LBP demo
void Expand_LBP_demo(int, void*)
{int offset = current_radius * 2;Mat elbpImg = Mat::zeros(gray_src.rows - offset, gray_src.cols - offset, CV_8UC1);int numNeighbor = 8;for (int n = 0; n < numNeighbor; n++){float x = current_radius * cos((2 * CV_PI * n) / numNeighbor);float y = current_radius * (-sin((2 * CV_PI * n) / numNeighbor));int fx = static_cast<int>(floor(x)); //向下取整,它返回的是小于或等于函数参数,并且与之最接近的整数int fy = static_cast<int>(floor(y));int cx = static_cast<int>(ceil(x)); //向上取整,它返回的是大于或等于函数参数,并且与之最接近的整数int cy = static_cast<int>(ceil(y));float ty = y - fy;float tx = x = fx;float w1 = (1 - tx) * (1 - ty);float w2 = (tx) * (1 - ty);float w3 = (1 - tx) * (ty);float w4 = (tx) * (ty);for (int row = current_radius; row < (gray_src.rows - current_radius); row++){for (int col = current_radius; col < (gray_src.cols - current_radius); col++){float t = w1 * gray_src.at<uchar>(row + fy, col + fx) + w2 * gray_src.at<uchar>(row + fy, col + cx) +w3 * gray_src.at<uchar>(row + cy, col + fx) + w4 * gray_src.at<uchar>(row + cy, col + cx);elbpImg.at<uchar>(row - current_radius, col - current_radius) +=((t > gray_src.at<uchar>(row, col)) && (abs(t - gray_src.at<uchar>(row, col)) > std::numeric_limits<float>::epsilon())) << n;}}imshow("Expand LBP", elbpImg);}
}

OpenCV——LBP特征相关推荐

  1. 图像特征检测描述(一):SIFT、SURF、ORB、HOG、LBP特征的原理概述及OpenCV代码实现

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 什么叫特征检测?就是检测图像中目标的特征呗,所谓 ...

  2. 用opencv训练LBP特征分类器生成xml文件

    用opencv训练LBP特征分类器生成xml文件 需要工具:opencv_createsamples.exe .opencv_traincascade.exe .opencv_world3414.dl ...

  3. Opencv使用cascade方法训练自己的LBP特征分类器的全过程

    前言 刚刚才把自己训练的分类器整出来,, 现在来理一下整个过程,从制作正负样本开始一直到最后产生自己的分类器.xml文件. 因为毕设的要求,可能要用Opencv训练识别模型,用以识别道路积水.Open ...

  4. lbp特征提取算法 知乎_计算机视觉基础-图像处理: LBP特征描述算子

    1 简介 LBP指局部二值模式(Local Binary Pattern),是一种用来描述图像局部特征的算子,具有灰度不变性和旋转不变性等显著优点.LBP常应用于人脸识别和目标检测中,在OpenCV中 ...

  5. 图像的全局特征--LBP特征

    原文链接:http://blog.csdn.net/zouxy09/article/details/7929531#comments 这个特征或许对三维图像特征提取有很大作用.文章有修改,如有疑问,请 ...

  6. CV之LBP特征描述算子-人脸检测

    2.1 简介 LBP指局部二值模式(Local Binary Pattern),是一种用来描述图像局部特征的算子,具有灰度不变性和旋转不变性等显著优点.LBP常应用于人脸识别和目标检测中,在OpenC ...

  7. lbp特征提取算法 知乎_图像-LBP特征描述算子-人脸检测

    2.1 简介 LBP指局部二值模式(Local Binary Pattern),是一种用来描述图像局部特征的算子,具有灰度不变性和旋转不变性等显著优点.LBP常应用于人脸识别和目标检测中,在OpenC ...

  8. LBP特征学习及实现

    老外的原文:<Multiresolution gray-scale and rotation invariant texture classification with local binary ...

  9. 提取lbp特征java代码_LBP特征提取原理及代码实现

    老规矩,先上背景,算是表示对LBP算法提出者的一种尊敬(其实,是为了装...kkk,大家都懂ha). 一.LBP背景: LBP(Local Binary Pattern,局部二值模式)是一种用来描述图 ...

  10. 图像特征提取三大法宝:HOG特征、LBP特征、Haar-like特征

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

最新文章

  1. 北京智源人工智能研究院启动“智源学者计划”,与旷视发布首个智源联合实验室
  2. 两个月不到,我是如何从Python新手成长为谷歌认证TensorFlow开发者的?
  3. FlinkX 如何读取和写入 Clickhouse?
  4. Thymeleaf select 使用 和多select 级联选择
  5. mysql allowmultiqueries=true_Mysql批量更新的一个坑-allowMultiQueries=true允许批量更新(转)...
  6. c++ 测试串口速率_山西充放电测试设备实现多台仪器准确通
  7. FD.io VPP 20.09版本正式发布:往期VPP文章回顾+下载地址+相关链接
  8. java validate注解_JAVA 注解验证字段(例子)
  9. 和菜鸟一起学android4.0.3源码之lcd屏幕背光调节
  10. APS技术中的多目标规划问题
  11. 读书印记 - 《终极算法》
  12. 计算思维(Computational Thinking)
  13. phx.gen.html 生成器
  14. 自学python面试_Python自学之路-面试题
  15. java 父委托机制优点_Java虚拟机父类委托机制设计的优点
  16. promise是什么
  17. windows服务器的流量监控工具-DU Meter
  18. 多个VLC播放器同步播放本地VCam视频流
  19. Vue浏览器图标修改不起作用
  20. 深度模型(八):Wide And Deep

热门文章

  1. 不用下载Axure RP Extension for Chrome插件,即可看原型文件
  2. 灵感之源之十多年技术人生的经验与心得
  3. 2022年华为杯中国研究生数学建模竞赛A题思路
  4. java 高斯投影_高斯投影正算公式以及java代码
  5. Hadoop环境搭建与入门实例
  6. Linux文件压缩解压命令
  7. git日志 每天导出 shell脚本
  8. 使用selenium + pytest + allure做WBE UI自动化
  9. matlab 等字符数 输出,Matlab 输入输出函数整理
  10. Manjaro下安装和美化i3wm,以及相关软件配置