|
|
¡¾´ð°¸¡¿Ó¦Öú»ØÌû
ÕâÊÇÆÕͨµÄ»Ò¶È¹²Éú¾ØÕó´úÂ룬ҲÊDzο¼ÍøÉϵģ¬Â¥Ö÷¿´¿´ÓÐûÓаïÖú¡£
// Çó¾ùÖµ
double GetMean(double m[4])
{
double nmean=0,sum=0;
sum = m[0]+m[1]+m[2]+m[3];
nmean = sum/4;
return nmean;
}
// Çó·½²î
double GetSdDe(double m[4],double nmean)
{
int i;
double stde,sum=0;
for (i=0;i<4;i++)
{
sum+=((m-nmean)*(m-nmean));
}
sum/=4;
stde=sqrt(sum);
return stde;
}
// ¼ÆËã»Ò¶È¹²Éú¾ØÕó
void GetGLCM(Mat mat_double, double glcm[8])
{
double minvalue=0.0,maxvalue=0.0;
int nW,nH;
int j,i,n,m,dim;
nW = mat_double.cols;
nH = mat_double.rows;
// ½«Í¼ÏñÁ¿»¯ÖÁ0-255
Mat mat_uchar = Mat(nW,nH,CV_8UC1);
minMaxLoc(mat_double, &minvalue, &maxvalue);
mat_double.convertTo(mat_uchar, CV_8UC1, 255/(maxvalue-minvalue), -minvalue);
// ΪÁ˼õÉÙ¼ÆËãÁ¿£¬½«ÔʼͼÏñ0-255Á¿»¯³É16¼¶£¬£¨0,15£©Îª1£¬£¨16,31£©Îª2
for(i=0;i<nH;i++)
for(j=0;j<nW;j++)
for(n=0;n<16;n++)
{
uchar temp = mat_uchar.at<uchar>(i,j);
if((n*16<=temp)&&(temp<=n*16+15))
mat_uchar.at<uchar>(i,j) = n;
}
// ¼ÆËãËĸö¹²Éú¾ØÕóP,È¡¾àÀëΪ1£¬½Ç¶È·Ö±ðΪ 0,45,90,135
Mat mat_co[4];
for (dim=0;dim<4;dim++)
{
mat_co[dim] = Mat::zeros(16,16,CV_64FC1);
}
int delta[4][2] = {{0,1}, {-1,1}, {1,0}, {1,1}};
int p = 0;
int x, y;
for (int i = 0; i < nH; i++)
{
for (int j = 0; j < nW; j++)
{
x = mat_uchar.at<uchar>(i,j);
for (p = 0; p < 4; p++)
{
if (j + delta[p][0] < nW && j + delta[p][0] >= 0 && i + delta[p][1] < nH && i + delta[p][1] >= 0)
{
y = mat_uchar.at<uchar>(i+delta[p][1],j+delta[p][0]);
mat_co[p].at<double>(x,y) += 1.0;
mat_co[p].at<double>(y,x) += 1.0;
}
}
}
}
// ¹éÒ»»¯¹²Éú¾ØÕó
Mat temp_mat = Mat(16,16,CV_64FC1);
for (dim=0; dim<4; dim++)
{
Scalar sum_value = sum(mat_co[dim]);
temp_mat.setTo(sum_value);
divide(mat_co[dim],temp_mat,mat_co[dim]);
}
// ¶Ô¹²Éú¾ØÕó¼ÆËãÄÜÁ¿¡¢ìØ¡¢¹ßÐԾء¢Ïà¹Ø4¸öÎÆÀí²ÎÊý
double energy[4]={0}; //ÄÜÁ¿
double entropy[4]={0}; //ìØ
double inertia[4]={0}; //¹ßÐÔ¾Ø
double uX[4]={0};/*Ïà¹ØÐÔÖЦÌx*/ double uY[4]={0};/*Ïà¹ØÐÔÖЦÌy*/
double deltaX[4]={0};/*Ïà¹ØÐÔÖЦÒx*/ double deltaY[4]={0};/*Ïà¹ØÐÔÖЦÒy*/
double corelation[4]={0}; //Ïà¹ØÐÔ
Scalar temp_energy[4]; //ÄÜÁ¿
Mat mat_energy[4];
for (dim=0; dim<4; dim++)
{
mat_energy[dim] = Mat(16,16,CV_64FC1);
multiply(mat_co[dim], mat_co[dim], mat_energy[dim]);
temp_energy[dim] = sum(mat_energy[dim]); //ÇóÄÜÁ¿
energy[dim] = temp_energy[dim].val[0];
}
for (dim=0; dim<4; dim++)
{
for (m=0;m<16;m++)
{
for(n=0;n<16;n++)
{
double temp = mat_co[dim].at<double>(m,n);
if (temp!=0)
{
entropy[dim] = temp*log(temp)+entropy[dim]; //ìØ
}
inertia[dim] = (m-n)*(m-n)*temp+inertia[dim]; //¹ßÐÔ¾Ø
uX[dim] = n*temp+uX[dim]; //Ïà¹ØÐÔÖЦÌx
uY[dim] = n*temp+uY[dim]; //Ïà¹ØÐÔÖЦÌy
}
}
}
for (dim=0;dim<4;dim++)
{
for (m=0;m<16;m++)
{
for (n=0;n<16;n++)
{
double temp = mat_co[dim].at<double>(m,n);
deltaX[dim] = (m-uX[dim])*(m-uX[dim])*temp+deltaX[dim]; //Ïà¹ØÐÔÖЦÒx
deltaY[dim] = (n-uY[dim])*(n-uY[dim])*temp+deltaY[dim]; //Ïà¹ØÐÔÖЦÒy
corelation[dim] = m*n*temp+corelation[dim];
}
}
corelation[dim] = (corelation[dim]-uX[dim]*uY[dim])/deltaX[dim]/deltaY[dim]; //Ïà¹ØÐÔ
}
// ÇóÄÜÁ¿¡¢ìØ¡¢¹ßÐԾء¢Ïà¹ØµÄ¾ùÖµºÍ±ê×¼²î×÷Ϊ×îÖÕ8Î¬ÎÆÀíÌØÕ÷
glcm[0] = GetMean(energy);
glcm[1] = GetSdDe(energy,glcm[0]);
glcm[2] = GetMean(entropy);
glcm[3] = GetSdDe(entropy,glcm[2]);
glcm[4] = GetMean(inertia);
glcm[5] = GetSdDe(inertia,glcm[4]);
glcm[6] = GetMean(corelation);
glcm[7] = GetSdDe(corelation,glcm[6]);
} |
|