LBP

#include<iostream>
#include<opencv2corecore.hpp>
#include<opencv2highguihighgui.hpp>
#include<opencv2opencv.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;
}
原文地址:https://www.cnblogs.com/code-wangjun/p/5843383.html