#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; }