您的位置:首页 > 其它

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