|
|
【答案】应助回帖
这是普通的灰度共生矩阵代码,也是参考网上的,楼主看看有没有帮助。
// 求均值
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]);
} |
|