提取的是颜色直方图 纹理灰度共生矩阵 形状是Hu7
先把代码在这里备份一个(代码风格挺舒服的)
typedef
struct
RGB
...
{
double R,G,B;
}
RGB;


typedef
struct
HSV
...
{
double H,S,V;
}
HSV;


typedef
struct
HistogramVector
...
{
int vector[72];
}
HistogramVector;


typedef
struct
GrayMatrixVector
...
{
double vector[8];
}
GrayMatrixVector;











#include
#include
"
cv.h
"
#include
"
highgui.h
"
#include
"
imageFeatureExtract.h
"
#include
using
namespace
std;



/**/
/*共现矩阵*/
int
**
PMatrixRD;
//
45度方向上的灰度共现矩阵
int
**
PMatrixLD;
//
135度方向上的灰度共现矩阵
int
**
PMatrixV;
//
90度方向上的灰度共现矩阵
int
**
PMatrixH;
//
0度方向上的灰度共现矩阵






/**/
/*颜色特征*/
double
_max(
double
a,
double
b,
double
c)
...
{
if(a>=b && a>=c) return a;
else if(b>=a && b>=c) return b;
else return c;
}



double
_min(
double
a,
double
b,
double
c)
...
{
if(a<=b && a<=c) return a;
else if(b<=a && b<=c) return b;
else return c;
}



int
RGB2HSV(RGB
*
rgb,HSV
*
hsv)
...
{
double r,g,b; // temp 
hsv->V=_max(rgb->R,rgb->G,rgb->B);
hsv->S=(hsv->V-_min(rgb->R,rgb->G,rgb->B))/hsv->V;
r=(hsv->V-rgb->R)/(hsv->V-_min(rgb->R,rgb->G,rgb->B));
g=(hsv->V-rgb->G)/(hsv->V-_min(rgb->R,rgb->G,rgb->B));
b=(hsv->V-rgb->B)/(hsv->V-_min(rgb->R,rgb->G,rgb->B));


if(rgb->R==_max(rgb->R,rgb->G,rgb->B) && rgb->G==_min(rgb->R,rgb->G,rgb->B))
...{
hsv->H=5+b;
}
else if (rgb->R==_max(rgb->R,rgb->G,rgb->B) && rgb->G!=_min(rgb->R,rgb->G,rgb->B))
...{
hsv->H=1-g;
}
else if (rgb->G==_max(rgb->R,rgb->G,rgb->B) && rgb->B==_min(rgb->R,rgb->G,rgb->B))
...{
hsv->H=1+r;
}
else if (rgb->G==_max(rgb->R,rgb->G,rgb->B) && rgb->B!=_min(rgb->R,rgb->G,rgb->B))
...{
hsv->H=3-b;
}
else if (rgb->B==_max(rgb->R,rgb->G,rgb->B) && rgb->R==_min(rgb->R,rgb->G,rgb->B))
...{
hsv->H=3+g;
}
else 
...{
hsv->H=5-r;
}
return 1;


}



int
HSV2L(HSV
*
hsv)
...
{
double h,s,v;
int H,S,V,L;
h=hsv->H;s=hsv->S;v=hsv->V;
if(h>0.2 && h<=0.4) H=1;
else if(h>0.4 && h<=0.75) H=2;
else if(h>0.75 && h<=1.55) H=3;
else if(h>1.55 && h<=1.9) H=4;
else if(h>1.9 && h<=2.7) H=5;
else if(h>2.7 && h<=2.95) H=6;
else if(h>2.95 && h<=3.15) H=7;
else H=0;


if(v>=0 && v<=0.2) V=0;
else if(v>0.2 && v<=0.7) V=1;
else V=2;


if(s>=0 && s<=0.2) S=0;
else if(s>0.2 && s<=0.7) S=1;
else S=2;


L=9*H+3*S+V;


return L;
}



int
colorFeatureExtract(
char
*
imagePath,HistogramVector
*
histogramVector)
...
{


IplImage* pImg; //声明IplImage指针
char *imageData;
unsigned char pels[3];
char *pelsIndex;
int width;
int height;
int size;
int step;


int L;


RGB rgb;
HSV hsv;
//载入图像
if((pImg = cvLoadImage(imagePath, 1)) != 0 )
...{
width=pImg->width;
height=pImg->height;
size=pImg->imageSize;
step=pImg->widthStep;
imageData=pImg->imageData;
pelsIndex=imageData;
memset(histogramVector->vector, 0, sizeof(histogramVector->vector));



for(int row=0;row ...{
for(int line=0;line ...{
pels[0]=*pelsIndex;
pels[1]=*(pelsIndex+1);
pels[2]=*(pelsIndex+2);
pelsIndex+=3;


rgb.B=pels[0]/256.0;
rgb.G=pels[1]/256.0;
rgb.R=pels[2]/256.0;


RGB2HSV(&rgb,&hsv);
L=HSV2L(&hsv);
histogramVector->vector[L]++;
//printf("%d,%d,%f,%f,%f ",row,line,hsv.H,hsv.S,hsv.V);


}
pelsIndex=imageData+step*(row+1);
}
cvReleaseImage( &pImg ); //释放图像
return 1;
}
return 0;
}








/**/
/*形状特征*/
int
shapeFeatureExtract(
char
*
imagePath,CvHuMoments
*
hu)
...
{
IplImage* oriImg;
IplImage* grayImg;
CvMoments moments;
if((oriImg = cvLoadImage(imagePath, 1)) != 0)
...{
grayImg = cvCreateImage(cvSize(oriImg->width,oriImg->height),IPL_DEPTH_8U,1);
cvCvtColor(oriImg,grayImg,CV_BGR2GRAY);
cvMoments(grayImg,&moments,0);
cvGetHuMoments(&moments, hu);


cvReleaseImage( &oriImg );
cvReleaseImage( &grayImg );


return 1;
}
return 0;
}

/**/
/*纹理特征*/



//
计算均值
double
countU(
double
array[],
int
length)
...
{
double sum =0 ;
double u;
for(int i=0; i...{
sum += array[i];
}
u=sum/length;
return u;
}
//
计算标准差
double
countSigma(
double
array[],
int
length)
...
{
double sum =0 ;
double u;
double sigma;
u=countU(array,length);
for(int i=0; i...{
sum += (array[i]-u)*(array[i]-u);
}
sigma=sqrt(sum/length);
return sigma;
}
//
初始化同现矩阵
int
initMatrix(
int
grayLayerNum)
...
{
PMatrixH = new int*[grayLayerNum];
PMatrixLD= new int*[grayLayerNum];
PMatrixRD= new int*[grayLayerNum];
PMatrixV = new int*[grayLayerNum];
for(int i=0; i...{
PMatrixH[i] = new int[grayLayerNum];
PMatrixLD[i]= new int[grayLayerNum];
PMatrixRD[i]= new int[grayLayerNum];
PMatrixV[i] = new int[grayLayerNum];
}
return 1;
}
//
销毁同现矩阵
int
destroyMatrix(
int
grayLayerNum)
...
{
for(int i=0; i...{
delete[] PMatrixH[i];
delete[] PMatrixLD[i];
delete[] PMatrixRD[i];
delete[] PMatrixV[i];
}
delete[] PMatrixH;
delete[] PMatrixLD;
delete[] PMatrixRD;
delete[] PMatrixV;
return 1;
}




//
计算同现矩阵
int
computeMatrix(IplImage
*
pImg,
int
grayLayerNum,
int
distance)
...
{
int i,j;
unsigned char **NewImage;
int width=pImg->width;
int height=pImg->height;
int step=pImg->widthStep;
unsigned char * imageData=(unsigned char *)pImg->imageData;
//初始化NewImage
NewImage = new unsigned char *[height];


for(i=0; i NewImage[i] = new unsigned char[width];



for(i=0; i...{
for(j=0; j ...{
//分成GrayLayerNum个灰度级
NewImage[i][j] = imageData[(i*step+j)] / (256/grayLayerNum);
}
}


//同现矩阵清0
for(i=0; i...{
for(j=0; j ...{
PMatrixH[i][j] = 0;
PMatrixLD[i][j] = 0;
PMatrixRD[i][j] = 0;
PMatrixV[i][j] = 0;
}
}


//计算0度的灰度共现阵
for(i=0; i...{
for(j=0; j ...{
PMatrixH[(unsigned int)NewImage[i][j]][(unsigned int)NewImage[i][j+distance]] += 1;
PMatrixH[(unsigned int)NewImage[i][j+distance]][(unsigned int)NewImage[i][j]] += 1;
}
}


//计算90度的灰度共现阵
for(i=0; i...{
for(j=0; j ...{
PMatrixV[(unsigned int)NewImage[i][j]][(unsigned int)NewImage[i+distance][j]] += 1;
PMatrixV[(unsigned int)NewImage[i+distance][j]][(unsigned int)NewImage[i][j]] += 1;
}
}


//计算135度的灰度共现阵
for(i=0; i...{
for(j=0; j ...{
int newi, newj;
newi = i+distance;
newj = j+distance;
PMatrixLD[(unsigned int)NewImage[i][j]][(unsigned int)NewImage[newi][newj]] += 1;
PMatrixLD[(unsigned int)NewImage[newi][newj]][(unsigned int)NewImage[i][j]] += 1;
}
}


//计算45度的灰度共现阵
for(i=distance; i...{
for(j=0; j ...{
int newi, newj;
newi = i-distance;
newj = j+distance;
PMatrixRD[(unsigned int)NewImage[i][j]][(unsigned int)NewImage[newi][newj]] += 1;
PMatrixRD[(unsigned int)NewImage[newi][newj]][(unsigned int)NewImage[i][j]] += 1;
}
}


//销毁NewImage
for(i=0; i delete[] NewImage[i];
delete[] NewImage;


return 1;
}



//
计算特征参数
int
computeFeature(
double
*
featureCON,
double
*
featureASM,
double
*
featureNET,
double
*
featureCOR,
int
**
pMatrix,
int
dim)
...
{
int i,j;
double **pdMatrix;
//初始化pdMatrix
pdMatrix = new double*[dim];
for(i=0; i pdMatrix[i] = new double[dim];


int total = 0;
for(i=0; i...{
for(j=0; j ...{
total += pMatrix[i][j];
}
}



for(i=0; i...{
for(j=0; j ...{
pdMatrix[i][j] = (double)pMatrix[i][j]/(double)total;
}
}
*featureCON = 0.0;
*featureASM = 0.0;
*featureNET = 0.0;
*featureCOR = 0.0;



//计算反差、能量、熵
for(i=0; i...{
for(j=0; j ...{
//反差
*featureCON += (i-j)*(i-j)*pdMatrix[i][j]*pdMatrix[i][j];
//能量
*featureASM += pdMatrix[i][j]*pdMatrix[i][j];
//熵
if(pdMatrix[i][j]>1e-12)
...{
*featureNET -= pdMatrix[i][j]*log(pdMatrix[i][j]);
}
}
}
/**//*
//计算ux,sigmax
double ux = 0.0;
double sigmax = 0.0;
double * array = 0;
array =new double[dim] ;
memset(array,0,sizeof(double)*dim);
for(i=0; i{
for(j=0; j {
array[i] += pdMatrix[i][j];
}
}
ux=countU(array,dim);
sigmax=countSigma(array,dim);
//计算uy,sigmay
double uy = 0.0;
double sigmay = 0.0;
memset(array,0,sizeof(double)*dim);
for(j=0; j{
for(i=0; i {
array[j] += pdMatrix[i][j];
}
}
uy=countU(array,dim);
sigmay=countSigma(array,dim);
//计算相关
for(i=0; i{
for(j=0; j {
*featureCOR += pdMatrix[i][j]*i*j;
}
}


*featureCOR -=ux*uy;
*featureCOR /= sigmax;
*featureCOR /= sigmay;
*/


//计算ux
double ux = 0.0;
double localtotal = 0.0;
for(i=0; i...{
localtotal = 0.0;
for(j=0; j ...{
localtotal += pdMatrix[i][j];
}
ux += (double)i * localtotal;
}


//计算uy
double uy = 0.0;
for(j=0; j...{
localtotal = 0.0;
for(i=0; i ...{
localtotal += pdMatrix[i][j];
}
uy += (double)j * localtotal;
}


//计算sigmax
double sigmax = 0.0;
for(i=0; i...{
localtotal = 0.0;
for(j=0; j ...{
localtotal += pdMatrix[i][j];
}
sigmax += (double)(i-ux) * (double)(i-ux) * localtotal;
}


//计算sigmay
double sigmay = 0.0;
for(j=0; j...{
localtotal = 0.0;
for(i=0; i ...{
localtotal += pdMatrix[i][j];
}
sigmay += (double)(j-uy) * (double)(j-uy) * localtotal;
}


//计算相关
for(i=0; i...{
for(j=0; j ...{
*featureCOR += (double)(i-ux) * (double)(j-uy) * pdMatrix[i][j];
}
}
*featureCOR /= sigmax;
*featureCOR /= sigmay;



//销毁pdMatrix
for(i=0; i delete[] pdMatrix[i];
delete[] pdMatrix;


return 1;
}



int
computeFeatureVector(IplImage
*
pImg,GrayMatrixVector
*
grayMatrixVector)
...
{
double featureCON[4],featureASM[4],featureNET[4],featureCOR[4];
memset(grayMatrixVector->vector, 0, sizeof(grayMatrixVector->vector));
computeMatrix(pImg,64,1);
computeFeature(&featureCON[0],&featureASM[0],&featureNET[0],&featureCOR[0],PMatrixH,64);
computeFeature(&featureCON[1],&featureASM[1],&featureNET[1],&featureCOR[1],PMatrixV,64);
computeFeature(&featureCON[2],&featureASM[2],&featureNET[2],&featureCOR[2],PMatrixLD,64);
computeFeature(&featureCON[3],&featureASM[3],&featureNET[3],&featureCOR[3],PMatrixRD,64);


grayMatrixVector->vector[0]=countU(featureCON,4);
grayMatrixVector->vector[1]=countSigma(featureCON,4);
grayMatrixVector->vector[2]=countU(featureASM,4);
grayMatrixVector->vector[3]=countSigma(featureASM,4);
grayMatrixVector->vector[4]=countU(featureNET,4);
grayMatrixVector->vector[5]=countSigma(featureNET,4);
grayMatrixVector->vector[6]=countU(featureCOR,4);
grayMatrixVector->vector[7]=countSigma(featureCOR,4);


return 1;


}



int
textureFeatureExtract(
char
*
imagePath,GrayMatrixVector
*
grayMatrixVector)
...
{
IplImage* oriImg;
IplImage* grayImg;
if((oriImg = cvLoadImage(imagePath, 1)) != 0)
...{
grayImg = cvCreateImage(cvSize(oriImg->width,oriImg->height),IPL_DEPTH_8U,1);
cvCvtColor(oriImg,grayImg,CV_BGR2GRAY);
computeFeatureVector(grayImg,grayMatrixVector);
cvReleaseImage( &oriImg );
cvReleaseImage( &grayImg );
return 1;
}
return 0;
}



int
main(
int
argc,
char
**
argv )
...
{
CvHuMoments hu;



shapeFeatureExtract(argv[1],&hu);
cout<<hu.hu1<<' '<<hu.hu2<<' '<<hu.hu3<<' '<<hu.hu4<<' '<<hu.hu5<<' '<<hu.hu6<<' '< 


/**//*HistogramVector histogramVector;
colorFeatureExtract(argv[1],&histogramVector);
for(int i=0;i<71;i++)
{
cout<}*/

/**//*GrayMatrixVector grayMatrixVector;
initMatrix(64);
textureFeatureExtract(argv[1],&grayMatrixVector);
for(int i=0;i<8;i++)
{
cout<}
destroyMatrix(64);*/



return 1;



}

本文介绍了一种图像特征提取的方法,包括颜色特征、形状特征及纹理特征的提取过程。颜色特征通过RGB到HSV颜色空间转换来获取,形状特征利用Hu不变矩进行计算,而纹理特征则通过灰度共生矩阵提取反差、能量等属性。
280

被折叠的 条评论
为什么被折叠?



