#include <opencv2/opencv.hpp>
#include <iostream>
#include "math.h" using namespace cv;
using namespace std; Mat src, gray_src; const char* output_tt = "LBP Result"; int main(int argc, char** argv) {
src = imread("test.jpg");
if (src.empty()) {
printf("could not load image...\n");
return -;
} namedWindow("input image", CV_WINDOW_AUTOSIZE);
namedWindow(output_tt, CV_WINDOW_AUTOSIZE);
imshow("input image", src); // convert to gray
cvtColor(src, gray_src, COLOR_BGR2GRAY);
int width = gray_src.cols;
int height = gray_src.rows; // 基本LBP演示
Mat lbpImage = Mat::zeros(gray_src.rows - , gray_src.cols - , CV_8UC1);//3*3窗口,边界有左右各1个像素不处理
for (int row = ; row < height - ; row++) {
for (int col = ; col < width - ; col++) {
uchar c = gray_src.at<uchar>(row, col);//获取中心像素值
uchar code = ;//特征码
code |= (gray_src.at<uchar>(row - , col - ) > c) << ;
code |= (gray_src.at<uchar>(row - , col) > c) << ;
code |= (gray_src.at<uchar>(row - , col + ) > c) << ;
code |= (gray_src.at<uchar>(row, col + ) > c) << ;
code |= (gray_src.at<uchar>(row + , col + ) > c) << ;
code |= (gray_src.at<uchar>(row + , col) > c) << ;
code |= (gray_src.at<uchar>(row + , col - ) > c) << ;
code |= (gray_src.at<uchar>(row, col - ) > c) << ;
lbpImage.at<uchar>(row - , col - ) = code;//原图1,1=效果图0,0
}
}
imshow(output_tt, lbpImage); waitKey();
return ;
}

LBP的扩展(多尺度表达):

 #include <opencv2/opencv.hpp>
#include <iostream>
#include "math.h" using namespace cv;
using namespace std; Mat src, gray_src;
int current_radius = ;
int max_count = ; const char* output_tt = "LBP Result"; void ELBP_Demo(int, void*);
int main(int argc, char** argv) {
src = imread("test.jpg");
if (src.empty()) {
printf("could not load image...\n");
return -;
} namedWindow("input image", CV_WINDOW_AUTOSIZE);
namedWindow(output_tt, CV_WINDOW_AUTOSIZE);
imshow("input image", src); // convert to gray
cvtColor(src, gray_src, COLOR_BGR2GRAY);
int width = gray_src.cols;
int height = gray_src.rows; // 基本LBP演示
Mat lbpImage = Mat::zeros(gray_src.rows - , gray_src.cols - , CV_8UC1);//3*3窗口,边界有左右各1个像素不处理
for (int row = ; row < height - ; row++) {
for (int col = ; col < width - ; col++) {
uchar c = gray_src.at<uchar>(row, col);//获取中心像素值
uchar code = ;//特征码
code |= (gray_src.at<uchar>(row - , col - ) > c) << ;
code |= (gray_src.at<uchar>(row - , col) > c) << ;
code |= (gray_src.at<uchar>(row - , col + ) > c) << ;
code |= (gray_src.at<uchar>(row, col + ) > c) << ;
code |= (gray_src.at<uchar>(row + , col + ) > c) << ;
code |= (gray_src.at<uchar>(row + , col) > c) << ;
code |= (gray_src.at<uchar>(row + , col - ) > c) << ;
code |= (gray_src.at<uchar>(row, col - ) > c) << ;
lbpImage.at<uchar>(row - , col - ) = code;
}
}
imshow(output_tt, lbpImage); // ELBP 演示 namedWindow("ELBP Result", CV_WINDOW_AUTOSIZE);
createTrackbar("ELBP Radius:", "ELBP Result", &current_radius, max_count, ELBP_Demo);
ELBP_Demo(, ); waitKey();
return ;
} void ELBP_Demo(int, void*) {
int offset = current_radius * ;//输出图无法计算到的边界宽度
Mat elbpImage = Mat::zeros(gray_src.rows - offset, gray_src.cols - offset, CV_8UC1);
int width = gray_src.cols;
int height = gray_src.rows; int numNeighbors = ;//应根据半径变化,为了简便这里固定为8
for (int n = ; n < numNeighbors; n++) {
float x = static_cast<float>(current_radius) * cos(2.0 * CV_PI*n / static_cast<float>(numNeighbors));//x=r*cos(2*PI*n/8)
float y = static_cast<float>(current_radius) * -sin(2.0 * CV_PI*n / static_cast<float>(numNeighbors)); int fx = static_cast<int>(floor(x));//floor“向下取整”
int fy = static_cast<int>(floor(y));
int cx = static_cast<int>(ceil(x));//ceil“向上取整”
int cy = static_cast<int>(ceil(y)); //双线性插值
float ty = y - fy;
float tx = x - fx; //双线性插值,周边4个点的权重
float w1 = ( - tx)*( - ty);
float w2 = tx * ( - ty);
float w3 = ( - tx)* ty;
float w4 = tx * ty; for (int row = current_radius; row < (height - current_radius); row++) {
for (int col = current_radius; col < (width - 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);
elbpImage.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("ELBP Result", elbpImage);
return;
}

OpenCV——LBP(Local Binary Patterns)特征检测的更多相关文章

  1. 局部二值模式(Local Binary Patterns)纹理灰度与旋转不变性

    Multiresolution Gray Scale and Rotation Invariant Texture Classification with Local Binary Patterns, ...

  2. LBP(Local Binary Patterns)局部二进制模式

    1. LBP 用于人脸识别 为了预测每个像素属于哪个脸部器官(眼睛.鼻子.嘴.头发),通常的作法是在该像素周围取一个小的区域,提取纹理特征(例如局部二值模式),再基于该特征利用支持向量机等浅层模型分类 ...

  3. 机器视觉 Local Binary Pattern (LBP)

    Local binary pattern (LBP),在机器视觉领域,是非常重要的一种特征.LBP可以有效地处理光照变化,在纹理分析,纹理识别方面被广泛应用. LBP 的算法非常简单,简单来说,就是对 ...

  4. 【C++版】Face Alignment at 3000 FPS by Regressing Local Binary Features源码下载

    下载地址: 本帖隐藏的内容 <ignore_js_op> face-alignment-in-3000fps-master.zip (794.42 KB, 下载次数: 1076) 该源码采 ...

  5. Local Binary Convolutional Neural Networks ---卷积深度网络移植到嵌入式设备上?

    前言:今天他给大家带来一篇发表在CVPR 2017上的文章. 原文:LBCNN 原文代码:https://github.com/juefeix/lbcnn.torch 本文主要内容:把局部二值与卷积神 ...

  6. Vulkan移植GpuImage(三)从A到C的滤镜

    前面移植了几个比较复杂的效果后,算是确认了复杂滤镜不会对框架造成比较大的改动,开始从头移植,现已把A到C的所有滤镜用vulkan的ComputeShader实现了,讲一些其中实现的过程. Averag ...

  7. 使用opencv训练分类器时,traincascade训练报错:Train dataset for temp stage can not be filled.解决方法

    opencv分类器训练中,出错一般都是路径出错,例如, 1.opencv_traincascade.exe路径 2.负样本路径文件,neg.dat中的样本前路径是否正确 3.移植到别的电脑并修改完路径 ...

  8. [分享] 采用opencv_cascadetrain进行训练的步骤及注意事项 [复制链接]

    http://f.dataguru.cn/thread-725364-1-1.html 很有用的一个帖子 转自:http://blog.csdn.net/xidianzhimeng/article/d ...

  9. Opencv之LBP特征(算法)

    LBP(Local Binary Pattern),即局部二进制模式,对一个像素点以半径r画一个圈,在圈上取K个点(一般为8),这K个点的值(像素值大于中心点为1,否则为0)组成K位二进制数.此即局部 ...

随机推荐

  1. spring装配注解(IOC容器加载控制)ComponentScan及ComponentScans使用

    ComponentScan,只写入value,可扫描路径下装配的@Contrller.@Service.@Repository @ComponentScan(value = "com.tes ...

  2. 杭电 OJ 提交代码需要注意的问题

    杭电acm 提交代码需要注意的问题 1. 用 Java 的时候类名请用 Main 2. Java 提交出现 PE 的可能原因有 1) 最基本的错误是空格问题,比如注意每行的末尾是否输出空格 2) 用 ...

  3. Android - 注解

    原理: http://www.cnblogs.com/Fndroid/p/5354644.html http://www.jianshu.com/p/28edf5352b63 开源库: ButterK ...

  4. MVC--DefaultModelBinder解析request参数

    转载:http://www.cnblogs.com/leotsai/p/ASPNET-MVC-DefaultModelBinder.html 看到很多ASP.NET MVC项目还在从request.q ...

  5. Code Signal_练习题_chessBoardCellColor

    Given two cells on the standard chess board, determine whether they have the same color or not. Exam ...

  6. Software-Defined Networking A Comprehensive Survey --阅读_day2

    3. 什么是SDN?(WHAT IS SOFTWARE-DEFINED NETWORKING?) The term SDN was originally coined to represent the ...

  7. python短信发送

    '''以云之讯平台为例:''' url = 'https://open.ucpaas.com/ol/sms/sendsms' # 账户sidsid = 'f0ad70b276a8b63eb44f415 ...

  8. javascript:原型与原型链

    一,函数对象 所有引用类型(函数,数组,对象)都拥有__proto__属性(隐式原型) 所有函数拥有prototype属性(显式原型)(仅限函数) 原型对象:拥有prototype属性的对象,在定义函 ...

  9. Maven学习(一)概念简述和安装教程

    刚开始由.net转向java,公司的项目中就开始使用maven,感觉他就像nuget一样,但是他又比nuget要强大(毕竟他是项目管理工具). maven概述 在这里,就不背书包了,怎么简单直接怎么来 ...

  10. 大数据【二】HDFS部署及文件读写(包含eclipse hadoop配置)

    一 原理阐述 1' DFS 分布式文件系统(即DFS,Distributed File System),指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连.该系统架构 ...