LBP

#include<iostream>
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\opencv.hpp>

using namespace std;
using namespace cv;

class LBP_Common{
private:
    Mat image;
    Mat LBP_image;
public:
    LBP_Common(Mat src);
    void LBP_Pixel();   //循环计算每个像素的LBP值;
    void Image_Show();  //图像显示;
    Mat GetImage();     //输出LBP图片;
};

LBP_Common::LBP_Common(Mat src){
    image = src;
}

void LBP_Common::LBP_Pixel(){
    //LBP_image = image;
    int row = image.rows;       //获取图像的行;
    int col = image.cols;      //获取每一行的元素;

    Mat P(row, col, CV_8U, Scalar(255));

    //遍历图中每一个像素,并对像素进行操作;
    for (int i = 1; i < row - 1; i++){
        for (int j = 1; j < col - 1; j++){
            int pixel = 0;
            if (image.at<uchar>(i - 1, j - 1)>image.at<uchar>(i, j)){
                pixel = pixel*2 + 1;
            }
            else{
                pixel = pixel *2 + 0;
            }

            if (image.at<uchar>(i-1, j)>image.at<uchar>(i, j)){
                pixel = pixel *2 + 1;
            }
            else{
                pixel = pixel *2 + 0;
            }

            if (image.at<uchar>(i - 1, j + 1)>image.at<uchar>(i, j)){
                pixel = pixel *2 + 1;
            }
            else{
                pixel = pixel *2 + 0;
            }

            if (image.at<uchar>(i , j + 1)>image.at<uchar>(i, j)){
                pixel = pixel *2 + 1;
            }
            else{
                pixel = pixel *2 + 0;
            }

            if (image.at<uchar>(i + 1, j + 1)>image.at<uchar>(i, j)){
                pixel = pixel *2 + 1;
            }
            else{
                pixel = pixel *2 + 0;
            }

            if (image.at<uchar>(i + 1, j )>image.at<uchar>(i, j)){
                pixel = pixel *2 + 1;
            }
            else{
                pixel = pixel *2 + 0;
            }

            if (image.at<uchar>(i + 1, j - 1)>image.at<uchar>(i, j)){
                pixel = pixel *2 + 1;
            }
            else{
                pixel = pixel *2 + 0;
            }

            if (image.at<uchar>(i , j - 1)>image.at<uchar>(i, j)){
                pixel = pixel *2 + 1;
            }
            else{
                pixel = pixel *2 + 0;
            }
            P.at<uchar>(i, j) = pixel;

        }
    }
    LBP_image = P;
}

void LBP_Common::Image_Show(){
    namedWindow("src_Image", 1);
    imshow("src_Image", image);
    namedWindow("LBP_Image", 1);
    imshow("LBP_Image", LBP_image);
}

Mat LBP_Common::GetImage(){
    return LBP_image;
}

class HistoGram_Image{
private:
    Mat image;
    MatND hist;

    //直方图的相关数据:
    int histSize[1];          //维度数;
    float hranges[2];         //像素的最大值和最小值;
    const float *ranges[1];
    int channels[1];          //单通道;
public:
    HistoGram_Image(Mat src);
    MatND GetHistgram();     //获得直方图数据;
    Mat Draw_Histgram();   //绘制直方图;
};

HistoGram_Image::HistoGram_Image(Mat src){
    image = src;
    histSize[0] = 256;
    hranges[0] = 0.0;
    hranges[1] = 255.0;
    channels[0] = 0;
    ranges[0] = hranges;
}

MatND HistoGram_Image::GetHistgram(){
    MatND Hist;
    calcHist(&image,         //输入图片;
              1,             //计算单张图片的直方图;
              channels,      //通道数;
              Mat(),         //不使用图像作为掩码;
              Hist,          //返回的直方图数据;
              1,             //1维直方图;
              histSize,      //维数的大小;
              ranges         //像素的大小范围;
            );

    return Hist;
}

Mat HistoGram_Image::Draw_Histgram(){
    hist = GetHistgram();
    Mat hist_Image(histSize[0], histSize[0], CV_8U, Scalar(255));
    double MaxVal;
    double MinVal;
    minMaxLoc(hist, &MinVal, &MaxVal, 0, 0);
    int hpt = static_cast<int>(0.9*histSize[0]);   //设置最高点为nbins的90%;
    for (int i = 0; i < histSize[0]; i++){
        float binVal = hist.at<float>(i);
        int intensity = static_cast<int>(binVal*hpt / MaxVal);
        //绘制两点之间的直线;
        line(hist_Image, Point(i,histSize[0]), Point(i,histSize[0] - intensity), Scalar::all(0));
    }
    return hist_Image;

}

int main(){
    Mat src = imread("F:/3.jpg", 1);
    if (src.empty() ){
        cout << "图片输入错误";
        return -1;
    }
    Mat dist;
    Mat hist_image;
    cvtColor(src, dist, COLOR_BGR2GRAY);
    LBP_Common LBP(dist);
    LBP.LBP_Pixel();
    LBP.Image_Show();
    HistoGram_Image Hist(LBP.GetImage());
    hist_image = Hist.Draw_Histgram();
    namedWindow("hist_image", 1);
    imshow("hist_image", hist_image);
    waitKey(0);
    return 0;
}
时间: 2024-10-06 03:31:05

LBP的相关文章

CV:object detection(LBP)

LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子:它具有旋转不变性和灰度不变性等显著的优点.它是首先由T. Ojala, M.Pietik?inen, 和 D. Harwood 在1994年提出,用于纹理特征提取.而且,提取的特征是图像的局部的纹理特征: 1.LBP特征的描述 原始的LBP算子定义为在3*3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0.这样

LBP特征提取实现

捯饬了一两天才搞好! 在lbp.m下输入下面代码,运行结果如图: 代码: I=imread('rice.png'); mapping=getmapping(8,'u2'); H1=lbp(I,1,8,mapping,'h'); %LBP histogram in (8,1) neighborhood %using uniform patterns subplot(2,1,1),stem(H1); H2=lbp(I); subplot(2,1,2),stem(H2); SP=[-1 -1; -1

转载:LBP的初步理解

转自http://blog.csdn.net/ty101/article/details/8905394 本文的PDF版本,以及涉及到的所有文献和代码可以到下列地址下载: 1.PDF版本以及文献:http://download.csdn.net/detail/ty101/5349816 2.原作者的MATLAB代码:http://download.csdn.net/detail/ty101/5349894 LBP一种用来描述图像纹理特征的算子,该算子由芬兰奥卢大学的T.Ojala等人在1996年

得到LBP特征值图

// 得到 LBP纹理特征值图 // 参数: // src 为单通道灰度图 // dst 为目标图 // 返回值: // 返回ture 表示运行正常 // 返回false 表示运行出错 bool GetLBPFeatureImage(IplImage *src, IplImage *dst) { if (! src || ! dst) return false; // 获取图像信息 const int height = src->height; const int width = src->w

简述人脸特异性识别&amp;&amp;一个基于LBP和SVM的人脸识别小例子

原谅我用图片,MAC在Safari里给文章进行图文排版太麻烦啦~ 本文适合初入计算机视觉和模式识别方向的同学们观看~ 文章写得匆忙,加上博主所知甚少,有不妥和勘误请指出并多多包涵. 本文Demo的代码由HZK编写,特征点由月神和YK选择和训练. 转载请注明 copyleft by sciencefans, 2014 为了方便大家学习,附上高维LBP的核心代码 1 ################################################### 2 # 3 # 4 # NO

openCV+ASM+LBP+Gabor实现人脸识别(GT人脸库)

原理:使用GT人脸库做样本,VS2010下使用openCV2.44自带的Haar算法检測人脸区域,ASM Library特征检測,然后使用YCrCb颜色空间做肤色检測,再用LBP+Gabor小波提取特征,最小邻近距离做分类识别. 1.GT人脸库 Georgia Tech face database,网址:http://www.anefian.com/research/face_reco.htm GT人脸库包括50个人,每人15张不同角度.不同表情的正面照片. 图片为JPG格式,640*480,大

图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

(一)HOG特征 1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和统计图像局部区域的梯度方向直方图来构成特征.Hog特征结合 SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功.需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal 在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM

圆形领域LBP特征

今天师兄给了我一个博士写的LBP特征源码.上网搜索了一些资料,并结合代码,大致有了思路. 原始LBP特征是根据相邻的像素点与中间相邻点相比的大小确定置为1或0,然后对每个像素点的领域信息进行整合,变为领域个位的数的编码.然后对一个块中所有像素的编码进行直方图的统计,得到LBP特征. 圆形LBP特征就是在每一个像素点周围用圆形区域进行编码采样,其余和原始LBP特征相同. 这里有图,说的更加明白 http://blog.csdn.net/dujian996099665/article/details

图像提取特LBP征

LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子:它具有旋转不变性和灰度不变性等显著的优点.它是首先由T. Ojala, M.Pietik?inen, 和D. Harwood 在1994年提出,用于纹理特征提取.而且,提取的特征是图像的局部的纹理特征: 1.LBP特征的描述 原始的LBP算子定义为在3*3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素 点的位置被标记为1,否则为0.这样