// 123.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "windows.h"
void gLbpImage(unsigned char *srcData, unsigned char *lbpData, int width, int height)
{
int w,h;
w = width;
h = height;
double *pInterData;
pInterData = new double[w*h];
double minInterData,maxInterData;
minInterData = 1000;
maxInterData =-1000;
unsigned char *PLbpData;
unsigned char *PTempImgData;
PLbpData = lbpData;
PTempImgData = srcData;
int i,j;
int pixelPos;
int tempPixelPos;
int iTemp,jTemp;
unsigned char totalGray;
unsigned char tempGray;
unsigned char tempCenterGray;
int pixelPosY;
pixelPosY = 0;
int tempPixelPosY;
for(j=0;j<h;j++)
{
for(i=0;i<w;i++)
{
//pixelPos = j*w+i;
pixelPos = pixelPosY+i;
if(i==0||i==w-1||j==0||j==h-1)
{
PLbpData[pixelPos] = PTempImgData[pixelPos];
pInterData[pixelPos] = PTempImgData[pixelPos]*2;
continue;
}
tempCenterGray = PTempImgData[pixelPos];
totalGray = 0;
tempPixelPosY = (j-1)*w;
for(jTemp=j-1;jTemp<=j+1;jTemp++)
{
for(iTemp=i-1;iTemp<=i+1;iTemp++)
{
//tempPixelPos = jTemp*w+iTemp;
tempPixelPos = tempPixelPosY+iTemp;
tempGray = PTempImgData[tempPixelPos];
if(iTemp==i-1&&jTemp==j-1)//g1
{
if(tempGray>=tempCenterGray)
totalGray += 1;
}
if(iTemp==i&&jTemp==j-1)//g2
{
if(tempGray>=tempCenterGray)
totalGray += 2;
}
if(iTemp==i+1&&jTemp==j-1)//g3
{
if(tempGray>=tempCenterGray)
totalGray += 4;
}
if(iTemp==i-1&&jTemp==j)//g4
{
if(tempGray>=tempCenterGray)
totalGray += 8;
}
if(iTemp==i+1&&jTemp==j)//g5
{
if(tempGray>=tempCenterGray)
totalGray += 16;
}
if(iTemp==i-1&&jTemp==j+1)//g6
{
if(tempGray>=tempCenterGray)
totalGray += 32;
}
if(iTemp==i&&jTemp==j+1)//g7
{
if(tempGray>=tempCenterGray)
totalGray += 64;
}
if(iTemp==i+1&&jTemp==j+1)//g8
{
if(tempGray>=tempCenterGray)
totalGray += 128;
}
}
tempPixelPosY += w;
}
PLbpData[pixelPos] = unsigned char(totalGray);
//PLbpData[pixelPos] = BYTE((totalGray+tempCenterGray)*0.5);
pInterData[pixelPos] = totalGray+tempCenterGray;
if(pInterData[pixelPos]<minInterData)
minInterData = pInterData[pixelPos];
if(pInterData[pixelPos]>maxInterData)
maxInterData = pInterData[pixelPos];
}
pixelPosY+=w;
}
double coef;
coef = 255.0/(maxInterData-minInterData);
delete pInterData;
return;
}
double creattemplate(unsigned char *data, short int *data1, int nDim, int partsizex, int partsizey, int wzhang, int hzhang)
{
float sum = 0.0;//,tempsum;
//int teml;
int *his;//
his = new int[nDim];
int ww = wzhang;
int hh = hzhang;
int lamda = partsizex ; //8
int lamda1 = partsizey;
int subpart = wzhang/partsizex; //8
int subpart1 = hzhang/partsizey;
int size = 0;
int lianghua = 256/nDim;//
int indexsize = 0 ;
for (int ui = 0 ; ui < 1 ; ui ++){//
int partxxx = 0;
for (int subpartx = 1 ; subpartx < (subpart + 1); subpartx ++){
for (int subparty = 1 ; subparty < (subpart1 + 1); subparty ++){
memset(his,0,nDim * sizeof(int));
int subii;
int sub_partn =1 ;
for ( subii = 0 ; subii < sub_partn; subii ++){
memset(his,0,nDim * sizeof(int));
for (int party = subii * (partsizey/sub_partn) ; party < (subii+1) * (partsizey/sub_partn) ; party ++)//遍历一个8*8子区域?
for (int partx = 0 ; partx < partsizex ; partx ++){
int x = (subpartx - 1 ) * lamda + partx ;
int y = (subparty - 1 ) * lamda1 + party ;
//if ((x< wzhang)&&(y < hzhang))
long index = y* (ww) + x;
index = ui* (ww*hh) + index;
his[data[index]/lianghua] = his[data[index]/lianghua] + 1;
}
for (int featurei = 0 ; featurei < nDim; featurei ++){
data1[indexsize] = his[featurei];
indexsize++;
// regionfeature[_index][regionindex[_index]++] = BYTE(his[featurei]);
}
}
// _index ++;
}
}
}
delete his;
return( 1);
}
void main(){
//传入函数
unsigned char*srcData;//图像数据一维数组,长度bmpWidth*bmpHeight
int bmpWidth;// 图像长度
int bmpHeight;//图像高度
int partxx;//子块宽度 对图像分块提取lbp特征时赋值,如果不分块,partxx=partyy=1
int partyy;//子块高度
int bin;//直方图量化程度
//////////////////////////////////////////////////////////
int len;
short int*histogramzhang;
unsigned char* LbpData=new unsigned char[bmpWidth* bmpHeight];
gLbpImage(srcData,LbpData,bmpWidth,bmpHeight);
len = (bmpWidth/partxx)*(bmpHeight/partyy) * bin;
histogramzhang = new short int[len];
creattemplate(LbpData, histogramzhang,bin,partxx, partyy,bmpWidth, bmpHeight);
delete []srcData;
delete []LbpData;
delete []histogramzhang;
}