• 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;
    }
  • 相关阅读:
    ActiveSync合作关系对话框的配置
    WINCE对象存储区(object store)
    Wince 隐藏TASKBAR的方法
    Wince输入法换肤换语言机制
    poj 3080 Blue Jeans 解题报告
    codeforces A. Vasily the Bear and Triangle 解题报告
    hdu 1050 Moving Tables 解题报告
    hdu 1113 Word Amalgamation 解题报告
    codeforces A. IQ Test 解题报告
    poj 1007 DNA Sorting 解题报告
  • 原文地址:https://www.cnblogs.com/code-wangjun/p/5843383.html
Copyright © 2020-2023  润新知