首页 > 代码库 > LBP
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;}
LBP
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。