局部二值模式(LBP)

LBP(局部二值模式)是一种纹理特征描述算子,具有旋转和灰度不变性。从原始LBP到旋转不变LBP,再到等价模式,LBP不断演化以适应不同尺度和频率的纹理。LBP统计直方图(LBPH)结合了LBP特征与空间信息,常用于人脸识别和目标检测。Opencv提供了LBP的实现,但未直接提供计算LBP特征的接口。
摘要由CSDN通过智能技术生成

简要介绍

LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子,具有旋转不变性和灰度不变性等显著优点。首先由T. Ojala, M.Pietikäinen, 和D. Harwood 在1994年提出,用于纹理特征提取。主要应用于人脸识别和目标检测中,OpenCV中有使用LBP特征进行人脸识别的接口,也有用LBP特征训练目标检测分类器的方法,Opencv实现了LBP特征的计算,但没有提供一个单独的计算LBP特征的接口。

原始LBP

3×3 的窗口中,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。可以产生8位二进制数,将其转化为十进制数便得到了LBP编码(256种),如下图左上角开始遍历组成2进制数,转化为10进制后为124。



具体的,其数学表达可写作:

LBP(xc,yc)=p=0p12ps(ipic)

其中, (xc,yc) 为中心像素的坐标, p 为邻域的第p个像素, ip 为邻域像素的灰度值, ic 为中心像素的灰度值, s(x) 为符号函数,如下:
s(x)={ 1,0,x>=0x<0

代码实现如下:

void orLBP(Mat& src, Mat &dst)
{
    // 循环处理图像数据
    for (int i = 1; i < src.rows - 1; i++)
    {
        for (int j = 1; j < src.cols - 1; j++)
        {
            uchar center = src.at<uchar>(i, j);
            unsigned char lbpCode = 0;
            lbpCode |= (src.at<uchar>(i - 1, j - 1) > center) << 7;
            lbpCode |= (src.at<uchar>(i - 1, j) > center) << 6;
            lbpCode |= (src.at<uchar>(i - 1, j + 1) > center) << 5;
            lbpCode |= (src.at<uchar>(i, j + 1) > center) << 4;
            lbpCode |= (src.at<uchar>(i + 1, j + 1) > center) << 3;
            lbpCode |= (src.at<uchar>(i + 1, j) > center) << 2;
            lbpCode |= (src.at<
下面是一个简单的局部二值模式LBP的C++版本OpenCV代码: ```c++ #include <opencv2/opencv.hpp> #include <iostream> #include <cmath> using namespace cv; using namespace std; // 计算像素点的LBP值 uchar getLBPValue(Mat img, int row, int col) { uchar center = img.at<uchar>(row, col); uchar code = 0; code |= (img.at<uchar>(row-1, col-1) >= center) << 7; code |= (img.at<uchar>(row-1, col) >= center) << 6; code |= (img.at<uchar>(row-1, col+1) >= center) << 5; code |= (img.at<uchar>(row, col+1) >= center) << 4; code |= (img.at<uchar>(row+1, col+1) >= center) << 3; code |= (img.at<uchar>(row+1, col) >= center) << 2; code |= (img.at<uchar>(row+1, col-1) >= center) << 1; code |= (img.at<uchar>(row, col-1) >= center) << 0; return code; } // 计算图像的LBP特征图 Mat getLBPImage(Mat img) { Mat dst = Mat::zeros(img.size(), CV_8UC1); for (int i = 1; i < img.rows - 1; i++) { for (int j = 1; j < img.cols - 1; j++) { dst.at<uchar>(i, j) = getLBPValue(img, i, j); } } return dst; } int main(int argc, char** argv) { // 加载图像 Mat img = imread("lena.jpg", IMREAD_GRAYSCALE); if (img.empty()) { cout << "Failed to load image!" << endl; return -1; } // 计算LBP特征图 Mat lbpImg = getLBPImage(img); // 显示原图和LBP特征图 namedWindow("Original Image", WINDOW_NORMAL); namedWindow("LBP Image", WINDOW_NORMAL); imshow("Original Image", img); imshow("LBP Image", lbpImg); waitKey(0); return 0; } ``` 这个代码可以计算输入图像的LBP特征图,并显示出来。其中,`getLBPValue()`函数计算像素点的LBP值,`getLBPImage()`函数计算整个图像的LBP特征图。你可以根据需要修改代码以适应你的应用场景。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值