话不多说直接上代码,没有做直方图的统计,没有做cell的归一化,请自行完成。

#include  <iostream>
#include <opencv.hpp>
#define pi 3.1415926
using namespace std;
using namespace cv;int binary2decimal(char descri[], int p)
{
//char a[8] = { 1,1,0,0,0,0,0,0};
//cout << binary2decimal(a, 8) << endl;
// -> 3int sum = 0, factorial = 1;for (int i = 0; i < p; i++){sum += factorial * descri[i];factorial = factorial * 2;}return sum;
}
void show(Mat img, string name = "1")
{Mat temp;img.convertTo(temp, CV_8U);imshow(name, temp);waitKey();
}
int LBPRotate(char descri[], int p)
{char *temp = new char[p];int min = binary2decimal(descri, p);for (int epo = 0; epo < p; epo++){for (int i = 0; i < p; i++){temp[i] = descri[(i + epo) % p];}if (binary2decimal(temp, p) < min)min = binary2decimal(temp, p);}return min;
}
void uniformpattern(char descri[], int p)
{char pre = descri[0];char change = 0;for (int i = 1; i < p; i++){if (descri[i] != pre){change++;}}if (change > 2){for (int i = 1; i < p; i++){descri[i] = 0;}}
}
char* LBPCircle(Mat src, int x, int y, int P, float R)
{char* descriptor = new char[P];int height = src.rows;int width = src.cols;float angle, px, py;for (int i = 0; i < P; i++){angle = pi / 2 - 2 * pi / P * i;px = (float)x + R * cos(angle);py = (float)y - R * sin(angle);if (px <= 0 || py <= 0 ||px >= width - 1 || py >= height - 1){for (int m = 0; m < P; m++){descriptor[m] = 0;}return descriptor;}else{int xl = int(px);int xr = xl + 1;int yl = int(py);int yr = yl + 1;float wxl = 1 - (px - xl);float wxr = 1 - (xr - px);float wyl = 1 - (py - yl);float wyr = 1 - (yr - py);float pixel = src.at<float>(yl, xl) * (wxl + wyl) +src.at<float>(yr, xl) * (wxl + wyr) +src.at<float>(yl, xr) * (wxr + wyl) +src.at<float>(yr, xr) * (wxr + wyr);pixel /= 4.0;if (pixel > src.at<float>(y, x))descriptor[i] = 1;elsedescriptor[i] = 0;}}return descriptor;
}
char* LBPBase(Mat src, int x, int y)
{char* descriptor = new char[8];float center, pixel;int width = src.cols;int height = src.rows;char dxdy[8][2] = { -1,-1,   0,-1,   1,-1,1,0,   1,1,    0,1,    -1,1,   -1,0 };if (x == 0 || y == 0 || x == width - 1 || y == height - 1){for (int m = 0; m < 8; m++){descriptor[m] = 0;}return descriptor;}center = src.at<float>(y, x);for (int m = 0; m < 8; m++){pixel = src.at<float>(y + dxdy[m][1], x + dxdy[m][0]);if (pixel > center)descriptor[m] = 1;elsedescriptor[m] = 0;}return descriptor;
}void LBP(InputArray src, OutputArray dst, bool rotate = true, bool uniform = true, bool base = true, int P = 8, float R = 1)
{Mat input = src.getMat();dst.create(input.size(), CV_8UC1);Mat output = dst.getMat();int width = input.cols;int height = input.rows;//颜色空间归一化input.convertTo(input, CV_32F);Mat gray = Mat::zeros(input.size(), CV_32FC1);float r, g, b;for (int i = 0; i < height; i++){for (int j = 0; j < width; j++){r = input.at<Vec3f>(i, j)[2];g = input.at<Vec3f>(i, j)[1];b = input.at<Vec3f>(i, j)[0];gray.at<float>(i, j) = 0.3 * r + 0.59 * g + 0.11 * b;}}int value;char* desc;for (int j = 0; j < width; j++){for (int i = 0; i < height; i++){   if (base)desc = LBPBase(gray, j, i);elsedesc = LBPCircle(gray, j, i, P, R);if (uniform)uniformpattern(desc, P);if (rotate)value = LBPRotate(desc, P);elsevalue = binary2decimal(desc, P);output.at<uchar>(i, j) = value;}}
}int main()
{Mat src = imread("F:\\users\\桌面\\123.jpg");resize(src, src, Size(512, 512));Mat dst;show(src);LBP(src, dst, false, false, true);show(dst, "origin");LBP(src, dst, false, false, false);show(dst, "Circle");}

C/C++ opencv 计算 LBP特征 包括旋转不变 uniform 圆形邻域相关推荐

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

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

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

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

  3. 灰度不变性LBP( gray scale invariant) 旋转不变性LBP(rotation invariant)旋转不变等价LBP(rotation uniform invarian )

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

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

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

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

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

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

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

  7. LBP特征学习及实现

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

  8. LBP特征的实现及LBP+SVM分类

    前言 LBP这篇博客发表了有一年多的时间了,当时是为了研究生毕业论文实验而写的,后来稍微总结了一下写了这篇博客,一年多时间里,大家提了一些宝贵的修改意见,这两天将代码重构了一下,结构更加简洁清晰,速度 ...

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

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

最新文章

  1. 5分钟搞定开机引导界面
  2. SQLHELPER C#
  3. 图的基本操作实现(数据结构实验)
  4. PHP LOG使用心得(2)
  5. Python | Lambda函数与示例
  6. 硬件基础知识(13)---模拟电路中大量使用的滤波和隔直LC网络的值计算
  7. map函数python返回值,Python中map函数使用
  8. Android ble covana,Android BLE低功耗蓝牙开发
  9. vscode配置js环境_VS Code配置Python开发环境
  10. 做windows界面,用QT还是MFC?
  11. array转list_Java面试题Array和ArrayList有何区别?
  12. Mixpanel获Andreessen Horowitz投资 为Viddy及Path提供分析服务
  13. 念念不忘,必有回响。5次失败后,淘宝爬虫终于可以用了
  14. G1垃圾回收器在并发场景调优
  15. 计算机知识竞赛策划案,计算机基础知识竞赛策划书
  16. matlab 实验七 低层绘图操作,matlab实验内容答案
  17. (SQL语句)查询排序,顺序和倒序
  18. 二手房数据的分析与挖掘(七)-- 预测房价
  19. 51单片机实现矩阵键盘密码锁,数码管显示
  20. 队列的应用——短信模拟

热门文章

  1. CSDN写文章Markdown个人笔记
  2. 未来的计算机儿童画,儿童画未来的科学幻想绘画优秀作品
  3. mysql被替换的文件如何恢复吗_文件被覆盖替换了怎么找回来
  4. Bootstrap的aria-label和aria-labelledby
  5. web前端框架——Vue的特性
  6. 分布式计算模式:MapReduce
  7. CD19药物|适应症|市场销售-上市药品前景分析
  8. iCheck 的简单了解
  9. photoSwipe插件使用
  10. tf.estimator.train_and_evaluate 详解