【opencv】LBP(局部二进制模式)算法的实现

2024-02-13 10:58

本文主要是介绍【opencv】LBP(局部二进制模式)算法的实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本章我们学习LBP图像的原理和使用,因为接下来教程我们要使用LBP图像的直方图来进行脸部识别。

参考资料:

http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html      (非常重要的参考文档!!!)

http://www.cnblogs.com/mikewolf2002/p/3438166.html

      LBP的基本思想是以图像中某个像素为中心,对相邻像素进行阈值比较。如果中心像素的亮度大于等于它的相邻像素,把相邻像素标记为1,否则标记为0。我们可以用二进制数字来表示LBP图中的每个像素的LBP编码,比如下图中的中心像素,它的LBP编码为:00010011,其十进制值为19。

image

用公式表示就是:

image

其中(xc,yc)是中心像素,ic是灰度值,in是相邻像素的灰度值,s是一个符号函数:

image

在OpenCV的LBP算法中,固定的领域大小不能对不同规模的细节进行编码。所以基本的LBP算法被进一步推广为使用不同大小和形状的领域,采取圆形的领域并结合双线性插值运算,我们可以获得任意半径和任意数目的领域像素点。使用圆形的LBP算子:

对于一个点image, 它的近邻点 image用以下公式计算:

image

其中R是半径,p是样本点的个数。

如果就算的结果不在像素坐标上,我们则使用双线性插值(确定他的值)进行近似处理。

image

下面的代码中,我们分别实现了通常LBP图和圆形算子LBP图。

      elbp是圆形算子LBP函数,elbp1是通常LBP图,我们分别对lena的图像进行了处理,结果如下所示,从途中可以看出来,使用圆形算子的效果锐度更强。

#include "opencv2/core/core.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/highgui/highgui.hpp"#include <iostream>
#include <fstream>
#include <sstream>using namespace cv;
using namespace std;void elbp(Mat& src, Mat &dst, int radius, int neighbors){for(int n=0; n<neighbors; n++){// 采样点的计算float x = static_cast<float>(-radius * sin(2.0*CV_PI*n/static_cast<float>(neighbors)));float y = static_cast<float>(radius * cos(2.0*CV_PI*n/static_cast<float>(neighbors)));// 上取整和下取整的值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 i=radius; i < src.rows-radius;i++){for(int j=radius;j < src.cols-radius;j++) {// 计算插值float t = static_cast<float>(w1*src.at<uchar>(i+fy,j+fx) + w2*src.at<uchar>(i+fy,j+cx) + w3*src.at<uchar>(i+cy,j+fx) + w4*src.at<uchar>(i+cy,j+cx));// 进行编码dst.at<uchar>(i-radius,j-radius) += ((t > src.at<uchar>(i,j)) || (std::abs(t-src.at<uchar>(i,j)) < std::numeric_limits<float>::epsilon())) << n;}}}}void elbp1(Mat& src, Mat &dst){// 循环处理图像数据for(int i=1; i < src.rows-1;i++){for(int j=1;j < src.cols-1;j++) {uchar tt = 0;int tt1 = 0;uchar u = src.at<uchar>(i,j);if(src.at<uchar>(i-1,j-1)>u) { tt += 1 <<tt1; } tt1++;if(src.at<uchar>(i-1,j)>u) { tt += 1 <<tt1; } tt1++;if(src.at<uchar>(i-1,j+1)>u) { tt += 1 <<tt1; } tt1++;if(src.at<uchar>(i,j+1)>u) { tt += 1 <<tt1; } tt1++;if(src.at<uchar>(i+1,j+1)>u) { tt += 1 <<tt1; } tt1++;if(src.at<uchar>(i+1,j)>u) { tt += 1 <<tt1; } tt1++;if(src.at<uchar>(i+1,j-1)>u) { tt += 1 <<tt1; } tt1++;if(src.at<uchar>(i-1,j)>u) { tt += 1 <<tt1; } tt1++;dst.at<uchar>(i-1,j-1) = tt;}}}int main(){Mat img = cv::imread("../lenna.jpg", 0);namedWindow("image");imshow("image", img);int radius, neighbors;radius = 1;neighbors = 8;//创建一个LBP//注意为了溢出,我们行列都在原有图像上减去2个半径Mat dst = Mat(img.rows-2*radius, img.cols-2*radius,CV_8UC1, Scalar(0));elbp1(img,dst);namedWindow("normal");imshow("normal", dst);Mat dst1 = Mat(img.rows-2*radius, img.cols-2*radius,CV_8UC1, Scalar(0));elbp(img,dst1,1,8);namedWindow("circle");imshow("circle", dst1);while(1)cv::waitKey(0);}

imageimageimage

我们换另外一张图,该图包括不同光照下的四副照片,再来看看LBP图的效果(可以看到,LBP在光照不均匀的人脸识别中可以取得很好的应用!):

image

image

image

这篇关于【opencv】LBP(局部二进制模式)算法的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/705351

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too