lbp算子实现

    xiaoxiao2024-12-06  14

    LBP(Local Binary Pattern, 局部二值模式)是一种用来描述图像局部纹理特征的算子; 它的作用是进行特征提取,而且,提取的特征是图像的纹理特征,并且,是局部的纹理特征;

    目前,LBP局部纹理提取算子,已经成功应用在指纹识别、字符识别、人脸识别、车牌识别等领域。

    原始的LBP算子定义为: 在3*3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。 这样,3*3领域内的8个点可产生8bit的无符号数,即得到该窗口的LBP值,并用这个值来反映该区域的纹理信息。如下图所示:

    #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> using namespace std; using namespace cv; int main(){ Mat img = imread("1.pgm"); imshow("src", img); cvtColor(img, img, CV_BGR2GRAY); Mat src(img); vector<int> vec; vector<int>::iterator it; int tem = 0; int m = 0; int g = 0; for (int i = 1; i < img.rows-1; i++){ for (int j = 1; j < img.cols-1;j++){ for (int k = -1; k < 2;k++){ for (int z = -1; z < 2;z++){ if (k != 0 || z != 0){ if ((img.at<uchar>(i + k, j + z)) >= img.at<uchar>(i, j)+g){ vec.push_back(1); } if (img.at<uchar>(i + k, j + z) < img.at<uchar>(i, j)+g){ vec.push_back(0); } } } } for (it = vec.begin(); it != vec.end(); it++){ m++; tem += *it*pow(2, m); } src.at<uchar>(i, j) = tem; tem = 0; vec.clear(); m = 0; } } imshow("ltp", src); waitKey(0); return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-1294332.html
    最新回复(0)