LBP
2017-05-03 00:17
239 查看
#include <opencv2/opencv.hpp> #include <iostream> #include <sstream> using namespace std; using namespace cv; using namespace cv::ml; //LBP local binary pattern //是一种局部纹理提取,纹理分析和人脸检测 int GetTranslate(int num) { int data[8];//保存每个数据 memset(data, 0, sizeof(int)* 8); int k = 7; while (num) { data[k] = num % 2; num /= 2; --k; } int total = 0;//条件总数 for (int i = 0; i < 8;++i) { total += (data[i] != data[(i + 1) % 8]); } return total; } int main() { //文件路径的前缀 string PrePath = "C:/Users/GuSheng/Desktop/photo/lena.jpg"; //读取影像 Mat img = imread(PrePath, IMREAD_GRAYSCALE); imshow("Orign", img); int Width = img.cols; int Height = img.rows; if (img.empty()) { return -1; } //复制制造边界------为了处理边界问题 copyMakeBorder(img, img, 1, 1, 1, 1,BORDER_REFLECT101); //结果影像 Mat des = Mat::zeros(img.size(), CV_8UC1); int Hist[256]; memset(Hist, 0, sizeof(int)* 256); int total = 0;//小于等于2的跳变个数 for (int i = 0; i < 256;++i) { if (GetTranslate(i)<=2) { Hist[i] = i; ++total; } else { Hist[i] = -1; } } cout << "total translate:" << total << endl; for (int i = 1; i < img.rows - 1;++i) { for (int j = 1; j < img.cols - 1; ++j) { unsigned char temp = 0; unsigned char center = img.at<uchar>(i, j); temp |= (img.at<uchar>(i - 1, j - 1)>center) << 7; temp |= (img.at<uchar>(i - 1, j)>center) << 6; temp |= (img.at<uchar>(i - 1, j + 1) > center) << 5; temp |= (img.at<uchar>(i, j - 1) > center) << 4; temp |= (img.at<uchar>(i, j + 1)>center) << 3; temp |= (img.at<uchar>(i + 1, j - 1) > center) << 2; temp |= (img.at<uchar>(i + 1, j) > center) << 1; temp |= (img.at<uchar>(i + 1, j + 1) > center); //des.at<uchar>(i, j) = temp;//这是正常格式的LBP if (Hist[temp]!=-1) { ++Hist[temp];//用来统计直方图 des.at<uchar>(i, j) = Hist[temp]; } } } //缩小直方图的bin个数 for (int i = 0,k=0; i < 256;++i) { if (Hist[i]!=-1) { Hist[k++] = Hist[i]; } } //将数据转换为Mat结构 Mat histMat = Mat(1, 58, CV_32SC1, Hist); histMat.convertTo(histMat, CV_32FC1); normalize(histMat,histMat, 0, 1, NORM_MINMAX);//进行归一化处理 //这个就可以交给SVM处理了-------不过在此之前需要将影像进行分块处理 double MaxValue, MinValue; Point Maxid, Minid; minMaxLoc(histMat, &MinValue, &MaxValue, &Minid, &Maxid); //将直方图显示出来 Mat result = Mat::zeros(400, 58*8, CV_8UC3); int bin = 8; for (int i = 1; i < 58;++i) { line(result, Point(bin*(i-1), 400 - 400 * histMat.at<float>(i-1)), Point(bin*i, 400 - 400 * histMat.at<float>(i)), Scalar(0, 255, 0), 1, CV_AA); } imshow("Hist", result); des = des(Rect(1, 1, Width, Height)); imshow("LBP-Normal", des); imwrite("LBP-unique.jpg", des); waitKey(0); return 0; }
相关文章推荐
- LBP纹理特征
- matlab学习:人脸识别之LBP (Local Binary Pattern)
- LBP详解
- 局部二值模式(LBP)中间过程的可视化
- 图像特征提取1: LBP特征
- LBP源代码阅读
- LBP特征及其一些变种
- 特征提取->LBP特征(1)
- LBP
- 图像特征提取之(二)LBP特征(理论知识)
- 目标检测的图像特征提取之(二)LBP特征
- 目标检测的图像特征提取之(二)LBP特征
- 特征描述之LBP
- LBP及其实现的人脸识别
- LBP纹理提取 C++实现
- 【计算机视觉】OpenCV人脸识别facerec源码分析2——LBPH概述
- 基于OpenCV的EigenFace FisherFace LBPHFace人脸识别的实现
- 图像特征提取三大法宝:HOG特征,LBP特征,Haar特征
- LBP特征
- LBP纹理图的提取